【发布时间】:2013-03-11 15:02:06
【问题描述】:
我有如下合并语句
MERGE DESTINATION AS DST
USING ( SELECT <Some_Columns> FROM TABLEA WITH(NOLOCK) INNER JOIN TableB .....
) AS SRC
ON(
<some conditions>
)
WHEN MATCHED THEN
UPDATE SET column1 = src.column1
...............
,Modified_By = @PackageName
,Modified_Date = GETDATE()
WHEN NOT MATCHED THEN
INSERT (<Some_Columns>)
VALUES(<Some_Columns>)
OUTPUT
$action, inserted.key'inserted'
INTO @tableVar
;
对于第一组记录(大约 300,000 条),它运行良好,只需 30 秒即可执行。 但是第二组记录(大约 300,000 条)需要一个多小时。
两天前,我已经加载了 50 个这样的集合,并且同一个查询运行得非常快,但从今天开始,它变得非常慢。我不知道出了什么问题。
注意:查询
从 TABLEA 中选择 WITH(NOLOCK) INNER JOIN TableB .....
在所有场景中都需要 20 秒。
【问题讨论】:
-
您是否在
sys.dm_exec_requests中检查了blocking_session_id或wait_type_desc?这里的任何人都很难猜到为什么要花很长时间。 -
另外你可能要小心
MERGE- 我不想听起来像小鸡,但我在这篇文章的底部强调了十二个尚未解决的错误: sqlperformance.com/2013/02/t-sql-queries/another-merge-bug -
@AaronBertrand +1 提及链接。现在我相信我应该改变我的查询而不是挖掘这个问题。 :)
标签: sql-server-2008-r2 merge-statement