PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Подобряване на производителността на OFFSET в PostgreSQL

Може да искате изчислен индекс.

Нека създадем таблица:

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. SELECT COUNT(*) - връща 0 заедно с групираните полета, ако няма съответстващи редове

  2. Прозорците на Postgres функционират с агрегатно групиране по

  3. Как да стартирате ad-hoc скрипт в PostgreSQL?

  4. Как да заявите сумата на предишния ред на същата колона с pgSql

  5. psql.exe - неуспешно удостоверяване на парола в windows