2012-07-23 6 views
1

실행을 절대로 끝내지 않는 저장 프로 시저가 있습니다. 테이블이 인덱싱 되더라도 80,000 개의 레코드도 실패합니다. 나는 Adam Machanic 스크립트를 사용해 보았고 다음 문장이 끝나지 않는 것을 발견했다. 문제는 where 절 다음에있는 것 같습니다.이 쿼리를 단순화 할 수있는 방법이 있습니까?

P. 매개 변수 스니핑은 그렇지 않습니다.

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

+1

이름 조인은 아마도 수많은 레코드를 생성하고있을 것입니다. 빈 중간 이름은 일치하는 항목이 많고, 중간 이름도 하나이며, 이름과성에 대해서는 더 작은 범위에서 유효합니다. –

+0

@podiluska는 4 세트의 필드를 비교합니다. –

답변

2

나는 두 가지를 생각할 수 있습니다. 첫째, SQL Server는 쿼리의 차선 최적화를 수행 할 수 있습니다. 그러나 그렇게 복잡한 것은 아니므로 그 이유가 아닐 수도 있습니다.

더 많은 원인은 도메인에 대한 조인입니다. 내 생각 엔 당신이 수천 또는 수만 개의 예를 가진 도메인을 가지고 있다는 것입니다. 조인에서는 수백만 (또는 수십억) 개의 후보 행이 생성되어 성능 저하를 설명합니다. 공백은 명백한 후보이지만 공백을 제거합니다.

"또는"조인 할 때 문제가 될 수 있습니다. 필드 중 하나 (이름)에서 일치하는 쿼리를 실행하여 한정된 시간 내에 반환되는지 확인하십시오. 그렇다면 하나의 솔루션은 쿼리를 4 개로 분리하고 함께 결합하는 것입니다.

관련 문제