为什么此sql查询运行得这么慢?大表,带有详细的字符串过滤器

问题描述 投票:0回答:1

下面的查询正在〜20000行表上运行。每个客户都有1-3个客户联系人。尽管仅返回11行,但该特定查询仍需要6秒钟以上才能运行。哪一部分在杀死它?

SELECT C.Id,
       CASE
           WHEN CT.Name = 'Residential' THEN ISNULL(CC.FirstName, '') + ' ' + ISNULL(CC.LastName, '')
           ELSE C.CompanyName
       END AS FullName,
       C.CustomerTypeId,
       CT.Name,
       ISNULL(CC.PhoneNumber, '') AS PhoneNumber,
       A.City,
       S.Name,
       A.Street,
       A.Zip,
       C.TaxExempt,
       C.Active,
       ISNULL(C.CompanyName, '') AS CopmanyName,
       ISNULL(CC.FirstName, '') AS CustomerContactFirstName,
       ISNULL(CC.LastName, '') AS CustomerContactLastName
FROM [dbo].[Customer] C
JOIN Address A ON A.Id = C.AddressId
JOIN State S ON A.StateId = S.Id
JOIN CustomerType CT ON CT.Id = C.CustomerTypeId
LEFT OUTER JOIN CustomerContact CC ON CC.CustomerId = C.Id
AND CC.Active = 1
AND CC.[Primary] = 1
WHERE (0 = 1
       OR C.Active = 1)
 AND
    (CT.Name +'|'+ ISNULL(CC.PhoneNumber,'') +'|'+ S.Name +'|'+ LTRIM(A.Street) + '|' + LTRIM(A.Zip)       
            + CASE WHEN CT.Name = 'residential' THEN LTRIM(RTRIM(ISNULL(CC.FirstName, ''))) + ' ' + LTRIM(RTRIM(ISNULL(CC.LastName, ''))) ELSE '' END
            + CASE WHEN CT.Name != 'residential' THEN LTRIM(C.CompanyName) ELSE '' END
            + CASE WHEN C.TaxExempt = 1 THEN 'tax Exempt' ELSE '' END
            + CASE WHEN C.TaxExempt = 0 THEN 'taxable' ELSE '' END
            + CASE WHEN C.Active = 1 THEN 'active' ELSE '' END
            + CASE WHEN C.Active = 0 THEN 'not active' ELSE '' END
    )
    LIKE '%' + CASE WHEN lower('jake') = 'null' THEN '' ELSE lower('jake') END + '%'
ORDER BY FullName
OFFSET 0 ROWS       -- skip rows
FETCH NEXT 150 ROWS ONLY; -- take rows
sql sql-server
1个回答
0
投票

基本类似的陈述总是会浪费时间在下面的case语句查询中,无论哪个记录匹配case条件,它都将首先返回,因此无需搜索其他条件希望你能得到答案

            SELECT C.Id,
                       CASE
                           WHEN CT.Name = 'Residential' THEN ISNULL(CC.FirstName, '') + ' ' + ISNULL(CC.LastName, '')
                           ELSE C.CompanyName
                       END AS FullName,
                       C.CustomerTypeId,
                       CT.Name,
                       ISNULL(CC.PhoneNumber, '') AS PhoneNumber,
                       A.City,
                       S.Name,
                       A.Street,
                       A.Zip,
                       C.TaxExempt,
                       C.Active,
                       ISNULL(C.CompanyName, '') AS CopmanyName,
                       ISNULL(CC.FirstName, '') AS CustomerContactFirstName,
                       ISNULL(CC.LastName, '') AS CustomerContactLastName
                FROM [dbo].[Customer] C
                JOIN Address A ON A.Id = C.AddressId
                JOIN State S ON A.StateId = S.Id
                JOIN CustomerType CT ON CT.Id = C.CustomerTypeId
                LEFT OUTER JOIN CustomerContact CC ON CC.CustomerId = C.Id
                AND CC.Active = 1
                AND CC.[Primary] = 1
                WHERE (@VARIABLE1 = 1
                       OR C.Active = 1) 
                 AND CASE WHEN isnull(@variable,'') !='' THEN
                 CASE WHEN Lower(C.CompanyName) like '%' + lower(@variable)+'%' THEN 1
                 WHEN Lower(CC.FirstName) like '%' + lower(@variable)+'%' THEN 1
                 WHEN Lower(CC.LastName) like '%' + lower(@variable)+'%' THEN 1
                 ELSE 0 END 
                 ELSE 0 END =1

                ORDER BY FullName
                OFFSET 0 ROWS       -- skip rows
                FETCH NEXT 150 ROWS ONLY; -- take rows
© www.soinside.com 2019 - 2024. All rights reserved.