ホームページ > データベース > mysql チュートリアル > PostgreSQL の複合主キーを持つテーブルで SELECT DISTINCT が遅いのはなぜですか? 最適化するにはどうすればよいですか?

PostgreSQL の複合主キーを持つテーブルで SELECT DISTINCT が遅いのはなぜですか? 最適化するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-07 18:27:40
オリジナル
761 人が閲覧しました

PostgreSQL の複合主キーを使用するテーブルについて SELECT DISTINCT クエリ速度が遅い理由と最適化方法

Why is SELECT DISTINCT Slow on a Table with a Composite Primary Key in PostgreSQL, and How Can It Be Optimized?

PostgreSQL データベースでは、SELECT DISTINCT クエリの実行速度はテーブル構造とデータ分散に依存します。 tickers テーブルの product_id 列は複合主キーの一部であるため、その列にインデックスが付けられますが、SELECT DISTINCT product_id FROM tickers を使用して一意の product_id を取得するクエリは、デフォルトで順次スキャンを実行します。

パフォーマンスが遅い理由

のパフォーマンスが遅い主な理由は、テーブル内に product_id の重複した値があることです。これは、PostgreSQL が取得した一意の product_id ごとにテーブル全体をスキャンして、重複がないことを確認する必要があることを意味します。

解決策: インデックス スキップ スキャンをシミュレートします

PostgreSQL はまだインデックス スキップ スキャンをネイティブにサポートしていないため、再帰 CTE (共通テーブル式) を使用してこの動作をシミュレートできます。この CTE は重複の取得と破棄を繰り返し、一意の各 product_id の 1 つを除くすべてのインスタンスを効果的に除外します。

改善されたソリューション

<code class="language-sql">WITH RECURSIVE cte AS (
   (   -- 括号必需
   SELECT product_id
   FROM   tickers
   ORDER  BY 1
   LIMIT  1
   )
   UNION ALL
   SELECT l.*
   FROM   cte c
   CROSS  JOIN LATERAL (
      SELECT product_id
      FROM   tickers t
      WHERE  t.product_id > c.product_id  -- 横向引用
      ORDER  BY 1
      LIMIT  1
      ) l
   )
TABLE  cte;</code>
ログイン後にコピー

このクエリは水平結合を使用してソートされたテーブルを横断し、 orderBy を使用して一意の product_id 値を取得します。

結論

SELECT DISTINCT product_id クエリの実行時間は、CTE メソッドを使用してインデックス スキップ スキャンをシミュレートすることで大幅に改善され、それによって tickers テーブルから一意の product_id を取得するのに必要な時間を短縮できます。

以上がPostgreSQL の複合主キーを持つテーブルで SELECT DISTINCT が遅いのはなぜですか? 最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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