2

私がテーブルfooを持っているとしましょう:

CREATE TABLE FOO (
    FOO_ID INTEGER,
    STATUS INTEGER,
    RATING INTEGER,
    PRIMARY KEY ("FOO_ID")
)

ここで、ステータスは0から5の間であり、テーブルは行で埋められます。

次に、ステータスにインデックスを作成し、評価に別のインデックスを作成するとします。

CREATE INDEX ON FOO (STATUS);
CREATE INDEX ON FOO (RATING);

さて、私が見解を持っているとしましょう:

CREATE VIEW FOO_THREE_VIEW AS
  SELECT * 
  FROM FOO
  WHERE STATUS = 3;

fooのレコードを取得したい:STATUS = 3RATING = 5。次のクエリは、私が望む結果を私に与えるでしょう:

SELECT * FROM FOO WHERE STATUS = 3 AND RATING = 5;

しかし、次のクエリでも、必要な結果が得られます。

SELECT * FROM FOO_THREE_VIEW WHERE RATING = 5;

2つのクエリのうち、パフォーマンスに違いはありますか?最初のクエリは両方のインデックスの恩恵を受けていますか?2番目のクエリは両方のインデックスの恩恵を受けていますか?ビューにインデックスを作成してパフォーマンスを向上させることはできませんよね?CREATE INDEX ON FOO (STATUS, RATING)2つの別々のインデックスの代わりに、両方の列にインデックスがある場合、2つのパフォーマンスはどのように変化しますか?

質問は一般的なSQLの質問になる可能性があることは理解していますが、仕様が必要な場合は、PostgreSQLで具体的にどのように機能するかを知りたいと思います。

4

1 に答える 1

3

パフォーマンス(この場合は実行)の違いはありません。どのインデックスを使用するかは、データと統計に依存しEXPLAINます。データベースでどのインデックスが優先されるかを確認するために使用します。説明されているケースでは、2列のインデックスが最適です。

SQLPostgreSQLはビューをプレーンステートメントとして扱い、保存するため、ビューにインデックスを作成することはできません。ビューに対してクエリを発行すると、内部的に、計画が開始される前にクエリが書き換えられ、変換されます。PostgreSQLがリクエストを処理する方法の詳細については、ドキュメントをご覧ください。これは、現在活発に開発されているマテリアライズドビューで変更されます。

また、いつでもこのクエリまたはそのクエリがどのようEXPLAIN ANALYZEに処理されるかを検査し、ビューが含まれる場合と含まれない場合の実行プランを比較するために使用できます。

于 2013-02-19T07:53:05.520 に答える