【发布时间】:2014-03-20 09:02:38
【问题描述】:
我使用的是 SQL Server 2012,遇到了奇怪的问题。
这是我一直使用的原始查询:
DELETE FROM [TABLE_TEMP]
INSERT INTO [TABLE_TEMP]
SELECT H.*, NULL
FROM [TABLE_Accounts_History] H
INNER JOIN [TABLE_For_Filtering] A ON H.[RSIN] = A.[RSIN]
WHERE
H.[NUM] = (SELECT TOP 1 [NUM] FROM [TABLE_Accounts_History]
WHERE [RSIN] = H.[RSIN]
AND [AccountSys] = H.[AccountSys]
AND [Cl_Acc_Typ] = H.[Cl_Acc_Typ]
AND [DATE_DEAL] < @dte
ORDER BY [DATE_DEAL] DESC)
AND H.[TYPE_DEAL] <> 'D'
表 TABLE_Accounts_History 包含 3 200 000 条记录。
表 TABLE_For_Filtering 大约有 1 500 条记录。
Insert 花了我 2m 40s 并插入 1 600 000 条记录以供进一步工作。
但后来我决定从非常小的表格TABLE_Additional 中附加一列(仅在 100 左右):
DELETE FROM [TABLE_TEMP]
INSERT INTO [TABLE_TEMP]
SELECT H.*, P.[prof_type]
FROM [TABLE_Accounts_History] H
INNER JOIN [TABLE_For_Filtering] A ON H.[RSIN] = A.[RSIN]
LEFT JOIN [TABLE_Additional] P ON H.[ACCOUNTSYS] = P.[AccountSys]
WHERE H.[NUM] = ( SELECT TOP 1 [NUM]
FROM [TABLE_Accounts_History]
WHERE [RSIN] = H.[RSIN]
AND [AccountSys] = H.[AccountSys]
AND [Cl_Acc_Typ] = H.[Cl_Acc_Typ]
AND [DATE_DEAL] < @dte
ORDER BY [DATE_DEAL] DESC)
AND H.[TYPE_DEAL] <> 'D'
现在这个查询需要很长时间才能完成。为什么会这样?这么小的左连接怎么可能会降低性能?我该如何改进它?
更新:到目前为止,LEFT JOIN 运气不佳。索引,无索引,提示索引.. 现在我通过使用我的第一个查询和之后的 UPDATE 找到了一种解决方法:
UPDATE [TABLE_TEMP]
SET [PROF_TYPE] = P1.[prof_type]
FROM [TABLE_TEMP] A1
LEFT JOIN
[TABLE_Additional] P1
ON A1.[ACCOUNTSYS] = P1.[AccountSys]
只需要 5 秒,并且几乎与我一直在努力实现的目标相同。 SQL Server 的性能对我来说仍然是个谜。
【问题讨论】:
标签: sql-server join left-join