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

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

Linda Hamilton
リリース: 2025-01-02 12:38:39
オリジナル
377 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート