3

テーブル変数を使用する方が、内部結合 (選択) を使用するよりも多かれ少なかれパフォーマンスが高いかどうか疑問に思っています
例:

DECLARE @tab TABLE(Id int)  
INSERT INTO @tab  
SELECT Id  
FROM SomeTable  
WHERE SomeDate = "10 DAYS AGO" 

SELECT *
FROM SomeOtherTable
INNER JOIN @tab t
ON SomeOtherTable.id = t.id  

--VERSUS--

SELECT *  
FROM SomeOtherTable  
INNER JOIN (SELECT Id FROM SomeTable WHERE SomeDate = "10 DAYS AGO") t  
ON SomeOtherTable.id = t.id

大規模なクエリの場合、同じ結合を数回行う必要がある場合、最初の結合の方が維持しやすいですが、最もパフォーマンスが高いのはどれでしょうか?

ご挨拶

4

1 に答える 1

7

SQL Server は、テーブル変数の詳細な統計を維持したり、カーディナリティ情報の変更を (TF 2453 なしで) 反映するように自動的に再コンパイルしたりしないため、通常は単一の行を出力すると想定します。

これは、最適でない結合戦略が得られる場合があることを意味します。2 番目のバージョンでは、統計を使用でき、中間結果を一時オブジェクトに挿入するオーバーヘッドも回避できます。

ただし、2 番目のクエリがSomeDateインデックス化されていないために評価にコストがかかる場合は、これを事前に具体化することでパフォーマンスが向上する可能性があります (繰り返し再評価する場合と比較して)。

#tempこれにより統計の問題が回避されるため、テーブルの使用を検討することもできます。JOIN でテーブル変数を使用しないことを提案する人もいます

于 2011-10-11T09:46:30.983 に答える