PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

LIMIT 1 . के साथ अनुक्रमित ORDER BY

मान लें कि हम एक बड़ी तालिका . के साथ काम कर रहे हैं , एक आंशिक अनुक्रमणिका मदद कर सकता है:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

जैसा कि आप पहले ही पता लगा चुके हैं:अवरोही या आरोही यहाँ शायद ही मायने रखता है। पोस्टग्रेज लगभग समान गति से पीछे की ओर स्कैन कर सकते हैं (बहु-स्तंभ सूचकांकों के साथ अपवाद लागू होते हैं)।

इस अनुक्रमणिका का उपयोग करने के लिए प्रश्न:

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

यहां बिंदु यह है कि सूचकांक को बहुत छोटा बनाया जाए , इसलिए इसे कैश करना और बनाए रखना आसान होना चाहिए।

  1. आपको एक ऐसा टाइमस्टैम्प चुनना होगा जो सबसे हाल के टाइमस्टैम्प से छोटा होने की गारंटी हो।
  2. पुराने डेटा को काटने के लिए आपको समय-समय पर इंडेक्स को फिर से बनाना चाहिए।
  3. शर्त IMMUTABLEहोनी चाहिए ।

तो एकमुश्त प्रभाव समय के साथ बिगड़ता जाता है। विशिष्ट समस्या हार्ड कोडेड कंडीशन है:

WHERE created_at > '2013-09-15 0:0'::timestamp

स्वचालित

आप समय-समय पर इंडेक्स और अपने प्रश्नों को मैन्युअल रूप से अपडेट कर सकते हैं। या आप इसे इस तरह के फ़ंक्शन की सहायता से स्वचालित करते हैं:

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

सूचकांक:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

प्रश्न:

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

क्रॉन जॉब या कुछ ट्रिगर-आधारित ईवेंट के साथ मनोरंजन को स्वचालित करें। आपके प्रश्न अब वही रह सकते हैं। लेकिन आपको सभी सूचकांकों को फिर से बनाने की आवश्यकता है इसे बदलने के बाद किसी भी तरह से इस फ़ंक्शन का उपयोग करना। बस ड्रॉप करें और प्रत्येक को बनाएं।

पहले ..

... परीक्षण करें कि क्या आप वास्तव में इसके साथ बोतल की गर्दन को मार रहे हैं।

कोशिश करें कि क्या एक साधारण DROP index ... ; CREATE index ... काम करता है। तब आपका सूचकांक फूला हुआ हो सकता है। आपकी ऑटोवैक्यूम सेटिंग बंद हो सकती है।

या VACUUM FULL ANALYZE आज़माएं अपने पूरे टेबल प्लस इंडेक्स को पुरानी स्थिति में लाने के लिए और फिर से जांचें।

अन्य विकल्प सामान्य सामान्य प्रदर्शन ट्यूनिंग और कवरिंग इंडेक्स शामिल करें, जो इस बात पर निर्भर करता है कि आप वास्तव में तालिका से क्या प्राप्त करते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका को पोस्टग्रेज करने के लिए स्पार्क डेटाफ्रेम यूपीएसईआरटी

  2. रेल 4 माइग्रेशन में कस्टम प्राथमिक कुंजी सेट करने में समस्याएं

  3. Postgres डेटाबेस का उपयोग करके मैं जावा में एसिंक्रोनस/इवेंट-संचालित LISTEN/NOTIFY समर्थन कैसे प्राप्त करूं?

  4. एकाधिक तालिकाओं में खोजें और परिणामी पंक्तियों में तालिका का नाम भी प्रदर्शित करें

  5. PostgreSQL:टेबल बनाने का समय