2013-07-11 4 views
0

У меня есть процесс расчета ежедневного прогноза продаж в большой таблице в SQL Server 2008 R2 (назовем его Mothership). Каждый день я просматриваю CDC в транзакционных базах данных, чтобы извлечь изменения, вычислить прогноз дельты и объединить этот Delta с Mothership. Проблема в том, что производительность дико непоследовательна. Mothership имеет 25M строк, а Delta имеет 1 - 2M строк. Я видел производительность от 8 минут до часа для слияния.Повысить производительность оператора MERGE в SQL Server

'Слить утверждение довольно прямо вперед:

MERGE INTO Mothership AS tgt 
    USING Delta AS src 
    ON Mothership.Key1 = Delta.Key1 AND ... AND Mothership.Key4 = Delta.Key4 
    WHEN MATCHED AND Mothership.UpdateDate < Delta.UpdateDate 
     (UPDATE all data columns on Mothership) 
    WHEN NOT MATCHED 
     (INSERT into Mothership) 

У меня есть первичный ключ, определенный на Key1 к КЛЮЧ4 на каждом столе, а производительность по-прежнему противный. Есть ли ошибка в MERGE в отношении производительности?

+2

Можете ли вы опубликовать план выполнения? – MatBailie

ответ

1

Были обнаружены (и есть) некоторые ошибки, обнаруженные вокруг утверждения MERGE. Дэн Гусман определил некоторые ситуации, когда MERGE получает пострадавших от состояния гонки, подробности здесь http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx

и Аарон Бертран список вопросов в посте здесь http://www.sqlperformance.com/2013/02/t-sql-queries/another-merge-bug