PostgreSQL SELECT DISTINCT
パフォーマンスのボトルネック: ケーススタディ
この記事では、約 200 万レコードを含む PostgreSQL テーブルに対する SELECT DISTINCT
クエリで発生するパフォーマンスの問題について検証します。
コンテキスト
tickers
テーブルには、Coinbase Pro の「ティッカー」チャネルからのデータが保存されます。 複合主キーには product_id
列が含まれます。
パフォーマンスの問題
クエリ SELECT DISTINCT product_id FROM tickers
は、product_id
のインデックスにより良好なパフォーマンスが期待されました。 ただし、実行には一貫して 500 ~ 600 ミリ秒かかりました。
クエリプランの調査
EXPLAIN ANALYZE
は、クエリ プランナーがデフォルトで順次スキャンに設定され、product_id
インデックスを無視することを示しました。 インデックスの使用を強制してもパフォーマンスの問題は解決されませんでした。
インデックス最適化の試行
product_id
に専用のインデックスを作成しても、わずかな改善しか得られず、明示的にオーバーライドしない限り、プランナは依然として順次スキャンを優先します。
効果的な解決策: インデックス スキップ スキャン エミュレーション
実装されたソリューションは、横結合による再帰クエリを使用してインデックス スキップ スキャンをエミュレートします。このアプローチによりパフォーマンスが大幅に向上し、225 万行のデータセットでも実行時間が 0.75 ミリ秒に短縮されました。
概要
PostgreSQL には現在ネイティブ インデックス スキップ スキャン機能がありませんが、このエミュレーション技術によって解決されます。 この方法では、既存のインデックスを効果的に利用し、大きなテーブルに対する SELECT DISTINCT
クエリの連続スキャンによるパフォーマンスの低下を回避します。
以上がPostgreSQL の「SELECT DISTINCT」が非常に遅いのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。