2012-03-30 74 views
-2
select 
    a.Transport_Mode, sum(a.Inv_Qty) 
from 
    dbo.DespSum_Year a, dbo.Item_Master b 
where 
    a.Inv_Date between '2011-04-01' and '2012-03-31' 
    and a.item_name = b.itemcode 
group by 
    a.Transport_Mode 

我在despsum_year中有1000萬行,而在Inv_date上有非聚集索引。SQL Server何時選擇索引掃描?

當我運行上面的查詢時,它顯示了它使用表掃描。任何人都可以告訴我如何使用索引掃描進行查詢?

+0

架構?我們不知道什麼是什麼桌子。 – 2012-03-30 08:20:26

+1

表掃描表明是一個**堆** - 沒有聚集索引。修復**第一**。然後你需要確保在'inv_date','item_name'和'itemcode'上有一個索引 - 甚至可能有'transport_mode'。 – 2012-03-30 08:24:47

+1

@marc_s:OP隱藏得很好,但這是一個來自DespSum_Year,Item_Master'的連接......所以我們需要每個表的更多細節。 – MatBailie 2012-03-30 08:25:36

回答

2

您的查詢有三個部分需要排序表。
1. JOIN
2. WHERE條款
3. GROUP BY

您的查詢不使用索引,因爲其他人都被認爲是更重要的。將索引放在其他字段上,並在合適的位置放置合成索引。

我會給更多的細節,但不幸的是你的查詢並沒有說哪個字段屬於哪個表。請給出完整詳細信息的每個表的架構和索引更多細節。此外,知道更多的數據行爲將是很好的:將通過Transport_Mode的Gouping給幾個大組或許多小組? item_name/itemcode是一個表中的唯一鍵嗎?等等,等等


編輯

感謝您將這些表的字段查詢。在不瞭解數據的情況下,它仍然非常有限,但我會盡力幫助你。


1)。你不使用你的SELECTGROUP BY

Item_Master這意味着你要麼用它無論是作爲過濾器(1:0..1),或倍數(1:1..many) ,或兩者(1:0..many)。

我假設你將它用作過濾器。


2)。您使用BETWEEN過濾Inv_Date

我假設Inv_Date是DATETIME,沒有時間部分;它總是午夜 - 只表示日期。給你366日期的情況下(閏年)


連同這些意味着你必須要由兩列組由第三方來過濾表。您需要確定應該對這些字段進行排序的次序,以盡最大努力爲您提供最終結果。

有6種可能性...

1). Transport_Mode => Item_Name  => Inv_Date 
2). Transport_Mode => Inv_Date  => Item_Name 
3). Item_Name  => Transport_Mode => Inv_Date 
4). Item_Name  => Inv_Date  => Transport_Mode 
5). Inv_Date  => Transport_Mode => Item_Name 
6). Inv_Date  => Item_Name  => Transport_Mode 

如果你有Transport_Mode第一,這是你的GROUP BY非常友好。每種可能的模式將被預先分組在一起,準備彙總而不需要分類。然後,對於每個組,你只需要過濾記錄,具有JOIN過濾Item_NameBETWEEN過濾Inv_Date

因此,在(Transport_Mode, Item_Name, Inv_Date)覆蓋索引似乎對我好。

但是,這部分是因爲你有Inv_Date你的查詢佔地面積366個值。如果你在一天內只感興趣,這將是最好有(Inv_Date, Transport_Mode, Item_Name)

但是,如果你有Item_NameTransport_Mode和許多值很少價值觀,也許你會從具有Item_Name在索引Transport_Mode之前受益?

如果沒有更多的細節上的數據,我會建議創建所有6項指標,盡顯你的表達表示現實生活中的情況(如果沒有的話),然後運行查詢。當你檢查執行計劃時,你可以看到優化器喜歡哪個索引。

或者創建一個在時間和因爲它使用不同的指標和執行計劃輪廓查詢。然後,您可以在所有查詢中保留對您最有用的一個,而不僅僅是一個。


,在所有情況下,確保你在Item_Master表索引itemcode以及!

+0

非常優秀和詳細的答案給予我的理解。感謝它。 – 2012-03-30 10:10:54

1

這取決於很多因素。您可以嘗試強制在查詢提示中使用索引,並比較執行計劃(特別是主鍵查找的估計行數和成本)。日期條件的選擇性是什麼?一般來說,對於這個查詢(實際上它取決於數據結構,但僅僅作爲一個假設),索引on(item_name,Transport_Mode)會更好。

+1

OP很好地隱藏了它,但這是一個加入...'從DespSum_Year,Item_Master'' – MatBailie 2012-03-30 08:23:33

相關問題