Sql Server查询占用了太多时间

时间:2016-05-03 07:42:30

标签: sql-server

下面的查询执行需要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

2 个答案:

答案 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语句也是个坏主意。