1. 程式人生 > >sql server查詢巨慢解決例項

sql server查詢巨慢解決例項

這是在計算某個KPI指標的時候發現的,下面是摘錄的統計程式碼,就是這段程式碼巨慢,10分鐘也沒出結果:

  select dateid,EID,DID,y.Kpiid,y.[Property],Val=sum(JFJe-DFJe),d.start,d.[end]
  into #Val_1
  from KPI.YWData y --with(index(OpTime_IDX))
    join #Dateident d on y.OPtime>=d.Start and y.OpTime<d.[End]
    join #KPIID k on y.KPIID=k.KPIID
  group by d.dateid,y.KPIID,y.[Property],EID,DID,d.Start,d.[end]


程式碼實際執行時中,#Dateident一條記錄,#KPIID 有 15000條記錄,KPI.YWData是業務資料,經過條件OPtime>=d.Start and OpTime<d.[End]過濾後,約有670000條記錄,以我對客戶資料庫效能的瞭解,這個資料量最多2秒應該出結果,到底什麼原因呢?

看起來這段指令碼沒有太多的優化項,KPI.YwData中時間欄位OpTime已經加有索引,而且是聚簇索引,經測試,發現:

  select sum(JFJe-DFJe)
  into #Val_1
  from KPI.YWData y --with(index(OpTime_IDX))
    join #Dateident d on y.OPtime>=d.Start and y.OpTime<d.[End]
    join #KPIID k on y.KPIID=k.KPIID
結果秒出,看起來和Group by 有關,於是加上Group by d.dateid,又一次變得巨慢,百思不得其解,按道理,group by是在篩選後的資料上做彙總,資料量未變,而且,#Dateident僅有一條資料,意味著上面兩次查詢返回結果也一樣,不禁陷入長思。

為了查詢原因,寫了如下兩個統計語句,並觀察執行計劃:

SELECT sum(YPID) FROM  DrugMaterial.DMItem 

SELECT sum(YPID) 
FROM  DrugMaterial.DMItem d
  join(select A=1) as t on 1=1
group by A

兩條語句可以說無差別,但是執行計劃卻不一樣:

根據以往的經驗,執行計劃依賴統計結果,難道是統計結果有問題,於是,執行

update statistics KPI.YWData
再執行原來的語句,2秒不到,至此,效能問題解決,現在分析,應該是統計結果有問題導致sql server制定了不合適的執行計劃,導致Nested Loops效能嚴重降低所致。