2012-07-23 166 views
1

我有一个从未完成执行的存储过程。尽管该表已编入索引,但即使对于80,000条记录也是如此。我用Adam Machanic脚本尝试过,发现下面的语句不会终止。我知道问题在where子句之后的某处。有什么办法可以简化这个查询吗?

P.S.参数嗅探不是这种情况。

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 
+1

几乎可以肯定。你究竟想要做什么? – podiluska 2012-07-23 11:07:56

+1

名称连接可能会产生大量的记录。空的中间名有很多匹配,也是单个字符的中间名,对于名字和姓氏也是有效的,可能程度较小。 – 2012-07-23 11:09:40

+0

@podiluska比较4组字段。 – 2012-07-23 11:13:01

回答

2

我能想到两件事。首先,SQL Server可能会对查询进行次优化优化。但是,这并不复杂,所以可能不是原因。

更可能的原因是域上的连接。我的猜测是你有一个有数千或数万个例子的域。在连接中,这产生了数百万(或数十亿)的候选行,这将解释性能不佳。空白是一个明显的候选人,但你消除空白。

在连接中做“或”可能会有问题。尝试运行查询,只在其中一个字段(比如Name)上进行匹配,查看是否在有限的时间内返回。如果是这样,一种解决方案是将查询分解为四个,并将它们结合在一起。

相关问题