1

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 つ以上の列で構成されるインデックス) を使用して検索する場合、最も選択的な列を最初に配置しても、最後に配置しても違いはありません。なんで?最も選択的な列を最初に配置すると、パフォーマンスに影響を与えるはずの検出された行の範囲が狭くなります。私は正しいですか?

4

1 に答える 1

1

列の代わりに、主キーを使用して関連付けを解除しdate_field_indexます。それ以外の場合は、それがオプションではない理由を説明してください。

order by date_field DESC, "primary_key_column(s)" DESC

最もユニークな列を最初に持つ複合インデックスが最高のパフォーマンスを発揮しますが、次の場合は使用されません。

  • 個別の値がテーブルの数パーセントを超えています
  • 十分な行がありません
  • 日付の範囲が小さすぎます

の出力はexplain my_query何ですか?

于 2013-04-02T15:11:04.277 に答える