大きなテーブルでの OFFSET を使用した遅い PostgreSQL クエリの最適化 大規模な PostgreSQL テーブルに対するクエリで OFFSET を使用すると、パフォーマンスのボトルネックが発生することがよくあります。この記事では、PostgreSQL 9.5 以降のバージョンの最適化戦略に焦点を当てて、この問題に取り組みます。 課題: 膨大な数のレコードを含む実質的なテーブル big_table を想像してください。 ORDER BY と OFFSET を使用してページ分割されたデータを取得する必要があります。適切なインデックス (vote_order_asc や vote_order_desc など) を使用しても、OFFSET の値が大きいとパフォーマンスが大幅に低下します。 解決策: キーセットのページネーション PostgreSQL は大きな OFFSET 値を持つ行を直接スキップできないため、ターゲット オフセットに到達する前にすべての行を順序付けしてカウントする必要があります。 これを解決するには、行値の比較を使用したキーセットのページネーションを使用します。 SELECT * FROM big_table WHERE (vote, id) > (vote_x, id_x) ORDER BY vote, id LIMIT n; このメソッドでは、一貫した結果を得るために (vote, id) の一意の組み合わせが必要です。ここでは vote_order_asc インデックスが有益であることがわかります。 重要な調整: ORDER BY 方向と WHERE 句の比較演算子の間の一貫性を維持します。 たとえば、WHERE が > を使用する場合、ORDER BY は ASC を使用する必要があります。 さらなる考慮事項: このキーセットのページネーションのアプローチではパフォーマンスが大幅に向上しますが、制限があることを認識することが重要です。 (vote, id)の一意性が仮定されます。 テーブルの同時更新により、最適な戦略を選択するためにさらなる分析が必要になる場合があります。 頻繁に変更が同時に行われる複雑なシナリオの場合、最も効果的な最適化アプローチを特定するには、より詳細な調査が重要です。