1) PostgreSQL でページングを実装する最良の方法は何ですか?
ページングを実装する必要があるとします。最も単純なクエリはselect * from MY_TABLE order by date_field DESC limit 10 offset 20
. 私が理解している限り、ここには 2 つの問題があります。日付の値が重複している可能性がある場合、このクエリを実行するたびに異なる結果が返される可能性があり、オフセット値が大きいほどクエリの実行時間が長くなります。date_field_index である追加の列を提供する必要があります。
--date_field--date_field_index--
12-01-2012 1
12-01-2012 2
14-01-2012 1
16-01-2012 1
--------------------------------
今、私たちは次のようなものを書くことができます
create index MY_INDEX on MY_TABLE (date_field, date_field_index);
select * from MY_TABLE where date_field=<last_page_date and not (date_field_index>=last_page_date_index and date_field=last+page_date) order by date_field DESC, date_field_index DESC limit 20;
..したがって、offset の代わりに where 句と対応するインデックスを使用します。では、質問です。
1) これは最初のクエリを改善するための最良の方法ですか? 2) その date_field_index フィールドにどのように入力できますか? これには何らかのトリガーを提供する必要がありますか?3) Postgres で RowNumber() 関数を使用しないでください。これらの関数はインデックスを使用していないため、非常に遅いからです。それが正しいか?
2) 連結インデックスの列の順序がクエリのパフォーマンスに影響しないのはなぜですか?
私の測定によると、連結インデックス (2 つ以上の列で構成されるインデックス) を使用して検索する場合、最も選択的な列を最初に配置しても、最後に配置しても違いはありません。なんで?最も選択的な列を最初に配置すると、パフォーマンスに影響を与えるはずの検出された行の範囲が狭くなります。私は正しいですか?