ホームページ >データベース >mysql チュートリアル >Postgres はテーブル全体をスキャンせずにグループごとの MAX クエリを最適化できますか?

Postgres はテーブル全体をスキャンせずにグループごとの MAX クエリを最適化できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-02 12:38:39402ブラウズ

Can Postgres Optimize Groupwise MAX Queries Without a Full Table Scan?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。