এসকিউএল ঘোষিত হয়?


22

আমি জিজ্ঞাসা করি কারণ এসকিউএল-তে আমি যে পরিমাণ অনেক প্রশ্ন দেখি সেটির পরিমাণ: "এটি ধীর গতির I আমি কীভাবে এটি দ্রুত করব"? বা টিউটোরিয়ালগুলি উল্লেখ করছে যে "এটি এইভাবে করুন এবং এটি তত দ্রুত হয় না"।

আমার কাছে মনে হয় এসকিউএল-র একটি বৃহত অংশ কেবল কীভাবে একটি অভিব্যক্তি সম্পাদন করবে তা জানে এবং সেই জ্ঞানটি থেকে আরও ভাল সঞ্চালনকারী এক্সপ্রেশন স্টাইলগুলি বেছে নেওয়া হয়। এটি ঘোষণামূলক প্রোগ্রামিংয়ের একটি দিকের সাথে বর্গক্ষেত্র নয় - গণনাটি কীভাবে করা উচিত তা সুনির্দিষ্ট করে আপনার কীভাবে গণনাটি সম্পাদন করা যায় তা ঠিক করার জন্য সিস্টেমটি ছেড়ে যাওয়া।

কোনও এসকিউএল ইঞ্জিন ব্যবহার করা উচিত কিনা সে বিষয়ে চিন্তা করা উচিত নয় in, existsবা joinএটি সত্যিকারের ঘোষণামূলক হলে এটি কেবল তিনটি পদ্ধতির দ্বারা সম্ভব হলে যুক্তিসঙ্গত সময়ে সঠিক উত্তরটি দেওয়া উচিত নয়? এই শেষ উদাহরণটি এই সাম্প্রতিক পোস্টের দ্বারা উত্সাহিত করা হবে যা আমার প্রারম্ভিক অনুচ্ছেদে উল্লিখিত ধরণের।

ইনডেক্সে

আমার ধারণা আমি সবচেয়ে সহজ উদাহরণটি টেবিলের জন্য একটি সূচক তৈরির সাথে ব্যবহার করতে পারি। এখানে w3schools.com এ গাম্ফ এমনকি এটি ব্যবহারকারীর কারণে অদৃশ্য কিছু হিসাবে ব্যাখ্যা করার চেষ্টা করে যা কার্য সম্পাদনের কারণে রয়েছে। তাদের বিবরণটি অ-ঘোষণামূলক শিবিরে এসকিউএল সূচকগুলি রেখেছিল এবং খাঁটি পারফরম্যান্সের কারণে এগুলি নিয়মিত হাতে যুক্ত করা হয়।

এটি কি কেস যে তাদের কোথাও একটি আদর্শ এসকিউএল ডিবি যা বাকী সমস্ত তুলনায় অনেক বেশি ঘোষিত তবে এটি ভাল কারণ এটি শুনতে পায় না?


@ ফ্রাস্ট্রেটেড উইথফর্মস ডিজাইনার: আমি এর অর্থটি ঠিক জানি। select whatever from sometable where FKValue in (select FKValue from sometable_2 where other_value = :param)। এটি কীভাবে একটি existsবা একটি দিয়ে পুনরায় সেট করা যায় তা দেখতে তুচ্ছ হওয়া উচিত join
ম্যাসন হুইলারের

অনুরূপ যুক্তি ব্যবহার করে আমি অনুমান করি নিয়মিত প্রকাশগুলি প্রকাশের আরও ঘোষণামূলক পদ্ধতি হিসাবে আমি খুব কমই উত্তর দিয়েছি পারফরম্যান্সের প্রশ্নের উত্তর "আপনার পক্ষে এটি আরও ভাল পারফরম্যান্স পাওয়ার জন্য এইভাবে লেখা উচিত" by আমি আমার মস্তিষ্ককে টেনে নিয়ে যাচ্ছি এবং অর্ধেকটি ধীরে ধীরে পুনরায় প্রকাশের ক্ষেত্রে নেতিবাচক চেহারা-পিছনে বা সামনে জবাব দেওয়ার জন্য কিছু প্রশ্ন মনে করতে পারে যেখানে উত্তরটি কম সময়ে একইভাবে করার জন্য আলাদাভাবে পুনরায় লেখার ব্যবস্থা করা হয়েছিল।
প্যাডি3118

পারফরম্যান্স একটি বাস্তবায়ন বিশদ। প্রায় কোনও আইএন বাস্তবায়নের পারফরম্যান্স তুলনামূলক বা এক্সস্টিস্ট এবং যোগিনের চেয়ে ভাল হতে পারে যদি ক্যোয়ারী প্রসেসর বিকাশকারীরা মনে করেন এটি একটি অগ্রাধিকার।
JustinC

1
@ জাস্টিনসি, পারফরম্যান্স ভিত্তিক এসকিউএল প্রশ্নগুলির অগ্রণীতা এবং অনুমিত ঘোষণামূলক ভাষার জন্য টিপসকে দেওয়া বিশদর চেয়ে এটি আরও বিশদ বলে মনে হচ্ছে?
ধানি 11118

একটি ঘোষণামূলক প্রোগ্রামিং ভাষার কোনও স্পষ্ট সংজ্ঞা নেই এবং তাই এটি সম্পর্কে কথা বলা অর্থহীন। কিছু ভাষা অন্যদের তুলনায় উচ্চ-স্তরের, এগুলিই।
বাগানের মাথা

উত্তর:


21

এসকিউএল তাত্ত্বিকভাবে ঘোষণামূলক। তবে আপনি জানেন যে তারা তত্ত্ব এবং অনুশীলনের পার্থক্য সম্পর্কে কী বলে ...

এর মূল ভিত্তিতে, "ঘোষিত প্রোগ্রামিং" এর ধারণাটি কখনই কার্যকরভাবে কার্যকর হয়নি, এবং সম্ভবত আমাদের কাছে এমন একটি এআই-ভিত্তিক সংকলক না রয়েছে যতক্ষণ না কোড দেখতে এবং প্রশ্নের উত্তর দিতে সক্ষম "এই কোডের উদ্দেশ্য কী?" বুদ্ধিমানের সাথে, যেভাবে এটি লিখেছিল সেভাবে। প্রতিটি ঘোষিত ভাষার কেন্দ্রবিন্দুতে একটি এআইয়ের সহায়তা ছাড়াই এই সমস্যাটি সমাধান করার চেষ্টা করা আবশ্যক কোডের পুরো গোছা।

প্রায়শই এটি আশ্চর্যজনকভাবে ভালভাবে কাজ করে, কারণ সর্বাধিক সাধারণ ঘটনাগুলি হ'ল সাধারণ ক্ষেত্রে , যাঁরা ভাষার প্রয়োগ লিখেছিলেন তারা জানেন এবং পরিচালনা করার ভাল উপায় খুঁজে পেয়েছিলেন। তবে আপনি এমন একটি প্রান্তের বিরুদ্ধে দৌড়াতে যা প্রয়োগকারী বিবেচনা করেনি, এবং অনুবাদক আপনাকে দ্রুত কর্মক্ষমতা হ্রাস করতে দেখেন কারণ অনুবাদক কোডটি আরও আক্ষরিক অর্থে নিতে এবং কম দক্ষ পদ্ধতিতে এটি পরিচালনা করতে বাধ্য হন।


3
সত্যই কার্যকর কখনও না? এসকিউএল, লিনকিউ, নকআউট.জেএস, প্রোলগ, ইএলএম ভাষা। আপনি আবার চেক করতে চাইতে পারেন। আমি এই মুহুর্তে বেশিরভাগ ঘোষিত প্রযুক্তি ব্যবহার করছি।
ব্রায়ান

5
@ ব্রায়ান: আপনি যখন কোনও প্রান্তের মামলাটি করেন যা কেউই ভাবেনি সেগুলির পরিবর্তে তারা সকলেই দ্রুত অবক্ষয় হয়। আমি মনে করি আমার বলা উচিত ছিল " সাধারণ ক্ষেত্রে সত্যই কার্যকর ।"
ম্যাসন হুইলারের

আপনার উত্তরটি কখন এটি একটি এসকিউএল সার্ভার ডাটাবেসে সঞ্চিত আছে তা দেখে হ্রাস করতে কখন সেট করা হয়? :) আমি তাদের মধ্যে খুব কমই একটি প্রান্তের মামলা পেয়েছি যা কাঠামোর মধ্যে সমাধান করা যায় না। আমি দেখতে পেয়েছি আপনি কোথা থেকে এসেছেন তবে প্রান্তের মামলাগুলি সত্যিকারের 99% ঘোষণামূলক কোডের পক্ষে কতটা উপকারী এবং সহজেই যুক্তিযুক্ত তা আমাকে খুব বেশি ব্যথার কারণ করে না। এটি ক্লোজুর বা এফ # বলা খারাপ, কারণ আপনার সমস্যা সমাধানের জন্য আপনাকে একটি পরিবর্তনীয় ধরণের ব্যবহার করতে হয়েছিল।
ব্রায়ান

11
@ ব্রায়ান: I rarely hit an edge case in any of them that couldn't be solved within the framework.হ্যাঁ, এটিই সম্পূর্ণ বিষয়: ফ্রেমওয়ার্কের মধ্যে সেগুলি সমাধানের একটি উপায় বের করতে হবে কারণ ফ্রেমওয়ার্কটি আপনার পক্ষে এটির সমাধান করার মতো চৌকস নয় যে আপনি আদি হিসাবে এটি ঘোষণা করেছিলেন।
ম্যাসন হুইলার

আপডেটের জন্য ... নির্বাচন সম্পর্কে কী? এটি একটি অপরিহার্য আদেশ বলে মনে হচ্ছে।
জেসভিন জোস

6

আমি এসকিউএল অপ্টিমাইজেশনের পরে কিছুদিন আগে এটি নিয়ে ভাবছিলাম। আমি মনে করি যে আমরা এসকিউএল একটি উইকিপিডিয়া সংজ্ঞা একটি "ঘোষিত ভাষা" হিসাবে সম্মত হতে পারে:

প্রোগ্রামিং দৃষ্টান্ত যা তার নিয়ন্ত্রণ প্রবাহকে বর্ণনা না করেই গণনার যৌক্তিকতা প্রকাশ করে

আপনি যদি ভাবেন যে পর্দার আড়ালে কতগুলি জিনিস করা হয় (পরিসংখ্যানগুলির দিকে তাকানো, কোনও সূচক কার্যকর কিনা তা স্থির করে, নেস্টেড, মার্জড বা হ্যাশ যোগ দেওয়ার জন্য যাচ্ছেন ইত্যাদি .. ইত্যাদি ..) আমাদের অবশ্যই স্বীকার করতে হবে যে আমরা কেবল একটি উচ্চ স্তর দিই যুক্তি এবং ডাটাবেস সমস্ত নিম্ন স্তরের নিয়ন্ত্রণ প্রবাহ যুক্তির যত্ন নিয়েছিল।

এছাড়াও এই পরিস্থিতিতে, কখনও কখনও ডাটাবেস অপ্টিমাইজারকে সর্বোত্তম ফলাফল দেওয়ার জন্য ব্যবহারকারীর কাছ থেকে কিছু "ইঙ্গিত" লাগে।

"ঘোষিত" ভাষার আর একটি সাধারণ সংজ্ঞা হ'ল (আমি কোনও লেখক উত্স খুঁজে পাই না):

প্রোগ্রামিং দৃষ্টান্ত যা অর্জনের পদক্ষেপগুলি বর্ণনা না করেই গণনার কাঙ্ক্ষিত ফলাফলকে প্রকাশ করে ("কীভাবে নয় কী" বর্ণনা দিয়ে সংক্ষেপে)

আমরা যদি এই সংজ্ঞা গ্রহণ করি তবে আমরা ওপি দ্বারা বর্ণিত সমস্যাগুলির মুখোমুখি হই।

প্রথম সমস্যাটি হ'ল এসকিউএল আমাদের "একই ফলাফল" সংজ্ঞায়িত করার জন্য একাধিক সমতুল্য উপায় দেয়। সম্ভবত এটি একটি প্রয়োজনীয় মন্দ: আমরা কোনও ভাষাকে যত বেশি ভাববাদী শক্তি দেই, তত বেশি একই জিনিস প্রকাশের বিভিন্ন উপায় থাকতে পারে।

উদাহরণ হিসাবে, আমাকে একবার এই জিজ্ঞাসাটি অনুকূল করতে বলা হয়েছে:

 SELECT Distinct CT.cust_type,  ct.cust_type_description 
   from customer c 
              INNER JOIN 
              Customer_type CT on c.cust_type=ct.cust_type;

যেহেতু প্রকারগুলি গ্রাহকের চেয়ে অনেক কম ছিল এবং cust_typeগ্রাহক টেবিলে একটি সূচক ছিল , তাই আমি এগুলি আবার লিখে এটির মাধ্যমে একটি দুর্দান্ত উন্নতি অর্জন করেছি:

 SELECT CT.cust_type,  ct.cust_type_description 
   from Customer_type CT
  Where exists ( select 1 from customer c 
                  Where c.cust_type=ct.cust_type);

এই সুনির্দিষ্ট ক্ষেত্রে, যখন আমি বিকাশকারীকে তিনি কী অর্জন করতে চান তা জিজ্ঞাসা করে তিনি আমাকে বলেছিলেন "আমি যে সমস্ত গ্রাহক প্রকারের জন্য আমার কমপক্ষে একজন গ্রাহক ছিল সেগুলি চেয়েছিলাম", ঘটনাক্রমে ঠিক কীভাবে অপ্টিমাইজার ক্যোয়ারী বর্ণনা করা যেতে পারে।

সুতরাং, যদি আমি একটি সমতুল্য এবং আরও দক্ষ ক্যোয়ারী পেতে পারি তবে কেন অপ্টিমাইজার একই কাজ করতে পারে না?

আমার সেরা অনুমান যে এটি দুটি প্রধান কারণে:

এসকিউএল যুক্তি প্রকাশ করে:

যেহেতু এসকিউএল উচ্চ-স্তরের যুক্তি প্রকাশ করে, আমরা কী সত্যই অপ্টিমাইজারটি আমাদের এবং আমাদের যুক্তিটিকে "আউটসামার্ট" করতে চাই? আমি উত্সাহের সাথে "হ্যাঁ" চেঁচিয়ে বলব যদি এটি যদি সমস্ত সময় না হয় তবে আমাকে অপটিমাইজারকে সবচেয়ে কার্যকর মৃত্যুদন্ডের পথ বেছে নিতে বাধ্য করা হয়েছিল। আমি মনে করি যে এই ধারণাটি অপ্টিমাইজারটিকে সর্বোত্তমভাবে কাজ করার অনুমতি দেয় (আমাদের যুক্তি সংশোধনও করে) তবে কিছু পাগল হওয়ার সময় উদ্ধার করতে আমাদের একটি "ইঙ্গিত প্রক্রিয়া" দেবে (এটি হুইল + ব্রেক থাকার মতো হবে) একটি স্বায়ত্তশাসিত গাড়ি)।

আরও পছন্দ = আরও সময়

এমনকি সেরা আরডিবিএমএস অপ্টিমাইজারও সমস্ত কার্যকর সম্পাদনের পাথগুলি পরীক্ষা করে না, কারণ এগুলি অবশ্যই সত্যই দ্রুত হওয়া উচিত: 100 মিমি থেকে 10 মিমি পর্যন্ত যদি কোন বারের জন্য 100 মিনিট সেরা পথ বেছে নেওয়ার দরকার হয় তবে কোনও ক্যোয়ারী অনুকূল করা কত ভাল হবে? এবং এটি আমাদের "উচ্চ-স্তরের যুক্তি" সম্মান করে অপ্টিমাইজারের সাথে। এটিতে যদি সমস্ত সমতুল্য এসকিউএল কোয়েরিগুলিও পরীক্ষা করা উচিত তবে অপটিমাইজারের সময়টি একাধিকবার বাড়তে পারে।

আরডিবিএমএসের কোনও পুনঃলিখনের ক্যোয়ারির আরও একটি ভাল উদাহরণ হ'ল ( এই আকর্ষণীয় ব্লগ পোস্ট থেকে )

SELECT t1.id, t1.value, SUM(t2.value)
  FROM mytable t1
       JOIN mytable t2
         ON t2.id <= t1.id
 GROUP BY t1.id, t1.value;

এই হিসাবে লেখা যেতে পারে (বিশ্লেষণমূলক ফাংশন প্রয়োজন)

 SELECT id, value, SUM(t1.value) OVER (ORDER BY id)
   FROM mytable

1
অস্তিত্বের সাথে যোগদানের পুনর্লিখনের উদাহরণ আকর্ষণীয়। এসকিউএল বিকাশকারীদের উপর আমি থাম্বের একটি নিয়ম ছাপানোর চেষ্টা করি তা হল DISTINCT এর ব্যবহার কোড গন্ধ - কোয়েরি, বা ডেটা মডেল, সম্ভবত খুব ভুল, এবং একটি ভিন্ন পদ্ধতির সন্ধান করা উচিত।
ডেভিড আল্ড্রিজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.