1

に接続されたローカルマシンに2つのデータベースがありますlocalhost。どちらも1枚あたり約200万行あります。私は次の非常に単純な結合を行っていましたが、完了するまでに1分以上かかりました。

select distinct x.patid
    from [i 3 sci study].dbo.clm_extract as x
    left join [i 3 study].dbo.claims as y on y.patid=x.patid
    where y.patid is null

実行プランを見ると、joinshowplanオペレーターが次のように言っていることがわかりました。 ここに画像の説明を入力してください

両方のテーブルの実際の行数と比較して、実際の行数が非常に多いのはなぜですか?

4

1 に答える 1

3

LEFT JOIN、左側の各行を右側の各行と照合してから、フィルタリングします。どちらのテーブルでも一意ではないと仮定するとpatid、一致する可能性のある組み合わせの数が非常に多くなる可能性があります。

次のことを試してください。

SET NOCOUNT ON;
GO
CREATE TABLE #t1 (Id INT NOT NULL);
CREATE TABLE #t2 (Id INT NOT NULL);
GO

INSERT #t1 (Id)
VALUES (1);
GO 100

INSERT #t2 (Id)
SELECT Id FROM #t1;
GO

次に、左結合クエリフォームの実行プランを確認します。

SELECT *
FROM #t1
LEFT OUTER JOIN #t2 ON #t1.Id = #t2.Id
WHERE #t2.Id IS NULL;

実行プランを見ると、ハッシュ結合は10,000の実際の行を示しています(#t1から100 x#t2から100)。これは、次のT-SQL構文のいずれかを使用して存在(または存在しない)をチェックすることの利点を示しています。

SELECT #t1.Id
FROM #t1
WHERE NOT EXISTS (SELECT * FROM #t2 WHERE Id = #t1.Id);

-- #t2.Id must not contain any NULLs for this to be correct
SELECT #t1.Id
FROM #t1
WHERE Id NOT IN (SELECT #t2.Id FROM #t2);

-- Returns DISTINCT #t1 values
SELECT Id
FROM #t1
EXCEPT
SELECT Id 
FROM #t2;

存在の欠如をチェックすると、エンジンが短絡する可能性があります。これは、アンチセミジョインによるものです。最初の一致が見つかるとすぐに、次のレコードに移動します。詳細については、このブログ投稿を参照してください

于 2012-10-30T17:21:18.200 に答える