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

PostgreSQL में OFFSET प्रदर्शन में सुधार

आप एक परिकलित अनुक्रमणिका चाहते हैं।

आइए एक टेबल बनाएं:

create table sales(day date, amount real);

और इसे कुछ यादृच्छिक सामग्री से भरें:

insert into sales 
    select current_date + s.a as day, random()*100 as amount
    from generate_series(1,20);

इसे दिन के हिसाब से इंडेक्स करें, यहां कुछ खास नहीं:

create index sales_by_day on sales(day);

एक पंक्ति स्थिति फ़ंक्शन बनाएँ। और भी तरीके हैं, यह सबसे सरल है:

create or replace function sales_pos (date) returns bigint 
   as 'select count(day) from sales where day <= $1;' 
   language sql immutable;

जांचें कि क्या यह काम करता है (हालांकि इसे बड़े डेटासेट पर इस तरह न कहें):

select sales_pos(day), day, amount from sales;

     sales_pos |    day     |  amount  
    -----------+------------+----------
             1 | 2011-07-08 |  41.6135
             2 | 2011-07-09 |  19.0663
             3 | 2011-07-10 |  12.3715
    ..................

अब मुश्किल हिस्सा:sales_pos फ़ंक्शन मानों पर गणना की गई एक और अनुक्रमणिका जोड़ें:

create index sales_by_pos on sales using btree(sales_pos(day));

यहां बताया गया है कि आप इसका उपयोग कैसे करते हैं। 5 आपकी "ऑफ़सेट" है, 10 "सीमा" है:

select * from sales where sales_pos(day) >= 5 and sales_pos(day) < 5+10;

        day     | amount  
    ------------+---------
     2011-07-12 | 94.3042
     2011-07-13 | 12.9532
     2011-07-14 | 74.7261
    ...............

यह तेज़ है, क्योंकि जब आप इसे इस तरह कहते हैं, Postgres अनुक्रमणिका से पूर्व-परिकलित मानों का उपयोग करता है:

explain select * from sales 
  where sales_pos(day) >= 5 and sales_pos(day) < 5+10;

                                    QUERY PLAN                                
    --------------------------------------------------------------------------
     Index Scan using sales_by_pos on sales  (cost=0.50..8.77 rows=1 width=8)
       Index Cond: ((sales_pos(day) >= 5) AND (sales_pos(day) < 15))

आशा है कि यह मदद करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL कस्टम अपवाद शर्तें

  2. क्या मैं पहले से ही बनाए जाने के बाद, PostgreSQL तालिका में एक अद्वितीय बाधा जोड़ सकता हूं?

  3. टाइमज़ोन के बिना किसी भी दिनांक स्ट्रिंग को टाइमस्टैम्प में कनवर्ट करें

  4. पोस्टग्रेज - दो कॉलम को एक आइटम में एकत्रित करें

  5. PostgreSQL क्वेरी जहां दिनांक 3 वर्ष से अधिक पुराना है