次のようなテーブルがあります。
Name | TimeA | TimeB | ValueA | ValueB
そして、私は次のようにいくつかのMERGE
操作を実行しています:
CREATE TABLE #TEMP1...
INSERT INTO #TEMP1
SELECT Name, Value
FROM dbo.AnotherTable
WHERE ...
MERGE INTO dbo.MyTable AS Target
USING (SELECT Name, Value FROM #TEMP1) AS Source
ON Target.Name = Source.Name
AND Target.TimeA = @TimeA
WHEN MATCHED THEN
UPDATE SET ValueA = Value
WHEN NOT MATCHED THEN
INSERT (Name, TimeA, TimeB, ValueA)
VALUES (Source.Name, @TimeA, @TimeB, Value)
クエリ実行プランには、次のように記載されています。
MERGE -> Table Merge 3% -> Compute Scalar 0% ->
Top 0% -> Compute Scalar 0% -> Compute Scalar 0% ->
Nested Loops (Left Outer Join) 0% <- Constant Scan 0%
^
|
|
--- Compute Scalar 0% <- Table Spool (Kager Spool) 12% <- Table Scan 86%
ただし、この計画では、インデックスによってパフォーマンスが向上することはわかりません。非クラスター化インデックスが(Name,TimeA)
パフォーマンスを向上させるはずだと考えています。このような MERGE クエリのパフォーマンスを達成するためのより良い方法はありますか?
EDIT 1:テーブルのサイズに注意する必要があります。平均して、ソースには常に平均で 30 ~ 70 行が含まれ、ターゲットには 3,000 万行を超える行が含まれます。