2012-10-22 49 views
1

我遇到了一些問題,這個查詢及時運行,我的'LineItemsMap'表增長到大約一百萬行。任何建議我可以創建索引或更好的邏輯與查詢將不勝感激。與SQL查詢性能下降

select 
     Id, 
     [Description], 
     SUM(CASE WHEN t1.compliant = 1 THEN 1 ELSE 0 END) as Compliant, 
     SUM(CASE WHEN t1.compliant = 0 THEN 1 ELSE 0 END) as NonCompliant, 
     LastChecked 
from lineitems as t0 
     left outer join lineitemsmap as t1 on t0.id = t1.lineitemid 
     left outer join art_blob as t2 on t2.art_blob_id = t1.blobid 
     left outer join art_asset as t3 on t3.art_asset_id = t2.art_asset_id 
     left outer join lineitemexceptions as t4 on t4.assetid = t3.art_asset_id and t4.lineitemid = t1.lineitemid 
where t0.active = 1 and t4.assetid is null 
group by t0.id, t0.[description], t0.lastchecked 

這裏是保存在XML的執行計劃的鏈接:http://codepaste.net/5xcpcw 這裏是表結構的鏈接:http://codepaste.net/pnqx6e

+0

你有什麼樣的索引?這些表所涉及的結構是什麼? –

+0

@marc_s大多隻是默認索引。我包含了一個鏈接到表結構腳本。 –

+0

http://codereview.stackexchange.com/ – cadrell0

回答

3
  1. 活動應了LineItem
  2. LineItemId應該被索引進行索引on LineItemsMap
  3. AssetId應該在LineItemExceptions上索引
  4. art_asset_id應該在art_b上索引lob

我沒有看到任何其他人。任何用於連接的字段都應該被索引。在你的where子句的字段上有索引可以幫助很多,但是你應該對許多索引持謹慎態度。

+0

您可能有更多的運氣根據架構轉儲#2,肯定。除了不能索引某一列的事實,因爲只有兩個可能的值,因此「Active」上的索引不會執行任何操作,除非它將過濾掉大部分表(例如10,000個活動的,990,000個不活動的行) –

+0

您可以對位列進行索引。或者,我希望看到它的實現,作爲索引的輔助字段,但我不知道數據的細節。 – UnhandledExcepSean

+0

我的天啊。這絕對有效。非常感謝你。我從12秒開始加載到大約一秒鐘。 –