SQL Server 2012で2つの大きな結果セットを比較する最も効率的な方法は何ですか


9

2つの大きな結果/行セットを比較する最も効率的な方法に対する現在のアドバイスは、EXCEPT演算子を使用することです。以下のこの自己完結型SQLスクリプトは、行サイズが大きくなる(@last値を変更する)と、非常に非効率になります。結合されたテーブルで一意のエントリを見つけようとしましたが、改善はありませんでした。

DECLARE @first AS INT, @step AS INT, @last AS INT; 

-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible

-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)

DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END

DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END

select * from @temptableNEW
except
select * from @temptableOLD

回答:


8

EXCEPTDISTINCT操作を意味します。

NOT EXISTSこれが実際に必要ない場合に使用します。

ただし、発生している問題は、テーブル変数に関連付けられたカーディナリティの見積もりが低いため、インデックス付けされていないテーブルでネストされたループが発生している可能性があります。

select * from @temptableNEW
except
select * from @temptableOLD
OPTION (RECOMPILE)

テーブルにはそれぞれ100K行あることを考慮に入れて、異なる計画を立てることができます。

SQL Server 2012では、制約を介してのみテーブル変数にインデックスを追加できます。値が一意である場合、使用できます

DECLARE @temptableOLD TABLE ([Result1] int UNIQUE CLUSTERED);

インデックスを追加します。両方のテーブルで行われた場合、プラン(再コンパイルのヒントが追加された後)は、代わりにマージ結合を使用する可能性があります。インデックスがなければ、ハッシュ結合を期待します。


マーティン、ありがとう。これが答えです。OPTION(RECOMPILE)は役立ちました(5分間で100,000)が、両方のテーブルでUNIQUE CLUSTEREDが大幅に改善されました(7秒間で100,000 !!!)。これらのテーブルを作成したのは、2つの異なるSQLサーバーでテーブルのインデックス付けを制御できない実際の問題を示すためだけですが、そのようなテーブル変数を使用して管理します。
Will Healey、2015

4
@WillHealey #tempテーブルには、テーブル変数(統計、並列処理、より柔軟なインデックス作成)よりも多くの利点があるため、テーブル変数に制限されているコンテキストでこれを使用しない場合は、それらも試すことができます。
Martin Smith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.