【发布时间】:2011-09-15 21:04:15
【问题描述】:
我遇到了一个相当奇怪的问题。我在 SQL Server 中创建了以下查询
SELECT * FROM leads.BatchDetails T1
INNER JOIN leads.BatchHeader h ON T1.LeadBatchHeaderId = h.ID
WHERE
T1.LeadBatchHeaderId = 34
AND (T1.TypeRC = 'R' OR h.DefaultTypeRC = 'R')
AND EXISTS (SELECT ID FROM leads.BatchDetails T2 where
T1.FirstName = T2.FirstName AND
T1.LastName = T2.LastName AND
T1.Address1 = T2.Address1 AND
T1.City = T2.City AND
T1.[State] = T2.[State] AND
T1.Zip5 = T2.Zip5 AND
T1.LeadBatchHeaderId = T2.LeadBatchHeaderId
and t2.ID < t1.ID
AND (T2.TypeRC = 'R' OR h.DefaultTypeRC = 'R' )
)
它在 2 秒内运行得相当快。在格式化代码时,我不小心在AND + EXISTS 之间添加了一个额外的SPACE,所以查询看起来像这样。
SELECT * FROM leads.BatchDetails T1
INNER JOIN leads.BatchHeader h ON T1.LeadBatchHeaderId = h.ID
WHERE
T1.LeadBatchHeaderId = 34
AND (T1.TypeRC = 'R' OR h.DefaultTypeRC = 'R')
AND EXISTS (SELECT ID FROM leads.BatchDetails T2 where
T1.FirstName = T2.FirstName AND
T1.LastName = T2.LastName AND
T1.Address1 = T2.Address1 AND
T1.City = T2.City AND
T1.[State] = T2.[State] AND
T1.Zip5 = T2.Zip5 AND
T1.LeadBatchHeaderId = T2.LeadBatchHeaderId
and t2.ID < t1.ID
AND (T2.TypeRC = 'R' OR h.DefaultTypeRC = 'R' )
)
突然之间,查询需要 13 秒才能执行。 我在一个隔离的沙箱环境中运行 SQL Server,我什至在不同的沙箱上对其进行了测试。我还在分析器中检查了执行的查询,读取几乎相同,但 CPU 时间增加了
如果这还不够奇怪,那就越来越奇怪了。当我在查询顶部将 SELECT * FROM 更改为 SELECT Field1, ... FROM 时,执行需要 3 分钟以上。
我已经使用 SQL Server 10 年了,从来没有见过这样的事情。
编辑:
在遵循以下建议后,查询似乎是“空白敏感的”。但是我仍然不知道为什么SELECT * FROM 比SELECT Field1, ... FROM 快很多
【问题讨论】: