2012-07-23 170 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)上進行匹配,查看是否在有限的時間內返回。如果是這樣,一種解決方案是將查詢分解爲四個,並將它們結合在一起。

相關問題