一時テーブルを使用する以外に、個別の手順でフィルタリング/ソートする方法はありますか?

ティガー

長時間実行されているSQLクエリがあります。

私が見つけたのは、フィルターを一緒に計算するよりも個別に計算する方が速いということです。

例:

SELECT ...
FROM Foo 
WHERE Cond1 AND Cond2 

よりもはるかに遅い(例:1秒対2分)

SELECT ...
INTO Tmp
FROM Foo 
WHERE Cond1

SELECT ...
FROM Foo 
INNER JOIN Tmp ON ...
WHERE Cond2

SQLが各フィルターを個別に実行するように指定する別のよりクリーンな方法はありますか?(私の例のように一時テーブルを使用する以外)


編集:

誰かがテーブルとクエリについてもっと情報を求めました:

SELECT d.IdDocument
FROM Document d
WHERE ((d.IdDocument IN (SELECT ex.RefDocument FROM ExternalKey ex WHERE ex.FieldB = 60))) 

SELECT d.IdDocument
FROM Document d
WHERE
((d.FieldA IN (SELECT Id FROM PARAM0)) AND ((d.IdDocument IN (SELECT ex.RefDocument FROM ExternalKey ex WHERE ex.FieldB = 60 AND ex.FieldC IN (SELECT Id FROM PARAM1))))) OR 
((d.FieldA IN (SELECT Id FROM PARAM2)) AND ((d.IdDocument IN (SELECT ex.RefDocument FROM ExternalKey ex WHERE ex.FieldB = 61 AND ex.FieldC IN (SELECT Id FROM PARAM3))))) OR
((d.FieldA IN (SELECT Id FROM PARAM4)) AND ((d.IdDocument IN (SELECT ex.RefDocument FROM ExternalKey ex WHERE ex.FieldB = 62 AND ex.FieldC IN (SELECT Id FROM PARAM5))))) OR 
((d.FieldA IN (SELECT Id FROM PARAM6)) AND ((d.IdDocument IN (SELECT ex.RefDocument FROM ExternalKey ex WHERE ex.FieldB = 59 AND ex.FieldC IN (SELECT Id FROM PARAM7)))))
  • ドキュメント:13.000.000行。IdDocumentは、クラスター化された主キーです。FieldAにはインデックスがあります。
  • 外部キー:49.000.000行。(FieldB、FieldC)には、RefDocument列を含むインデックスがあります。RefDocumentは、IdDocumentを参照する外部キーです。

PARAMは、TVPを使用して入力される一時テーブルです。

これらの2つのクエリは非常に高速です(1秒未満)。ただし、ANDを使用して両方のWHERE条件を組み合わせて単一のクエリを作成すると(適切な括弧を追加すると)、永久に実行されます。

私が試したのは、ExternalKeyテーブルに一度だけ参加することです(そして「d.IdDocumentIN」の部分を取り除きます)が、それは遅いです(例:実行の数分)

例:

SELECT COUNT(distinct d.IdDocument)
FROM Document d
INNER JOIN ExternalKey ex ON ex.RefDocument = d.IdDocument
WHERE (
    (d.FieldA IN (SELECT Id FROM PARAM0) AND ex.FieldB = 60 AND ex.FieldC IN (SELECT Id FROM PARAM1)) OR
    (d.FieldA IN (SELECT Id FROM PARAM2) AND ex.FieldB = 61 AND ex.FieldC IN (SELECT Id FROM PARAM3)) OR 
     ...
デロビー

元の例は示していますがcond1 AND cond2、完全な例は多くのOR状況を示しているようです。IMHOANDを使用すると、サーバーは最初に最も制限の厳しいサ​​ーバーを選択してそこから開始できますが、経験上、MSSQLはあまり好きではなくORIN()オペレーターもあまり好きではありません。これは、実際に直面している問題である可能性があります。

回避するには、ORを使用できますUNION ALL(またはUNION、2倍になると予想される場合)。回避するには、IN()を使用できますWHERE EXISTS()

次に、次の線に沿って何かを取得します。

SELECT d.IdDocument
  FROM Document d
 WHERE EXISTS (SELECT * FROM PARAM0 p0 WHERE p0.id = d.FieldA) 
   AND EXISTS (SELECT * FROM ExternalKey ex JOIN PARAM1 p1 ON p1.id = ex.FieldC WHERE ex.fieldB = 60 AND ex.RefDocument = d.IdDocument)

 UNION ALL

SELECT d.IdDocument
  FROM Document d
 WHERE EXISTS (SELECT * FROM PARAM2 p2 WHERE p2.id = d.FieldA) 
   AND EXISTS (SELECT * FROM ExternalKey ex JOIN PARAM3 p3 ON p3.id = ex.FieldC WHERE ex.fieldB = 60 AND ex.RefDocument = d.IdDocument)

 UNION ALL
 ...

PS:SELECT Id FROM PARAM0TSQLでどのように行うのかもよくわかりませんか?SQLにも、これらの「テーブルパラメータ」で何が期待されているかを理解するのに問題があるためである可能性がありますか?

-更新-

元の質問をざっと読むのは悪いです。あなたはこれらがTVPだと言います。ドキュメントから

テーブル値パラメーターは、UNIQUEまたはPRIMARYKEY制約をサポートするためにのみ索引付けできます。SQL Serverは、テーブル値パラメーターの統計を維持しません。

これらの統計がないため、オプティマイザーが最適なプランを選択するのが非常に困難になる可能性があると思います。それらを最初に#tempテーブルにダンプし、それらを使用する前にそれらにインデックスを追加することはオプションではありませんか?

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

列挙してチェックする以外に、クラスでサブビューをフィルタリングする別の方法はありますか?

分類Dev

テーブルの結合とテーブルのフィルタリング時に存在するものに違いはありますか?

分類Dev

netflix zuulルーティングフィルターでhttpリクエストメソッドを変更する方法はありますか?

分類Dev

特定の値に基づいてデータフレームをフィルタリングするだけでなく、パンダを使用して一意の識別子の他のすべての値を保持する方法はありますか?

分類Dev

CRUD以外のルート(Rails)でもリソースルーティングを使用する必要がありますか?

分類Dev

EFインクルードテーブルから取得するときにレコードをフィルタリングする方法はありますか

分類Dev

別のモブレットのメルを使用してモブレットをフィルタリングする方法はありますか?

分類Dev

Outlook ミーティング招待状の招待者リストをアルファベット順に並べる方法はありますか?

分類Dev

タイムスタンプフィールド順に並べられた個別のIDを見つけるには、mongodbネイティブドライバーを使用する必要があります

分類Dev

ソングリストにhtmlテーブルまたはdivを使用する必要がありますか?

分類Dev

VueルーターでHTMLファイルにルーティングする方法はありますか?

分類Dev

SSIS-フラットテーブルからデータをフィルタリングする方法はありますか?

分類Dev

GoでMySQL一時テーブルを使用する方法はありますか?

分類Dev

Where句を使用せずにレコードをフィルタリングする別の方法はありますか

分類Dev

特定のグループによる重複/繰り返しエントリを含まないフィルタリングする方法はありますか?

分類Dev

HTMLドキュメントのデータをフィルタリングする方法はありますか?

分類Dev

セキュリティグループ内のIPを個別にホワイトリストに登録するよりも、WPFアプリがAWS RDSに接続できるようにするためのより良い方法はありますか?

分類Dev

配列をフィルタリングまたはソートするための年の範囲を指定する方法はありますか?

分類Dev

一度に複数のvimフォールディング方法を使用する方法はありますか?

分類Dev

Rの別のDataFrameに格納されている一意の変数でDataFrameをフィルタリングする方法はありますか?

分類Dev

パスワードのハッシュ+ソルトを作成するときに、ソルトをデータベースの個別のフィールドとして保存しないようにする方法はありますか

分類Dev

正しい外部キーのdjangoフォームでクエリセットを動的にフィルタリングする方法はありますか?

分類Dev

Pythonで2つのデータ行をフィルタリングする方法はありますか?

分類Dev

ツイートのフィルタリングに使用されていない単語をツイートから取得する方法はありますか?

分類Dev

Djangoテンプレートでタグとフィルターの使用を制限する方法はありますか?

分類Dev

WTForms:オブジェクトの各フィールドを個別にバインドしています。オブジェクトをフォームに一度にバインドする方法はありますか?

分類Dev

APIを使用してAzureDevops内の場所で(ソースブランチからの)プルリクエストファイルを一覧表示する方法はありますか?C#を使用する他の方法はありますか?

分類Dev

ローカル以外のタイムゾーンで日時オブジェクトをインスタンス化する方法はありますか?

分類Dev

ローカル以外のタイムゾーンで日時オブジェクトをインスタンス化する方法はありますか?

Related 関連記事

  1. 1

    列挙してチェックする以外に、クラスでサブビューをフィルタリングする別の方法はありますか?

  2. 2

    テーブルの結合とテーブルのフィルタリング時に存在するものに違いはありますか?

  3. 3

    netflix zuulルーティングフィルターでhttpリクエストメソッドを変更する方法はありますか?

  4. 4

    特定の値に基づいてデータフレームをフィルタリングするだけでなく、パンダを使用して一意の識別子の他のすべての値を保持する方法はありますか?

  5. 5

    CRUD以外のルート(Rails)でもリソースルーティングを使用する必要がありますか?

  6. 6

    EFインクルードテーブルから取得するときにレコードをフィルタリングする方法はありますか

  7. 7

    別のモブレットのメルを使用してモブレットをフィルタリングする方法はありますか?

  8. 8

    Outlook ミーティング招待状の招待者リストをアルファベット順に並べる方法はありますか?

  9. 9

    タイムスタンプフィールド順に並べられた個別のIDを見つけるには、mongodbネイティブドライバーを使用する必要があります

  10. 10

    ソングリストにhtmlテーブルまたはdivを使用する必要がありますか?

  11. 11

    VueルーターでHTMLファイルにルーティングする方法はありますか?

  12. 12

    SSIS-フラットテーブルからデータをフィルタリングする方法はありますか?

  13. 13

    GoでMySQL一時テーブルを使用する方法はありますか?

  14. 14

    Where句を使用せずにレコードをフィルタリングする別の方法はありますか

  15. 15

    特定のグループによる重複/繰り返しエントリを含まないフィルタリングする方法はありますか?

  16. 16

    HTMLドキュメントのデータをフィルタリングする方法はありますか?

  17. 17

    セキュリティグループ内のIPを個別にホワイトリストに登録するよりも、WPFアプリがAWS RDSに接続できるようにするためのより良い方法はありますか?

  18. 18

    配列をフィルタリングまたはソートするための年の範囲を指定する方法はありますか?

  19. 19

    一度に複数のvimフォールディング方法を使用する方法はありますか?

  20. 20

    Rの別のDataFrameに格納されている一意の変数でDataFrameをフィルタリングする方法はありますか?

  21. 21

    パスワードのハッシュ+ソルトを作成するときに、ソルトをデータベースの個別のフィールドとして保存しないようにする方法はありますか

  22. 22

    正しい外部キーのdjangoフォームでクエリセットを動的にフィルタリングする方法はありますか?

  23. 23

    Pythonで2つのデータ行をフィルタリングする方法はありますか?

  24. 24

    ツイートのフィルタリングに使用されていない単語をツイートから取得する方法はありますか?

  25. 25

    Djangoテンプレートでタグとフィルターの使用を制限する方法はありますか?

  26. 26

    WTForms:オブジェクトの各フィールドを個別にバインドしています。オブジェクトをフォームに一度にバインドする方法はありますか?

  27. 27

    APIを使用してAzureDevops内の場所で(ソースブランチからの)プルリクエストファイルを一覧表示する方法はありますか?C#を使用する他の方法はありますか?

  28. 28

    ローカル以外のタイムゾーンで日時オブジェクトをインスタンス化する方法はありますか?

  29. 29

    ローカル以外のタイムゾーンで日時オブジェクトをインスタンス化する方法はありますか?

ホットタグ

アーカイブ