क्वेरी निष्पादन समय में अंतर इसलिए है क्योंकि पहले निष्पादन को डिस्क से अधिक 8kB ब्लॉक पढ़ना पड़ता है:तुलना करें shared read=631496
और shared read=30359
।
PostgreSQL WHERE
. के लिए अनुक्रमणिका का उपयोग नहीं करने का निर्णय लेता है शर्त, लेकिन सूचकांक जो ORDER BY
. का समर्थन करता है . ध्यान दें कि IN
. के कारण WHERE
. दोनों के लिए एक इंडेक्स का उपयोग करना संभव नहीं है शर्त और ORDER BY
- यह केवल WHERE
. के लिए ही संभव है शर्तें जो =
. का उपयोग करती हैं तुलना ऑपरेटर के रूप में।
तो PostgreSQL को एक विकल्प बनाना है, और यह शायद गलत बनाता है:चूंकि इसके आंकड़े अनुकूलक को बताते हैं कि कई पंक्तियां हैं जो WHERE
को संतुष्ट करती हैं शर्त, यह ORDER BY
. में पंक्तियों को पढ़ने का निर्णय लेता है WHERE
. से मेल नहीं खाने वालों को ऑर्डर करें और त्यागें शर्त जब तक कि उसे 100 परिणाम पंक्तियाँ न मिलें। दुर्भाग्य से, ऐसा लगता है कि मेल खाने वाली पंक्तियाँ तालिका की शुरुआत के करीब नहीं हैं, और PostgreSQL को कई पंक्तियों को स्कैन करना है (Rows Removed by Filter: 17276154
)।
इसे WHERE
. के लिए एक इंडेक्स स्कैन का उपयोग करने के लिए शर्त, ORDER BY
संशोधित करें खंड ताकि PostgreSQL इसके लिए एक अनुक्रमणिका का उपयोग न कर सके:
ORDER BY datetime + INTERVAL '0 seconds' DESC
चूंकि यहां बहु-स्तंभ अनुक्रमणिका का कोई उपयोग नहीं है, इसलिए सर्वोत्तम अनुक्रमणिका होगी
CREATE INDEX ON report (sensor_id);