PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Poprawa wydajności OFFSET w PostgreSQL

Możesz potrzebować obliczonego indeksu.

Stwórzmy tabelę:

create table sales(day date, amount real);

I wypełnij go losowymi rzeczami:

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

Indeksuj go w ciągu dnia, tutaj nic specjalnego:

create index sales_by_day on sales(day);

Utwórz funkcję pozycji wiersza. Istnieją inne podejścia, to jest najprostsze:

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

Sprawdź, czy to działa (choć nie nazywaj tego tak w przypadku dużych zbiorów danych):

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

Teraz trudna część:dodaj kolejny indeks obliczony na wartościach funkcji sales_pos:

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

Oto jak go używasz. 5 to Twoje "przesunięcie", 10 to "limit":

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

Jest szybki, ponieważ kiedy tak to nazywasz, Postgres używa wstępnie obliczonych wartości z indeksu:

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

Mam nadzieję, że to pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wypełnij tablicę wielowymiarową

  2. Jaki jest najbardziej zalecany sposób przechowywania czasu w PostgreSQL przy użyciu Javy?

  3. Pobieranie ostatniego słowa z ciągu znaków Postgres, deklaratywnie

  4. Jak wywołać funkcję Postgresa zwracającą rekord SETOF?

  5. Wyłącz zawijanie w wyjściu Psql