Rozważ następujące zapytanie:
MERGE [Parameter] with (rowlock) AS target
USING (SELECT @AreaId, @ParameterTypeId, @Value)
AS source (AreaId, ParameterTypeId, Value)
ON (target.AreaId = source.AreaId AND
target.ParameterTypeId = source.ParameterTypeId)
WHEN MATCHED THEN
UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
WHEN NOT MATCHED THEN
INSERT ([AreaId], [ParameterTypeId], [Value])
VALUES (source.AreaId, source.ParameterTypeId, source.Value);
Statystyka we / wy daje następujące wyniki:
Tabela „ParameterType”. Liczba skanów 0, logiczne odczyty 2, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0.
Tabela „Obszar”. Liczba skanów 0, logiczne odczyty 2, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0.
Tabela „Parametr”. Liczba skanów 1, logiczne odczyty 4, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0.
Tabela „Tabela robocza”. Liczba skanów 1, logiczne odczyty 0, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0.
Stół roboczy pojawia się w zakładce wiadomości, co sprawia, że myślę, że używa tempdb MERGE
.
W planie wykonania nie widzę niczego, co wskazywałoby na potrzebę użycia tempdb
Czy MERGE
zawsze używa tempdb?
Czy w BOL jest coś, co tłumaczy to zachowanie?
Czy użycie INSERT
i UPDATE
byłoby szybsze w tej sytuacji?
Lewo
Dobrze
Oto struktura tabeli
tempdb
. Wydaje się dziwne, że jest tam dla jednego rzędu. Myślę, że może tam być do ochrony Halloween.