क्रेग के पूरी तरह से जवाब के अलावा, मैं जोड़ना चाहता हूं कि आपके द्वारा संदर्भित पुस्तक का कवर कहता है:
Oracle, DB2 और SQL सर्वर को शामिल करता है
इसलिए मैं विशेष रूप से PostgreSQL पर सलाह का एक बड़ा स्रोत होने पर भरोसा नहीं करूंगा। हर RDBMS आश्चर्यजनक रूप से अलग हो सकता है!
मैं आपके मूल प्रश्न के बारे में थोड़ा भ्रमित हूं, लेकिन यहां एक उदाहरण दिखा रहा है कि पुस्तक का वह भाग 100% सही नहीं है। आगे की उलझन से बचने के लिए, यहां संपूर्ण प्रासंगिक पैराग्राफ है, आप इसे Google पुस्तक खोज में देख सकते हैं ।
डेटाबेस मानता है कि Indexed_Col नहीं है NULL उपयोगी होने के लिए बहुत बड़ी सीमा को कवर करता है, इसलिए डेटाबेस इस स्थिति से एक इंडेक्स पर ड्राइव नहीं करेगा। दुर्लभ मामलों में, किसी भी गैर-मूल्य का होना इतना दुर्लभ है कि सभी संभव नॉनकूल मूल्यों पर एक इंडेक्स रेंज स्कैन फायदेमंद है। ऐसे मामलों में, यदि आप सभी संभावित मूल्यों की सीमा के लिए एक सुरक्षित निचली या ऊपरी सीमा का पता लगा सकते हैं, तो आप पॉजिटिव_ID_Column> -1 या Date_Column> TO_DATE ('0001/01/01') जैसी स्थिति के साथ एक स्कैन को सक्षम कर सकते हैं। , 'YYYY / MM / DD')।
पोस्टग्रैज वास्तव में (निम्नलिखित विवादित मामले में) एक अनुक्रमणिका का उपयोग IS NOT NULL
करके सुझाव की तरह सीमा स्कैन कीचड़ को जोड़ने के बिना प्रश्नों को संतुष्ट करने के लिए उपयोग कर सकते हैं Positive_ID_Column > -1
। क्रेग के सवालों पर टिप्पणियों को देखें कि पोस्टग्रेज इस विशेष मामले में इस सूचकांक को क्यों चुन रहे हैं, और आंशिक अनुक्रमित का उपयोग करने के बारे में नोट।
CREATE TABLE bar (a int);
INSERT INTO bar (a) SELECT NULL FROM generate_series(1,1000000);
INSERT INTO bar (a) VALUES (1);
CREATE INDEX bar_idx ON bar (a);
EXPLAIN ANALYZE SELECT * FROM bar WHERE a IS NOT NULL;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Index Only Scan using bar_idx on bar (cost=0.42..8.44 rows=1 width=4) (actual time=0.094..0.095 rows=1 loops=1)
Index Cond: (a IS NOT NULL)
Heap Fetches: 1
Total runtime: 0.126 ms
(4 rows)
यह वैसे तो 9.3 पोस्टग्रैज है, लेकिन मेरा मानना है कि परिणाम लगभग 9.1 पर समान होगा, हालांकि यह "इंडेक्स स्कैन" का उपयोग नहीं करेगा।
संपादित करें: मैं देख रहा हूं कि आपने अपने मूल प्रश्न को स्पष्ट कर दिया है, और आप स्पष्ट रूप से सोच रहे हैं कि पोस्टग्रेज एक इंडेक्स का उपयोग सरल उदाहरण में क्यों नहीं कर रहा है:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
संभवतः क्योंकि आपके पास तालिका में कोई पंक्तियाँ नहीं हैं। तो कुछ परीक्षण डेटा जोड़ें और ANALYZE my_table;
।