您的查詢有三個部分需要排序表。
1. JOIN
2. WHERE
條款
3. GROUP BY
您的查詢不使用索引,因爲其他人都被認爲是更重要的。將索引放在其他字段上,並在合適的位置放置合成索引。
我會給更多的細節,但不幸的是你的查詢並沒有說哪個字段屬於哪個表。請給出完整詳細信息的每個表的架構和索引更多細節。此外,知道更多的數據行爲將是很好的:將通過Transport_Mode的Gouping給幾個大組或許多小組? item_name/itemcode是一個表中的唯一鍵嗎?等等,等等
編輯
感謝您將這些表的字段查詢。在不瞭解數據的情況下,它仍然非常有限,但我會盡力幫助你。
1)。你不使用你的SELECT
或GROUP 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_Name
和BETWEEN
過濾Inv_Date
。
因此,在(Transport_Mode, Item_Name, Inv_Date)
覆蓋索引似乎對我好。
但是,這部分是因爲你有Inv_Date
你的查詢佔地面積366個值。如果你在一天內只感興趣,這將是最好有(Inv_Date, Transport_Mode, Item_Name)
但是,如果你有Item_Name
在Transport_Mode
和許多值很少價值觀,也許你會從具有Item_Name
在索引Transport_Mode
之前受益?
如果沒有更多的細節上的數據,我會建議創建所有6項指標,盡顯你的表達表示現實生活中的情況(如果沒有的話),然後運行查詢。當你檢查執行計劃時,你可以看到優化器喜歡哪個索引。
或者創建一個在時間和因爲它使用不同的指標和執行計劃輪廓查詢。然後,您可以在所有查詢中保留對您最有用的一個,而不僅僅是一個。
但,在所有情況下,確保你在Item_Master
表索引itemcode
以及!
架構?我們不知道什麼是什麼桌子。 – 2012-03-30 08:20:26
表掃描表明是一個**堆** - 沒有聚集索引。修復**第一**。然後你需要確保在'inv_date','item_name'和'itemcode'上有一個索引 - 甚至可能有'transport_mode'。 – 2012-03-30 08:24:47
@marc_s:OP隱藏得很好,但這是一個來自DespSum_Year,Item_Master'的連接......所以我們需要每個表的更多細節。 – MatBailie 2012-03-30 08:25:36