下面的查询正在〜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
基本类似的陈述总是会浪费时间在下面的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