下面的查询执行需要45秒。如何提高速度?
SELECT
u.i_UserID,
u.vch_LoginName,
ea.vch_EmailAddress,
u.vch_DisplayName,
'Current' As 'vch_RecordStatus'
FROM
tblUser u
LEFT JOIN [User].dbo.tblEmailAddress ea
ON u.i_EmailAddressID = ea.i_EmailAddressID
WHERE
IsNull(u.vch_LoginName, '') Like '%'
AND u.vch_DisplayName LIKE 'kala' -- 14 secs
UNION ALL -- 29 secs
SELECT
DISTINCT l.i_UserID
,l.vch_OldLoginName as vch_LoginName
,l.vch_OldEmailAddress as vch_EmailAddress
,u.vch_DisplayName as vch_DisplayName,
'Old' As 'vch_RecordStatus'
FROM tblUserStatusLog l
INNER JOIN tblUser u on u.i_UserID = l.i_UserID
WHERE
l.vch_OldLoginName Like '%'
AND u.vch_DisplayName LIKE 'kala' -- 28 secs
ORDER BY
u.vch_LoginName
答案 0 :(得分:3)
首先,为什么要使用LIKE
来比较字符串? LIKE
用于比较部分字符串,您应使用=
运算符来搜索完全匹配。
我也不明白两个where子句的第一个条件,你试图检查它们不是空字符串而不是null吗?更好地使用IS NOT NULL
和<>
运算符:
SELECT
u.i_UserID,
u.vch_LoginName,
ea.vch_EmailAddress,
u.vch_DisplayName,
'Current' As 'vch_RecordStatus'
FROM
tblUser u
LEFT JOIN [User].dbo.tblEmailAddress ea ON u.i_EmailAddressID = ea.i_EmailAddressID
WHERE
u.vch_LoginName is not null and u.vch_loginname <> ''
AND u.vch_DisplayName = 'kala'
UNION ALL
SELECT
DISTINCT l.i_UserID
,l.vch_OldLoginName as vch_LoginName
,l.vch_OldEmailAddress as vch_EmailAddress
,u.vch_DisplayName as vch_DisplayName,
'Old' As 'vch_RecordStatus'
FROM tblUserStatusLog l
INNER JOIN tblUser u on u.i_UserID = l.i_UserID
WHERE
l.vch_OldLoginName <> ''
AND u.vch_DisplayName = 'kala'
ORDER BY
u.vch_LoginName
除此之外,我假设您可以通过向表中添加适当的索引来显着提高性能,但我们需要您的表结构来查看已存在的内容。
但是你应该在前两个表i_EmailAddressID
上有索引,在第二个表上有i_userId
,而vch_OldLoginName,vch_displayName
上的索引也可以改善运行。
答案 1 :(得分:1)
你想看一下索引。当您打开实际执行计划运行此查询时,您是否收到任何缺少的查询提示?确保所有索引都针对此查询进行了优化,您将获得更好的性能。
您是否包含tblEmailAddress的完整路径,是否存储在另一个名为“User”的数据库中?如果是这样,您将希望减少从链接服务器中提取的数据量。同样,索引应该在这里帮助你。
您也不希望在where子句中进行计算。查看查询的SARGability。 https://en.wikipedia.org/wiki/Sargable这将告诉你为什么你的LIKE语句也是个坏主意。