क्वेरी निष्पादन समय में अंतर इसलिए है क्योंकि पहले निष्पादन को डिस्क से अधिक 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);