web-dev-qa-db-ja.com

クエリ最適化の「品質」はデータベースプロバイダーによって異なりますか?

私は、「それが起こる」ことを除いて、どのデータベースでもクエリの最適化について明確に理解していません。 CTEは一度しか評価されないため、PostgreSQL CTEを使用する際の落とし穴について説明している "medium"ポスト を見たところです。 CTEが使用されている場合、データベースは適用できません。

しかし、ブログ投稿の例は、最適化するのは簡単です。

SELECT * FROM foo WHERE id = 500000;

WITH cte AS (
  SELECT * FROM foo
)
SELECT * FROM cte WHERE id = 500000;

CTEの計算が最初の要件で遅延して行われる場合、これら2つのクエリは同じ方法で最適化できると思います(少なくとも私は思います)。

SQL Serverはpostgresよりもこのようなクエリを最適化できるでしょうか?

クエリを最適化する際のデータベースの範囲/能力について、既知の違いはありますか?

5
Zach Smith

「良い」「悪い」という質問は個人的な意見の対象となるので、これを塩味のあるものと考えてください。クエリオプティマイザーの動作に関する質問は、質問のような非常に単純なクエリとは異なり、複雑な状況での動作が異なるため、通常は非常に広範囲です。

Postgresの場合、CTEは(Postgres 11以降)いわゆる "最適化フェンス" です。つまり、Postgresはクエリ全体とは無関係にCTEを最適化します。これが「より良い」(=より速い)計画につながるケースもあれば、「悪い」(=より遅い)計画につながるケースもあります(最近、この設計決定に関する議論が再び始まったため、多分これはPostgres 11)以降の将来のバージョンで変更されるでしょう。

あなたの質問の例は、外部クエリの条件がCTEにプッシュされないため、このアプローチが「悪い」計画になる例です。

SQL ServerはCTEを含むクエリ全体を最適化するため、この例では、SQL Serverの実行プランは「優れている」と見なされます。

しかし、Postgresでは反対のことも見ました。(重要でない)クエリの一部をCTEに移動すると、notプッシュダウンされた結果、より良い見積もりとはるかに「より良い」(=より速い)実行計画が得られました。 SQL Serverはほとんど使用していないため、同じような状況があるかどうかはわかりません。

はい、クエリの最適化は、データベースベンダー(Oracle、SQL Server、Postgres、MySQLなど)の間だけでなく、同じデータベースの異なるバージョンの間でも異なります。たとえば、SQL Server 2017にはSQL Server 2016とは異なる機能があります。

4
Brent Ozar

これら2つのクエリは同じ方法で最適化できると思います

そして、なぜあなたはこれを仮定しますか?ほとんどの場合:

  • クエリオプティマイザーは複雑です
  • 彼らはしばしばグリーンフィールドではありません-彼らは時間とともに成長します。

異なるステートメントがクエリオプティマイザーの異なる領域にヒットする場合があります。これらは広範な研究のトピックであるため、データベース間でも大幅に異なります。

1
TomTom