Что быстрее / лучше: ОБНОВЛЕНИЕ ГДЕ В или MERGE? - PullRequest
2 голосов
/ 29 марта 2012

У меня есть таблица, TBL1, только с GUID.

У меня есть другая таблица, TBL2, в которой первичным ключом является GUID, а также есть некоторые другие столбцы.Я хочу обновить один из столбцов в таблице TBL2 в зависимости от того, указан ли GUID в TBL1.

Какой из следующих запросов быстрее и / или надежнее использовать для этого?

MERGE INTO [db].[dbo].[TBL1] AS target
    USING [db].[dbo].[TBL2] as source
        ON target.GUID = source.GUID
    WHEN MATCHED THEN
        UPDATE SET
            StatusColumn = 0;

или

UPDATE [db].[dbo].[TBL1]
    SET StatusColumn=0
    WHERE GUID IN (SELECT GUID FROM [db].[dbo].[TBL2])

или, может быть, что-то еще?

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Ответ на этот вопрос может прийти только из плана выполнения.Из плана, который вы опубликовали (http://i.imgur.com/6vB2t.png), мы можем видеть следующее:

  • IN создает левое полу соединение. Это немного более эффективно. Есть также оптимизаторСлабость, которая заставляет оптимизатор не генерировать полусоединение из явного объединения, даже если оно может.
  • Слияние - это сортировка строк. Это потому, что вы можете получить дубликаты из вашего объединения!так быстро.
  • Я полагаю, что явная версия соединения является такой же быстрой, как и слияние.

Диагностировать это без плана - просто догадка. Посмотрите на план и / или показатель.измерение дает ответ, но план дает понимание ответа.

1 голос
/ 30 марта 2012

Я думаю, что самым быстрым способом, вероятно, будет третий вариант с использованием объединения:

UPDATE t1 SET StatusColumn=0
FROM db.dbo.TBL1 t1
INNER JOIN db.dbo.TBL2 t2 ON t1.guid = t2.guid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...