sql >> Database >  >> RDS >> PostgreSQL

Verbetering van de OFFSET-prestaties in PostgreSQL

Misschien wilt u een berekende index.

Laten we een tabel maken:

create table sales(day date, amount real);

En vul het met wat willekeurige dingen:

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

Indexeer het per dag, niets bijzonders hier:

create index sales_by_day on sales(day);

Maak een rijpositiefunctie. Er zijn andere benaderingen, deze is de eenvoudigste:

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

Controleer of het werkt (noem het echter niet zo op grote datasets):

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

Nu het lastige:voeg nog een index toe die is berekend op de functiewaarden van sales_pos:

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

Hier is hoe je het gebruikt. 5 is uw "offset", 10 is de "limiet":

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

Het is snel, want als je het zo noemt, gebruikt Postgres vooraf berekende waarden uit de index:

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

Ik hoop dat het helpt.



  1. java.net.SocketException:Gebroken pijp

  2. CASE WHEN in WHERE-component faalt met een fout die zoekwoord mist

  3. Mysql PHP Cron voor het bijwerken van gebruikersstatistieken

  4. Doe mee om specifieke gegevens weer te geven in laravel voor het maken van query's