sql >> データベース >  >> RDS >> PostgreSQL

パフォーマンスの違い:INNERJOINとWHERE句に配置された条件

    違いが見られる理由は、プランナーがまとめている実行プランによるものです。これは、クエリによって明らかに異なります(おそらく、2つのクエリを同じになるように最適化する必要があり、これはバグである可能性があります。 )。これは、プランナーが各ステートメントの結果を得るには特定の方法で機能する必要があると考えていることを意味します。

    JOIN内でそれを行う場合、プランナーはおそらくテーブルから選択し、「True」部分でフィルター処理してから、結果セットを結合する必要があります。これは大きなテーブルであるため、調べるデータが多く、インデックスを効率的に使用できないと思います。

    WHERE句でそれを行う場合、プランナーはより効率的なルート(つまり、インデックスベースまたは事前にフィルター処理されたデータセット)を選択していると思われます。

    2つの列にインデックスを追加することで、結合を同じくらい速く(速くはないにしても)機能させることができます(含まれている列と複数の列のインデックスがPostgresでまだサポートされているかどうかはわかりません)。

    要するに、プランナーは、結果セットに到達するために2つの異なるルートを選択するという問題であり、そのうちの1つは他のルートほど効率的ではありません。完全なテーブル情報とEXPLAINANALYZE情報がなければ、理由を知ることは不可能です。

    特定のクエリがこれを行う理由の詳細が必要な場合は、より多くの情報を提供する必要があります。ただし、その理由は、プランナーが別のルートを選択するためです。

    追加の読み物:

    http://www.postgresql.org/docs/current/static/explicit-joins.html

    スキミングしただけで、postgresプランナーは結合を最適化するために再注文しないようです。ステートメント内の結合の順序を変更して、同じパフォーマンスが得られるかどうかを確認してください...考えてみてください。




    1. columnA、ColumnB、またはColumnCの更新時にトリガーを起動します

    2. MySQLとMariaDBのHA-マスターマスターレプリケーションとGaleraクラスターの比較

    3. SQL Serverインデックスの後方スキャン:理解とパフォーマンスの調整

    4. NOW()の例– MySQL