If you're seeing this message, it means we're having trouble loading external resources on our website.

তোমার যদি কোন ওয়েব ফিল্টার দেওয়া থাকে, তাহলে দয়া করে নিশ্চিত কর যে *.kastatic.org এবং *.kasandbox.org ডোমেইনগুলো উন্মুক্ত।

মূল বিষয়বস্তু

কোর্স: কম্পিউটার প্রোগ্রামিং > অধ্যায় 3

পাঠ 3: এসকিউএল এ রিলেশনাল কুয়েরি

আরো দক্ষ SQL কুয়েরি পরিকল্পনা এবং অপ্টিমাইজেশান করা

এখন আমরা ডাটা (select) বাছাই করে একাধিক টেবিলে SELECT ব্যবহার করতে পারি, এজন্য এখনই SQL queries (কুয়েরি) এর দক্ষতা নিয়ে আলোচনার মোক্ষম সময় - একটি কুয়েরি কত দ্রুত কাজ করে এবং কীভাবে আরও দ্রুত কাজ করতে পারে?
SQL হল একটি নির্দেশক ভাষা - প্রত্যেকটি কুয়েরি SQL ইঞ্জিন কি কাজ করবে তা নির্দেশ করে, কিন্তু কীভাবে করবে সেটা স্বয়ংক্রিয় থাকে।  কিন্তু মূল বিষয় হল, কীভাবে -- কাজ করবে সেই স্বয়ংক্রিয় "পরিকল্পনাটি" -- কুয়েরির দক্ষতা নির্ধারণ করে, এজন্য, এটা খুবই গুরুত্বপূর্ণ।

কাজ সম্পাদনে SQL কুয়েরির কেন পরিকল্পনা দরকার?

উদাহরণস্বরূপ, আমাদের একটি সাধারণ কুয়েরি আছে:
SELECT * FROM books WHERE author = "J K Rowling";
এই query (কুয়েরি) এর জন্য, SQL দুইটি পদ্ধতিতে ফলাফল নির্ণয় করতে পারে:
  • সম্পূর্ণ "টেবিল খুঁজে বের করা": টেবিলের প্রত্যেকটি সারি (row) যাচাই করে, শুধুমাত্র মিলে যাওয়া সারিগুলো রিটার্ন করা।
  • একটি "index"(সূচক) তৈরি করা: লেখক অনুযায়ী সাজিয়ে টেবিলের একটি কপি তৈরি করা, তারপর binary search (বাইনারি সার্চ) করে লেখক "J K Rowling"(জে.কে রোলিং) এর সারি খুঁজে বের করে এটার সাপেক্ষে ID বের করা, তারপর আসল টেবিলে বাইনারি সার্চ করে মিলে যাওয়া ID এর সারিগুলো রিটার্ন করা।
কোনটি দ্রুততর? এই বিষয়টি ডাটা এবং কুয়েরি কতবার চলবে তার উপর নির্ভর করে। যদি টেবিলে মাত্র 10 টি সারি থাকে, তাহলে 10 টি সারি দেখলেই সম্পূর্ণ টেবিল খোঁজা হয়ে যায়, এক্ষেত্রে প্রথম পদ্ধতিটি কার্যকরী।
যদি টেবিলে 1 কোটি সারি থাকে, তাহলে সম্পূর্ণ টেবিলে 1 কোটি সারি খোঁজা লাগবে। এক্ষেত্রে সাজানো টেবিলে বাইনারি সার্চ করলে - শুধুমাত্র 23 বার খুঁজলেই 1 কোটি সারি থেকে মান বের করা যায়। কিন্তু, সাজানো টেবিল তৈরি করতেই অনেক সময় লাগবে (আমাদের ইঞ্জিনের ক্ষেত্রে, প্রায় 23 কোটি কার্যক্রম সম্পাদন করতে হবে)। যদি আমরা কুয়েরিটি এতবার চালাই (23 বারের অধিক) অথবা যদি টেবিল আগে থেকেই তৈরি থাকে, তাহলে এই ক্ষেত্রে দ্বিতীয় পদ্ধতিটিই ব্যবহার করা উপযুক্ত হবে।
কীভাবে SQL ইঞ্জিন সিদ্ধান্ত নেয় যে এটা কোন পদ্ধতিতে কাজ করবে? এটা একটি গুরুত্বপূর্ণ বিষয় যার সম্পর্কে পূর্বে আলোচনা করা হয়নি, কারণ আমরা কুয়েরি সম্পর্কে শিখছিলাম, তাদের কার্যপদ্ধতি নয়। বড় ডেটাবেজে SQL ব্যবহারে অভ্যস্ততা আসলে দেখা যায় যে, পরিকল্পনা করে পদ্ধতি নির্বাচন একটি গুরুত্বপূর্ণ বিষয়ে পরিণত হয়।

SQL কুয়েরির জীবনচক্র

প্রত্যেকটি কুয়েরির জন্য SQL ইঞ্জিন এই ধাপগুলো সম্পাদন করে:
Parse (পার্স) কর, তারপর Optimize (কুয়েরি ত্বরান্বিত) কর এবং তারপর Execute (চালান)
  1. Query parser (কুয়েরি পার্সার) এর কাজ হল কুয়েরিকে আক্ষরিকভাবে ঠিক রাখা (যেমন: কমা বাদ পড়লে) এবং অর্থগতভাবে সঠিক আছে কিনা দেখা (যেমন: টেবিলের অস্তিত্ব আছে কিনা) এবং ত্রুটি থাকলে রিটার্ন করে। যদি এটা সঠিক হয়, তাহলে কুয়েরিটিকে বীজগাণিতিক রাশিমালায় রূপান্তরিত করে পরবর্তী ধাপে পাঠানো হয়।
  2. Query planner and optimizer (কুয়েরি প্ল্যানার এবং অপটিমাইজার) এর কাজ হল সকল পরিকল্পনা করা এবং সেই পরিকল্পনাকে ফলপ্রসূ করা। এটি প্রথমে সাধারণ অপটিমাইজেশনগুলো করে (পরিবর্তন করে যা সবসময় ফলপ্রসূ হয়, যেমন 5*10 কে 50 এ পরিণত করে)। তারপর এটা বিভিন্ন "কুয়েরি পরিকল্পনা" করে যার অপটিমাইজেশন ভিন্ন হতে পারে, প্রতিটি কুয়েরি পরিকল্পনার খরচ (প্রসেসিং সময়) টেবিলের সারির সংখ্যার উপর নির্ভরশীল, তারপর এটি ফলপ্রসূ পরিকল্পনাকে বাছাই করে পরবর্তী ধাপে পাঠিয়ে দেয়।
  3. Query executor (কুয়েরি চালক) পরিকল্পনাকে নিয়ে ডেটাবেজের কার্যক্রমে পরিণত করে এবং কোন ফলাফল থাকলে রিটার্ন করে।

আমরা কি করতে পারি?

প্রতিটি কুয়েরির জন্য কুয়েরি পরিকল্পনা এবং অপটিমাইজেশন করা হয়, অনেকেই এই ব্যাপারটি উপেক্ষা করে যায়। কিন্তু, বড় ডাটা নিয়ে কাজ করার সময় কুয়েরি অপটিমাইজেশনের উপকারিতা বোঝা যায়, কারণ বড় ডাটা নিয়ে কাজের সময় স্বভাবতই আমরা চাই কুয়েরি যেন দ্রুত কাজ করে।
অনেক সময়, বিশেষ করে জটিল কুয়েরির ক্ষেত্রে, আসলেই কয়েকটি উপায়ে কুয়েরি অপটিমাইজ করা যায় এবং এটাকে "কুয়েরি টিউনিং" বলা হয়।
প্রথমে কোন কুয়েরি টিউন করতে হবে তা বের করতে হবে, যা বের করার জন্য আমাদেরকে ডেটাবেজে দেখতে হবে কোন কুয়েরি সবচেয়ে ধীর গতিতে কাজ করছে অথবা বেশি উপকরণ ব্যবহার করছে, যেমন SQL প্রফাইলার। অনেক সময়, এমন কুয়েরিও পাওয়া যেতে পারে যার ধীর গতির কারণে সম্পূর্ণ ডেটাবেজ অকেজো হয়ে পরে। সৌভাগ্যক্রমে, আমরা এই বিষয়টি আগেই জানলাম।
পরবর্তী ধাপ হল একটি নির্দিষ্ট SQL ইঞ্জিনে কুয়েরি কীভাবে চলছে বোঝা এবং সকল SQL ব্যবস্থাতে ইঞ্জিনের কার্যপদ্ধতি বোঝার প্রক্রিয়া থাকে। SQLite এ, যে কোন কুয়েরির আগে EXPLAIN QUERY PLAN লিখলেই এটার পরিকল্পনা অনুযায়ী কার্যপদ্ধতি দেখা যায়। এটা ব্যবহার করলে, অবশ্যই EXPLAIN QUERY PLAN তথ্যসূত্র দেখা উচিত, কারণ "ব্যাখ্যাটি" প্রয়োগভিত্তিক এবং বিস্তারিত। ভিন্ন SQL ইঞ্জিনের জন্য, খোঁজা যেতে পারে "আমি X ইঞ্জিনের ক্ষেত্রে কীভাবে পরিকল্পনাটি দেখবো"
এখন হল কঠিন অংশ: কুয়েরি চলার পরিকল্পনাকে নিজে অপটিমাইজ করা। এই অংশটি বিভিন্ন SQL ইঞ্জিন এবং সেটার ডাটার বিভিন্নতার উপর নির্ভরশীল।
উদাহরণস্বরূপ, উপরের কুয়েরিটি কি মনে আছে? যদি আমরা আগে থেকেই জানতাম যে লেখকের সারিতে WHERE ব্যবহার করা যাবে না, তাহলে আমরা আলাদাভাবে index তৈরি করতাম, CREATE INDEX ব্যবহার করে। তারপর SQL ইঞ্জিনে সেই index ব্যবহার করে সহজেই সদৃশ সারি খুঁজে পাওয়া সম্ভব। Index সম্পর্কে জানতে SQLite query planning (SQL কুয়েরি পরিকল্পনার) এই নির্দেশিকাটি দেখা উচিত।
Index তৈরি করলে কুয়েরি অনেক কার্যকরী হয়। কিন্তু একে কার্যকরী করার অনেক পদ্ধতি রয়েছে। SQLite এর ব্যাপারে আরও জানার জন্য, query planner overview (কুয়েরি পরিকল্পনার সারসংক্ষেপ) এর মধ্যে "manual" (ম্যানুয়াল) অংশটি দেখা উচিত।
কুয়েরি অপটিমাইজেশনের সকল জটিলতা এই অনুশীলনীর আওতার বাহিরে, এজন্য এগুলো সম্পর্কে আরও জানার জন্য স্বচেষ্ট হওয়া আবশ্যক।
(এখানে SQL কুয়েরি পরিকল্পনা সম্পর্কে জানার জন্য বেশ কিছু তথ্য দেওয়া হল: SQL Server Query OptimizerOracle SQL TuningMSSQL Execution Plan Basics)

আলোচনায় অংশ নিতে চাও?

কোন আলাপচারিতা নেই।
ইংরেজি জানো? খান একাডেমির ইংরেজি সাইটে আরো আলোচনা দেখতে এখানে ক্লিক কর।