1

我有一个永远不会完成执行的存储过程。尽管该表已编入索引,但即使有 80,000 条记录,它也会失败。我尝试使用 Adam Machanic 脚本,发现以下语句永远不会终止。我知道问题出在 where 子句之后。

PS 参数嗅探并非如此。

insert into ProcessedFile_396 (Name,Phone,Title,Address,company,domain,SIC,NAICS,Industry,Email,UploadedB2bFiled_id) select  
  b.Name,
  b.Phone,
  b.Title, 
  case when isnull(b.Street,'') <> '' then isnull(b.Street,'') +',' else '' end  +
   case when isnull(b.city,'') <> '' then isnull(b.city,'') + ',' else '' end +
   case when isnull(b.state,'') <> '' then isnull(b.state,'') + ',' else '' end +
   case when isnull(b.zip,'') <> '' then isnull(b.zip,'') + '.' else '' end as Address,
  (select top 1 Company from CompanyWebsite where domain = b.domain) as Company,
  b.domain,
  b.SIC,
  b.NAICS,
  b.Industry,
  b.Email,
  B2bFiled_id 
from 
  UploadedFile_396 a, B2bDB b 
where 
  ((a.CompanyDomain = b.domain and ISNULL(a.CompanyDomain,'') <> '')) 
  and 
  ((a.Name = b.Name or a.FirstName = b.FirstName or a.LastName = b.LastName or a.MiddleName = b.MiddleName) 
   and 
   (ISNULL(a.Name,'') <> '' or ISNULL(a.FirstName,'') <> '' or ISNULL(a.LastName,'') <> '' or ISNULL(a.MiddleName,'') <> '' )) 
 group by 
   B2bFiled_id,b.Name,b.Phone,b.Title,b.Street,b.City,b.State,b.Zip,b.domain,b.domain,b.SIC,b.NAICS,b.Industry,b.Email
4

1 回答 1

2

我能想到两件事。首先,SQL Server 可能正在对查询进行次优优化。但是,它并没有那么复杂,因此可能不是原因。

更可能的原因是域上的加入。我的猜测是您的域包含数千或数万个示例。在连接中,这会产生数百万(或数十亿)个候选行,这可以解释性能不佳的原因。空白是一个明显的候选者,但你消除了空白。

在连接中使用“或”可能会出现问题。尝试仅在其中一个字段(例如名称)上运行带有匹配项的查询,以查看它是否在有限的时间内返回。如果是这样,一种解决方案是将查询分成四个,并将它们合并在一起。

于 2012-07-23T13:19:49.083 回答