ホームページ > データベース > mysql チュートリアル > 過剰なテーブル スキャンを避けるために、Postgres でグループごとの最大クエリ数を最適化するにはどうすればよいでしょうか?

過剰なテーブル スキャンを避けるために、Postgres でグループごとの最大クエリ数を最適化するにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-12-29 06:40:11
オリジナル
178 人が閲覧しました

How Can We Optimize Groupwise Maximum Queries in Postgres to Avoid Excessive Table Scans?

グループごとの最大クエリの最適化

問題のクエリは、レコード テーブル内の各一意の option_id の最大 ID 値を持つ行を取得することを目的としています。 。ただし、現在の実装では、過度のテーブル スキャンによる非効率性が見られます。

現在のクエリが非効率である理由

問題は、行を識別するために使用されるネストされたループ結合にあります。最大 ID 値。この結合では、Postgres がレコード テーブル全体を数回スキャンする必要があり、実行時間とリソース消費量が増加します。

ルックアップ テーブルを使用した代替アプローチ

このクエリを最適化するにはの場合は、別のアプローチをお勧めします。それは、オプション ID をレコード テーブル内の最大 ID にマップするオプションと呼ばれる別のルックアップ テーブルを作成することです。 records.option_id と options.option_id の間に外部キー制約を導入すると、参照整合性が保証されます。

CREATE TABLE options (
  option_id int PRIMARY KEY,
  option text UNIQUE NOT NULL
);

INSERT INTO options (option_id, option)
SELECT DISTINCT option_id, 'option' || option_id
FROM records;
ログイン後にコピー

相関サブクエリを使用した最適化されたクエリ

オプション テーブルが設定されている場合、元のクエリは、option_id に基づいて 2 つのテーブルを効率的に結合する相関サブクエリを使用して書き換えることができます。

SELECT o.option_id, (SELECT MAX(id) FROM records WHERE option_id = o.option_id) AS max_id
FROM options o
ORDER BY o.option_id;
ログイン後にコピー

代替アプローチの利点

この代替アプローチには、いくつかの利点があります。

  • アクセスするだけでテーブル スキャンが削減されます。オプション テーブル内の関連する行。
  • 効率的な相関関係を利用します。レコードから最大 ID 値を取得するためのサブクエリ。
  • 外部キー制約により参照整合性を維持します。

追加の最適化

(option_id, id DESC NULLS LAST) のレコード テーブルへのインデックスを許可することで、パフォーマンスをさらに向上させることができます。 Postgres はサブクエリのインデックスのみのスキャンを実行します。

以上が過剰なテーブル スキャンを避けるために、Postgres でグループごとの最大クエリ数を最適化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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