PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cải thiện hiệu suất OFFSET trong PostgreSQL

Bạn có thể muốn một chỉ mục được tính toán.

Hãy tạo một bảng:

create table sales(day date, amount real);

Và lấp đầy nó bằng một số thứ ngẫu nhiên:

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

Lập chỉ mục theo ngày, không có gì đặc biệt ở đây:

create index sales_by_day on sales(day);

Tạo một chức năng vị trí hàng. Có những cách tiếp cận khác, cách tiếp cận này là đơn giản nhất:

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

Kiểm tra xem nó có hoạt động không (tuy nhiên, đừng gọi nó như thế này trên các tập dữ liệu lớn):

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

Bây giờ là phần phức tạp:thêm một chỉ mục khác được tính trên các giá trị của hàm sales_pos:

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

Đây là cách bạn sử dụng nó. 5 là "phần bù" của bạn, 10 là "giới hạn":

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

Nó nhanh, vì khi bạn gọi nó như thế này, Postgres sử dụng các giá trị được tính toán trước từ chỉ mục:

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

Hy vọng nó sẽ hữu ích.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Loại tham số nên là gì trong Java khi nó là dấu thời gian không có múi giờ trong postgresql?

  2. Làm cách nào để truyền một bản ghi làm tham số cho hàm PL / pgSQL?

  3. Làm cách nào để xuất dữ liệu kết quả trong PostgreSQL sang .CSV?

  4. Cách đóng lỗ hổng bảo mật trong PostgreSQL

  5. Làm cách nào để lấy MIN () của hai trường trong Postgres?