একটি জটিল SELECT কোয়েরি ধীরগতির হলে আমরা কিভাবে বুঝব কোথায় সমস্যা? কিংবা আমরা কি জানতে চাই না SQLite আসলে আমাদের দেওয়া SQL কীভাবে পর্দার আড়ালে সম্পাদন করছে? এর উত্তর লুকিয়ে আছে EXPLAIN ও EXPLAIN QUERY PLAN কমান্ডের মধ্যে। এগুলো SQLite-র সামনে বসালে ডেটা ফেরত না দিয়ে বরং বলে দেয় ইঞ্জিন কিভাবে কাজটি করতে যাচ্ছে। এই পর্বে আমরা EXPLAIN-এর মাধ্যমে একটি কোয়েরির বিস্তারিত অপকোড (opcode) এবং EXPLAIN QUERY PLAN-এর মাধ্যমে উচ্চস্তরের প্ল্যান দেখব। এটি ডিবাগিং ও পারফরম্যান্স অপ্টিমাইজেশনের অপরিহার্য হাতিয়ার।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
- আমরা পরিচিত
COMPANYটেবিল ব্যবহার করব।explain_demo.dbনামে ডাটাবেস তৈরি করি।
টার্মিনাল:
bash
sqlite3 explain_demo.db
sql
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00); INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00); INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00); INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00); INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00); INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00); INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
- আউটপুট ফরম্যাট:
.header on,.mode column।
১. EXPLAIN কী?
EXPLAIN কীওয়ার্ডটি একটি SQL স্টেটমেন্টের আগে বসে এবং সেই স্টেটমেন্টের জন্য SQLite যে অপকোড (opcode) ধাপগুলি অনুসরণ করবে, তা প্রদর্শন করে। এটি মূলত ভার্চুয়াল মেশিনের ভাষায় অনুবাদ, যা ডেভেলপারদের বুঝতে সাহায্য করে ইঞ্জিন কীভাবে ডেটা খুঁজছে, তুলনা করছে, এবং আউটপুট তৈরি করছে।
সিনট্যাক্স:
sql
EXPLAIN [SQLite Query]
উদাহরণ: আমরা দেখতে চাই SELECT * FROM COMPANY WHERE SALARY >= 20000; কোয়েরিটি কীভাবে সম্পাদিত হবে।
sql
EXPLAIN SELECT * FROM COMPANY WHERE SALARY >= 20000;
আউটপুট (সংক্ষিপ্ত রূপ, বাস্তবে অনেকগুলো সারি):
text
addr opcode p1 p2 p3 ---------- ---------- ---------- ---------- ---------- 0 Goto 0 19 1 Integer 0 0 2 OpenRead 0 8 3 SetNumColu 0 5 4 Rewind 0 17 5 Column 0 4 6 RealAffini 0 0 7 Integer 20000 0 8 Lt 357 16 collseq(BI 9 Rowid 0 0 10 Column 0 1 11 Column 0 2 12 Column 0 3 13 Column 0 4 14 RealAffini 0 0 15 Callback 5 0 16 Next 0 5 17 Close 0 0 18 Halt 0 0 19 Transactio 0 0 20 VerifyCook 0 38 21 Goto 0 1 22 Noop 0 0
এটি দেখে হয়তো একটু জটিল লাগতে পারে, কিন্তু মূল বিষয় হলো: এখানে OpenRead টেবিল খোলে, Rewind প্রথম সারিতে যায়, Column কলাম রিড করে, Integer 20000 বসায়, Lt (Less Than) তুলনা করে, Callback আউটপুট দেয়, Next পরবর্তী সারিতে যায়, ইত্যাদি। বাস্তবে আমরা এই অপকোড সরাসরি বিশ্লেষণ না করে EXPLAIN QUERY PLAN-ই বেশি ব্যবহার করি, কারণ এটি সরল ও অর্থবহ।
২. EXPLAIN QUERY PLAN – সরল পরিকল্পনা
EXPLAIN QUERY PLAN কমান্ডটি আরও উচ্চস্তরের একটি সারাংশ দেখায়: কোন টেবিল ব্যবহৃত হচ্ছে, কোনো ইনডেক্স কাজে লাগছে কিনা, টেবিল স্ক্যান হচ্ছে নাকি ইনডেক্স লুকআপ ইত্যাদি। এটি EXPLAIN-এর চেয়ে অনেক বেশি পঠনযোগ্য।
সিনট্যাক্স:
sql
EXPLAIN QUERY PLAN [SQLite Query]
উদাহরণ: একই কোয়েরি এবার EXPLAIN QUERY PLAN দিয়ে বিশ্লেষণ করি।
sql
EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;
ফলাফল:
text
order from detail ---------- ---------- ------------- 0 0 TABLE COMPANY
এখানে detail কলাম বলছে TABLE COMPANY – অর্থাৎ এটি সম্পূর্ণ টেবিল স্ক্যান করবে (কোনো ইনডেক্স ব্যবহার হবে না)। পরবর্তীতে আমরা ইনডেক্স যোগ করলে দেখতে পাবো SEARCH TABLE COMPANY USING INDEX salary_index বা অনুরূপ কিছু।
আরেকটি উদাহরণ:
আমরা SALARY-র উপর ইনডেক্স তৈরি করি:
sql
CREATE INDEX salary_idx ON COMPANY (SALARY);
এখন আবার দেখি:
sql
EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;
ফলাফল:
text
order from detail ---------- ---------- ---------------------------------- 0 0 TABLE COMPANY WITH INDEX salary_idx
এখন দেখাচ্ছে এটি ইনডেক্স ব্যবহার করবে, ফলে কোয়েরি দ্রুততর হবে।
৩. EXPLAIN বনাম EXPLAIN QUERY PLAN
| বৈশিষ্ট্য | EXPLAIN | EXPLAIN QUERY PLAN |
|---|---|---|
| আউটপুট | বিস্তারিত অপকোড তালিকা (নিম্ন-স্তর) | সংক্ষিপ্ত পরিকল্পনা (উচ্চ-স্তর) |
| ব্যবহারকারী | উন্নত ডেভেলপার, ডিবাগিং | সাধারণ অপ্টিমাইজেশন |
| পঠনযোগ্যতা | কম, জটিল | সহজ, অর্থপূর্ণ |
| স্থিতিশীলতা | ভার্সনভেদে আউটপুট বদলাতে পারে | তুলনামূলক স্থিতিশীল |
সাধারণত আমরা কোয়েরি টিউন করতে EXPLAIN QUERY PLAN-ই ব্যবহার করব। EXPLAIN তখনই দরকার যখন SQLite-র অভ্যন্তরীণ ত্রুটি খুঁজতে হবে।
৪. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
ডাটাবেস ফাইল: explain_demo.db। কোনো বাড়তি প্যাকেজ লাগবে না। EXPLAIN SQLite-এর বিল্ট-ইন ফিচার।
text
project-folder/ └── explain_demo.db
৫. গুরুত্বপূর্ণ টিপস
- ইনডেক্স পরীক্ষায় দুর্দান্ত: নতুন ইনডেক্স তৈরির পর
EXPLAIN QUERY PLANদিয়ে যাচাই করুন যে সেটি সত্যিই ব্যবহৃত হচ্ছে কিনা। - অ্যাপ্লিকেশনে ব্যবহার নয়: SQLite ডকুমেন্টেশন স্পষ্টভাবে জানায়,
EXPLAIN-এর আউটপুট ফরম্যাট সংস্করণভেদে বদলাতে পারে; তাই অ্যাপ্লিকেশন লজিক কখনো এই আউটপুটের উপর নির্ভর করবে না। - সাবকোয়েরি ও জয়েন বিশ্লেষণ: জটিল JOIN বা সাবকোয়েরির পারফরম্যান্স বুঝতে
EXPLAIN QUERY PLANঅপরিহার্য। - .eqp ডট কমান্ড: SQLite শেলে
.eqp onদিলে স্বয়ংক্রিয়ভাবে প্রতিটি কোয়েরির পর EXPLAIN QUERY PLAN দেখাবে, যা শেখার জন্য চমৎকার।sql.eqp on SELECT * FROM COMPANY WHERE SALARY > 50000; — আউটপুটের আগে QUERY PLAN দেখাবে .eqp off
৬. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on .mode column -- ১. প্রাথমিক EXPLAIN QUERY PLAN (ইনডেক্স ছাড়া) EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000; -- ২. ইনডেক্স তৈরি CREATE INDEX salary_idx ON COMPANY (SALARY); -- ৩. পুনরায় একই কোয়েরির প্ল্যান দেখি (এখন ইনডেক্স ব্যবহৃত হবে) EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000; -- ৪. বড় EXPLAIN আউটপুট দেখা (অপশনাল, অনেক লাইন আসবে) EXPLAIN SELECT * FROM COMPANY WHERE SALARY >= 20000; -- ৫. .eqp চালু করে স্বয়ংক্রিয় প্ল্যান দেখা .eqp on SELECT * FROM COMPANY WHERE SALARY > 40000; .eqp off -- ৬. আরেকটি উদাহরণ: WHERE ইন সহ EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE AGE IN (25, 27) AND ADDRESS = 'Texas'; -- ৭. ইনডেক্স ড্রপ DROP INDEX salary_idx;
পরবর্তী পর্বে
আমরা শিখব SQLite VACUUM – কীভাবে ডাটাবেস ফাইল সংকুচিত করে জায়গা খালি করা যায় এবং পারফরম্যান্স বজায় রাখা যায়।
লেখকের কথা: EXPLAIN আপনার কোয়েরির স্বাস্থ্য পরীক্ষার যন্ত্র। সঠিক বিশ্লেষণ করে আপনি আপনার অ্যাপ্লিকেশনকে আরও গতিময় করতে পারবেন। বাংলায় SQLite শেখার এই সিরিজ আপনার মূল্যবান সময়ের সার্থক ব্যবহার হোক। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। আপনার প্রশ্ন বা মতামত জানাতে কমেন্ট করুন – আমরা উত্তর দিতে মুখিয়ে আছি!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
