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 がクエリの最適化を最適化していない可能性があります。ただし、それほど複雑ではないため、それが理由ではない可能性があります。

より可能性の高い原因は、ドメインへの参加です。私の推測では、数千または数万の例を持つドメインがあると思います。結合では、これにより数百万 (または数十億) の候補行が生成され、パフォーマンスの低下が説明されます。空白はこれの明らかな候補ですが、空白を削除します。

結合で「または」を実行すると、問題が発生する可能性があります。フィールドの 1 つ (Name など) のみに一致するクエリを実行して、有限時間内に返されるかどうかを確認してください。その場合、1 つの解決策は、クエリを 4 つに分割し、それらを結合することです。

于 2012-07-23T13:19:49.083 に答える