Kodokon kodokon.com

EXPLAIN और क्वेरी प्लान: पढ़ें कि डेटाबेस असल में क्या करता है

EXPLAIN QUERY PLAN की मदद से उस प्लान को समझें जिसे SQLite प्लानर आपकी क्वेरी के लिए वास्तव में चुनता है।

10 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

SQL डिक्लेरेटिव है: आप परिणाम का वर्णन करते हैं, यह नहीं कि उसे कैसे प्राप्त करना है। डेटा को कैसे पढ़ना है यह क्वेरी प्लानर तय करता है। इसे काम करते हुए देखने के लिए, SQLite दो कमांड देता है: EXPLAIN QUERY PLAN एक पठनीय उच्च-स्तरीय प्लान देता है, जबकि अकेला EXPLAIN VDBE वर्चुअल मशीन का बाइटकोड उगल देता है। sqlite3 कमांड-लाइन टूल इंस्टॉल करें, या अपने ब्राउज़र में sqliteonline.com खोलें, और आगे आने वाले हर उदाहरण को दोहराएँ।

SQL
CREATE TABLE departments (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE employees (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  department_id INTEGER,
  salary INTEGER NOT NULL
);

INSERT INTO departments (id, name) VALUES
  (1, 'Engineering'),
  (2, 'Sales');

INSERT INTO employees
  (id, name, department_id, salary)
VALUES
  (1, 'Ada',    1, 65000),
  (2, 'Grace',  1, 72000),
  (3, 'Alan',   2, 58000);
बाकी सब कुछ करने से पहले बनाया जाने वाला डेटासेट।

किसी भी SELECT क्वेरी के आगे EXPLAIN QUERY PLAN लगाएँ। परिणाम की हर लाइन बताती है कि किसी टेबल को कैसे पढ़ा जाता है। दो कीवर्ड प्रमुख हैं: SCAN का अर्थ है कि टेबल को पूरी तरह से, रो दर रो, स्कैन किया जाता है, जबकि SEARCH किसी इंडेक्स द्वारा निर्देशित एक लक्षित एक्सेस को दर्शाता है। किसी उपयुक्त इंडेक्स के बिना, एक साधारण समानता भी पहले से ही पूर्ण स्कैन को ट्रिगर कर देती है।

SQL
EXPLAIN QUERY PLAN
SELECT * FROM employees
WHERE department_id = 1;
-- Result: SCAN employees
-- (no index: the whole table is read)
इंडेक्स के बिना, प्लानर पूरी टेबल को स्कैन करता है।

फ़िल्टर किए गए कॉलम पर एक इंडेक्स बनाएँ, फिर ठीक वही क्वेरी दोबारा चलाएँ: प्लान SCAN से बदलकर SEARCH ... USING INDEX हो जाता है। अन्य उल्लेख भी मूल्यवान हैं: USE TEMP B-TREE मेमोरी में साकार किए गए किसी सॉर्ट या ग्रुपिंग को उजागर करता है (अक्सर यह संकेत कि कोई ऑर्डरिंग इंडेक्स गायब है), और USING COVERING INDEX संकेत देता है कि टेबल को खोला तक नहीं गया।

SQL
CREATE INDEX idx_emp_dept
  ON employees (department_id);

EXPLAIN QUERY PLAN
SELECT * FROM employees
WHERE department_id = 1;
-- SEARCH employees USING INDEX
-- idx_emp_dept (department_id=?)
वही SELECT, लेकिन अब इंडेक्स द्वारा निर्देशित।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. SQLite में, अकेले EXPLAIN की तुलना में EXPLAIN QUERY PLAN क्या लौटाता है?
    • VDBE बाइटकोड, निर्देश दर निर्देश
    • एक उच्च-स्तरीय प्लान (SCAN, SEARCH, अस्थायी सॉर्ट)
    • क्वेरी का वास्तविक मापा गया निष्पादन समय
    • टेबल पर मौजूद इंडेक्स की सूची
  2. किसी SQLite प्लान में, लाइन SCAN employees का क्या अर्थ है?
    • टेबल को पूरी तरह से, रो दर रो, स्कैन किया जाता है
    • एक कवरिंग इंडेक्स का उपयोग किया जाता है
    • किसी इंडेक्स के माध्यम से एक लक्षित खोज की जाती है
    • टेबल को मेमोरी कैश में लोड किया जाता है
  3. ANALYZE कमांड किसलिए उपयोग किया जाता है?
    • यह डेटाबेस के सभी इंडेक्स को फिर से बनाता है
    • यह प्लानर को निर्देशित करने के लिए sqlite_stat1 में आँकड़े एकत्र करता है
    • यह क्वेरी को निष्पादित करता है और उसकी अवधि मापता है
    • यह विश्लेषण के दौरान टेबल को लॉक कर देता है