PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Meningkatkan kinerja OFFSET di PostgreSQL

Anda mungkin menginginkan indeks yang dihitung.

Mari kita buat tabel:

create table sales(day date, amount real);

Dan isi dengan beberapa hal acak:

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

Indeks berdasarkan hari, tidak ada yang istimewa di sini:

create index sales_by_day on sales(day);

Buat fungsi posisi baris. Ada pendekatan lain, ini yang paling sederhana:

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

Periksa apakah itu berfungsi (jangan menyebutnya seperti ini pada kumpulan data besar):

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
    ..................

Sekarang bagian yang sulit:tambahkan indeks lain yang dihitung pada nilai fungsi sales_pos:

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

Inilah cara Anda menggunakannya. 5 adalah "pengganti" Anda, 10 adalah "batas":

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
    ...............

Ini cepat, karena ketika Anda menyebutnya seperti ini, Postgres menggunakan nilai yang telah dihitung sebelumnya dari indeks:

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))

Semoga membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan notasi fungsional dalam kueri PostgreSQL alih-alih notasi titik

  2. Metode Konversi. Metode yang ditentukan pada tipe tidak dapat diterjemahkan ke dalam ekspresi penyimpanan LINQ ke Entitas

  3. Kueri rekursif di PostgreSQL. PILIH *

  4. Saya sedang mengeksekusi n tidak. dari proses di mana n bisa antara 5 - 50. Setiap proses membuat beberapa operasi dml di postgres

  5. Cara Mengisi Tanggal yang Hilang di PostgreSQL menggunakan generate_series