sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでのOFFSETパフォーマンスの改善

    計算されたインデックスが必要な場合があります。

    テーブルを作成しましょう:

    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. @row:[email protected]+1に相当するphpとは何ですか

    2. ソースが他のデータベースであるステートメントを選択します

    3. SQL Serverの列のデータ型をどのように変更しますか?

    4. Apache子プロセスがステータス255で終了しました