Postgres はすべての行をスキャンせずにグループごとの最大クエリを最適化できますか?
Postgres には、グループ クエリを効率的に最大化するための直接的なアプローチがありません。指定された環境で観察された高価なフルテーブルスキャンquery.
解決策
過剰なスキャンを回避するには、オプションのルックアップ テーブルを利用し、option_id を介してレコード テーブルにリンクすることを検討してください。これらのテーブル間に外部キー制約を確立すると、参照整合性が維持されます。
SQL FOR LOOKUP TABLE CREATION:
CREATE TABLE options ( option_id int PRIMARY KEY , option text UNIQUE NOT NULL );
既存のレコードからのデータ挿入テーブル:
INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;
サブクエリを使用した最適化されたクエリ:
SELECT option_id, (SELECT max(id) FROM records WHERE option_id = o.option_id) AS max_id FROM options o ORDER BY 1;
または、最適化されたサブクエリで最大 ID を取得できます:
SELECT option_id, (SELECT id FROM records WHERE option_id = o.option_id ORDER BY id DESC NULLS LAST LIMIT 1) AS max_id FROM options o ORDER BY 1;
クエリに最適なインデックスパフォーマンス:
CREATE INDEX ON records (option_id, id DESC NULLS LAST);
この最適化されたアプローチでは、ルックアップ テーブルとプライマリ テーブルの両方に対してインデックス スキャン、さらにはインデックスのみのスキャンを利用することでクエリの実行が大幅に向上し、その結果、フル テーブル スキャンと比較して優れたパフォーマンスが得られます。 .
以上がPostgres はテーブル全体をスキャンせずにグループごとの MAX クエリを最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。