1

アップデート

これを聞くのは時期尚早だったと思います。さらにいくつかのテストを行った後、パフォーマンスが向上していないことがわかりました。さらにいくつかのテストを実行し、ここに更新を投稿します。それまでは、わざわざこれに答えないでください。

こんなお問い合わせがありました…

SELECT DISTINCT TOP 11 [Field_A] 
FROM   [#TempTable] 
WHERE  [Field_A] NOT IN (SELECT bo.[Id] 
                         FROM   [BusinessObject_Table] bo 
                         UNION 
                         SELECT boTemp.[Id] 
                         FROM   [#BusinessObject_Table] boTemp) 

このクエリは、かなりのデータ セットに対して実行するのに非常に時間がかかります。また、一時テーブルの Id 列に CLUSTERED インデックスを追加しました。これにより、パフォーマンスがいくらか向上しましたが、それでも完了しませんでした。

このクエリをこれに置き換えました...

SELECT DISTINCT TOP 11 [Field_A] 
FROM   [#TempTable] 
WHERE  [Field_A] NOT IN (SELECT bo.[Id] 
                         FROM   [BusinessObject_Table] bo) 
       AND [Field_A] NOT IN (SELECT boTemp.[Id] 
                             FROM   [#BusinessObject_Table] boTemp) 

これは数秒で完了しました。誰かがここで何が起こったのか説明できますか?

更新: 両方のクエリは同じだと思いました。これが必要です。

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

クエリの結果は次のようになります: 6 (上記のクエリの変更に注意してください)

クエリプランを取得して、ここに投稿しようとします。

4

2 に答える 2

3

クエリプランがない場合の推測...

サブクエリの UNION は、DISTINCT を強制します。個別の IN 句を使用すると、これを回避できます。ただし、ロジックはクエリ間で異なります(編集:Martin Smithが指摘したように)

UNION ALL と単一の IN を使用すると、これが必要なロジックであればより良いはずです

WHERE  [Field_A] NOT IN (SELECT bo.[Id] 
                     FROM   [BusinessObject_Table] bo 
                     UNION ALL
                     SELECT boTemp.[Id] 
                     FROM   [#BusinessObject_Table] boTemp)
于 2012-03-27T09:26:54.150 に答える
2

私はあなたがこのようにあなたの質問をするべきだと思います:

SELECT DISTINCT TOP 11 [Field_A] 
FROM   [#TempTable] 
WHERE NOT EXISTS(
  SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id
) AND NOT EXISTS(
  SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id
) 

このようにして、SQL Serverは、おそらくUNIONクエリよりも少し優れたオプティマイザを使用できます。オプティマイザが、インデックス作成戦略とテーブルサイズに基づいて、クエリを異なる順序で実行することを選択する可能性があります。ほとんどの場合、これを行うための最速の方法になります。ただし、テーブル構造とインデックスが表示され、実行プランがないと、確信が持てません。

于 2012-03-27T11:12:13.227 に答える