2014-07-08 94 views
0

我有兩個查詢顯示性能差異很大。在SQL Server中針對相同查詢的不同性能

這兩個查詢是相似的,但選擇不同的值。一個查詢產生359.890行,執行時間比另一個查詢快,而另一個查詢只返回51.439行。

我不明白爲什麼行數少的查詢有更高的執行時間?

我想問題是在加入vd.MComercial = m.Material_Comercialand vd.codigo_organizacion = M.Codigo_Organizacion,但我不知道如何分析這些結果。我看過這個領域的價值觀,他們是一樣的。

如果我嘗試複製臨時表中的值,性能很好。少於4秒。我不明白爲什麼會這樣。有人知道我如何分析這個問題嗎?

select COUNT(*) 
from _T_VENTAS_DIARIAS as VD 
left join _CAT_materiales M on vd.MComercial = m.Material_Comercial 
           and vd.codigo_organizacion = M.Codigo_Organizacion 
where Año = 2014 
     and Semana = 27 
     and M.Material_Comercial is not null  

返回「359890」。

select vd.codigo_organizacion, sum(Vta_Bruta) 
from _T_VENTAS_DIARIAS as VD 
left join _CAT_materiales M on vd.MComercial = m.Material_Comercial 
           and vd.codigo_organizacion = M.Codigo_Organizacion 
where Año = 2014 
     and Semana = 27  
     and M.Material_Comercial is not null   
group by vd.codigo_organizacion 

該查詢較快,< 4s。

select COUNT(*) from _T_VENTAS_DIARIAS as VD 
left join _CAT_materiales M on vd.MComercial = m.Material_Comercial 
           and vd.codigo_organizacion = M.Codigo_Organizacion 
where Año = 2014 
     and Semana = 28  
     and vd.dia_calendario = 'lunes' 
     and M.Material_Comercial is not null  

返回「51439」。

select vd.codigo_organizacion, sum(Vta_Bruta)       
from _T_VENTAS_DIARIAS as VD 
left join _CAT_materiales M on vd.MComercial = m.Material_Comercial 
           and vd.codigo_organizacion = M.Codigo_Organizacion 
where Año = 2014 
     and Semana = 28  
     and vd.dia_calendario = 'lunes' 
     and M.Material_Comercial is not null       
group by vd.codigo_organizacion      

這個查詢很慢:> 120

+2

什麼是您的模式/您的索引? –

+1

在不知道已經請求的模式/索引的情況下,這將是幾乎不可能解決的,但也是每個查詢的執行計劃。使用「SET STATISTICS IO ON」選項來運行也是值得的,以顯示每個查詢的讀取次數。 – GarethD

+1

我最大的猜想是你沒有包含'vd.dia_calendario'的索引,因此每行都需要對你選擇的值進行文本搜索,在本例中爲'lunes'。較大的數據集不一定會因爲音量變大而變慢。這是搜索,可能是昂貴的。 –

回答

0

看你的執行計劃(http://imgur.com/gallery/O1eGsEz/new),查詢成本的99%是在_T_VENTAS_DIARIAS表掃描。在表上創建索引,如下所示:

CREATE NONCLUSTERED INDEX <index name> ON _T_VENTAS_DIARIAS (Año, Semana, Dia_Calendario); 

試試這個,然後重新運行您的查詢。它應該快得多。很明顯,我假設Año和Semana是_T_VENTAS_DIARIAS中的列。如果他們不是,請將它們從索引創建語句中刪除。

祝你好運。

+1

謝謝@Maurice。性能非常快。所以你知道SQL的indixes的信息嗎?我喜歡學會正確使用 – user3816761

+0

很高興聽到它。您可以從MSDN開始:http://msdn.microsoft.com/en-us/library/ms188783.aspx –

相關問題