【发布时间】:2021-10-12 03:09:21
【问题描述】:
我有一个需要 15 秒才能执行的存储过程。数据库是 SQL Server 2008 R2。
SQL查询如下,
SELECT * FROM EmployeeSetA
UNION
SELECT * FROM EmployeeSetB
WHERE
Name+''+Id NOT IN (SELECT Name+''+Id FROM EmployeeSetA)
查询正在尝试联合 EmployeeSetA 和 EmployeeSetB,并确保在执行联合之前 EmployeeSetB 中的 Name 和 Id 不在 EmployeeSetA 中。
当我验证时,字符串连接导致 SQL 运行缓慢。有没有更好的方法?任何建议将不胜感激。
【问题讨论】:
-
更改为
NOT EXISTS ( SELECT * FROM EmployeeSetA A WHERE A.Name = EmployeeSetB.Name AND A.Id = EmployeeSetB.Id ) -
你确定是字符串连接吗?
UNION执行DISTINCT,它通常执行ORDER BY,这是一项昂贵的操作,尤其是在字符串上。 -
@Nick.McDermaid,在上面的 SQL 中,我没有看到 union 的缓慢性。我通过如下所示更改 SQL 得出的结论是字符串连接导致速度变慢, WHERE Name NOT IN (SELECT Name FROM EmployeeSetA) 当我删除字符串连接并仅使用一列进行验证时,它在 1 秒内执行。如果您有更好的方法/解决方案,请告知。
-
好的,您已经隔离了问题。我同意@Squirrel - 先试试他的解决方案。
-
@PhilCoulson,您能否举个例子说明如何做到这一点?
标签: sql sql-server-2008-r2 sql-optimization