このネストされたSQLSELECTクエリを最適化する方法

jackthehipster

次のような非常に遅いクエリがあります。

SELECT  *
FROM    (
         SELECT ..., nn_key_fast(nachname) nnk, ...
         FROM   t1
           JOIN t2 ON
               ...
           JOIN t3 ON
               ...
           JOIN t4 ON
               ...
         WHERE  ...
         AND t4.POSTCODE='1234'
        )
WHERE  ... AND nnk LIKE "N%"

現在、内部選択には約2分かかります。最後のWHERE句(t4.POSTCODE)を削除すると、約4秒で実行されます。この句がない場合の結果は1000レコード未満になるため、非常に小さなセットになります。

したがって、私の考えは、その句を外部のSELECTに移動すると、結果の1000未満のレコードにのみ適用されるというものでした。

しかし、違います。クエリにはまったく同じ時間がかかるため、明確にするために次のようにします。

SELECT  *
FROM    (
         SELECT  .....
         FROM    t1
           JOIN  t2 ON
                 ...
           JOIN t3 ON
                 ...
           JOIN t4 ON
                 ...
         WHERE   ... 
        )
WHERE  ...
AND POSTCODE='1234'

最初のバージョンと同じ2分かかります。

これは私には非常識に思えます。

直感的には、これは次のようにクエリオプティマイザによって実行する必要があります。次のように内部選択からテーブルを作成します。

CREATE TABLE res_from_inner AS (
                                SELECT .....
                                FROM t1
                                  JOIN t2 ON
                                       ...
                                  JOIN t3 ON
                                       ...
                                  JOIN t4 ON
                                       ...
                                WHERE ... 
                               )

...次に、次のように、このテーブルでのみ外部選択を実行します。

SELECT  *
FROM    res_from_inner
WHERE   POSTCODE='1234'

また、これを手動で行うと、CREATE TABLEクエリには約4秒かかり、2番目のSELECTには予想どおり1秒未満かかります。

これはどのように可能であり、それに対して何をすべきですか?

ゴードン・リノフ

実際に何が起こっているかを確認するには、実行プランを確認する必要があります。何かが変わっています。

あなたが試みるかもしれない1つのことはCTEです:

with s as (
      <subquery here>
     )
select s.*
from s
where . . .;

Oracleはこれを自動的に実現する可能性があります。または、ヒントを与えることができます:

with s as (
      select /*+ materialize */ . . .
      . . .
     )
select s.*
from s
where . . .;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたMySQLクエリを最適化することはできませんか?

分類Dev

ネストされた条件付きSQLServerクエリ2008R2を最適化する方法

分類Dev

ネストされたクエリのSQL速度と最適化

分類Dev

ネストされたクエリの最適化

分類Dev

複数の左結合SQLSELECTクエリを最適化する方法は?

分類Dev

これらのネストされたループを最適化する方法は?

分類Dev

最適化:最も最適化された方法でクラスターのリストを作成します

分類Dev

リストの付属物を含むネストされたforループを最適化する方法は?

分類Dev

この遅いネストされたSQLケースクエリを高速化する方法

分類Dev

SQL選択の最適化ネストされたwhereクエリ

分類Dev

VBAを使用したExcelでのネストされたSQLSelectクエリ

分類Dev

関数スキャンとネストされたループの見積もりが遅くて悪い場合にPostgreSQLクエリを最適化する

分類Dev

ネストされたif句を最適化する方法はありますか?

分類Dev

SQLiteは外部制約によってネストされたクエリを最適化しますか

分類Dev

Pythonでネストされたforループを最適化する方法

分類Dev

ネストされた関係のための適切なCakePHPクエリを構築する方法

分類Dev

正規化されたデータベース構造でクエリを最適化する方法は?

分類Dev

このようにクエリを最適化する方法

分類Dev

このActiveRecordクエリを最適化する方法は?

分類Dev

この複雑なクエリを最適化する方法は?

分類Dev

この複雑なクエリを最適化する方法は?

分類Dev

SqlAlchemyでネストされたSQLSELECTを注文する方法

分類Dev

BASHスクリプトでファイル内のテキストを検索/検索するための最良の/最適化された方法

分類Dev

オブジェクトのネストされた配列からの配列構築を最適化する

分類Dev

タイムアウトを防ぐためにこのクエリを最適化する方法

分類Dev

このSQLクエリを実行するためのより良い、より最適化された方法はありますか?

分類Dev

AngularJS:ネストされたディレクティブを最適化する方法

分類Dev

最適化されたクエリを制限する

分類Dev

rのネストされたforループを最適化する

Related 関連記事

  1. 1

    ネストされたMySQLクエリを最適化することはできませんか?

  2. 2

    ネストされた条件付きSQLServerクエリ2008R2を最適化する方法

  3. 3

    ネストされたクエリのSQL速度と最適化

  4. 4

    ネストされたクエリの最適化

  5. 5

    複数の左結合SQLSELECTクエリを最適化する方法は?

  6. 6

    これらのネストされたループを最適化する方法は?

  7. 7

    最適化:最も最適化された方法でクラスターのリストを作成します

  8. 8

    リストの付属物を含むネストされたforループを最適化する方法は?

  9. 9

    この遅いネストされたSQLケースクエリを高速化する方法

  10. 10

    SQL選択の最適化ネストされたwhereクエリ

  11. 11

    VBAを使用したExcelでのネストされたSQLSelectクエリ

  12. 12

    関数スキャンとネストされたループの見積もりが遅くて悪い場合にPostgreSQLクエリを最適化する

  13. 13

    ネストされたif句を最適化する方法はありますか?

  14. 14

    SQLiteは外部制約によってネストされたクエリを最適化しますか

  15. 15

    Pythonでネストされたforループを最適化する方法

  16. 16

    ネストされた関係のための適切なCakePHPクエリを構築する方法

  17. 17

    正規化されたデータベース構造でクエリを最適化する方法は?

  18. 18

    このようにクエリを最適化する方法

  19. 19

    このActiveRecordクエリを最適化する方法は?

  20. 20

    この複雑なクエリを最適化する方法は?

  21. 21

    この複雑なクエリを最適化する方法は?

  22. 22

    SqlAlchemyでネストされたSQLSELECTを注文する方法

  23. 23

    BASHスクリプトでファイル内のテキストを検索/検索するための最良の/最適化された方法

  24. 24

    オブジェクトのネストされた配列からの配列構築を最適化する

  25. 25

    タイムアウトを防ぐためにこのクエリを最適化する方法

  26. 26

    このSQLクエリを実行するためのより良い、より最適化された方法はありますか?

  27. 27

    AngularJS:ネストされたディレクティブを最適化する方法

  28. 28

    最適化されたクエリを制限する

  29. 29

    rのネストされたforループを最適化する

ホットタグ

アーカイブ