Sql-Server

使用 PK/聚集索引查詢大表時的性能問題

  • August 23, 2017

為簡化情況,我將只考慮一張大桌子……

商店每晚會將一張大桌子的所有新數據和更改數據發送到總部。(這部分很好)此外,商店將過去 30 天該表的摘要發送到該大表的總部。

在總公司,新的和更改的數據在大表中更新(這裡沒問題)。收到並上傳到表中的最後 30 個摘要。然後將它與一個查詢進行比較,該查詢匯總了同一商店的這個非常大的表(包含所有商店)的總部數據。< - 這就是問題所在。這樣做是為了確保商店的數據與該商店的總部數據匹配(如果不匹配,我們會收到警告,他們需要採取行動)

問題是摘要查詢花費了太多時間……我希望以更有效的方式改變我們將儲存表與主機表進行比較的方式。

我嘗試了索引視圖,結果很好,但事實上它們有太多限制,由於結構不同,實際上不可能大規模實施(對所有軟體所有者、收銀機、商店和總部)以及我們軟體的不同版本。

我一直在嘗試不同的方法來確保商店的表格數據(至少過去 30 天)與總部相匹配,但我覺得我在轉圈……所以我’正在尋找想法來幫助我以不同的方式看待這個問題。

限制:我們在商店使用 SQL Express,通常在總部使用標準。兩個數據庫之間沒有直接連接(數據通過文件傳輸)。

任何幫助表示讚賞。謝謝


添加了更多資訊: 表的結構(我知道不理想,這是我繼承的): 日期、商店、終端、transNum、lineNum、數量、金額 + 194 更多列。 PK 和聚集索引為Date, Store, terminal, transNum, lineNum

要總結的查詢很簡單:

Select Date, Store, sum(Qty) as Qty, sum(Amount) as Amt
from MyHugeTable 
where date between '2017-07-22' and '2017-08-22'
and store = '1234'
group by Date, Store;

如果加快此查詢的速度至關重要,我會考慮創建一個覆蓋索引:

CREATE INDEX IX_MyHugeTable_Date_Store_Qty_Amt
   ON MyHugeTable (Date, Store)
      INCLUDE (Qty, Amt)
;

添加新索引將影響從表中添加、更新和刪除行的時間。您應該測試以確定將此索引添加到每晚更新過程的影響。如果這加快了查詢生成每天的摘要數據的速度,這將無濟於事,但是插入和更新每日更改的速度比摘要查詢的速度更快。這適用於評論中的其他一些建議;測試以確保您所做的更改不會損害正常操作。

僅供參考:覆蓋索引背後的想法很簡單 - 如果索引具有查詢引用的所有列,那麼引擎可以從索引中檢索該資訊而無需實際接觸表本身。該索引每行佔用的空間應該比表(大約 200 列)少得多,因此查詢應該執行得更好。

正如 David Browne 所指出的,您的索引不僅包括列出的四列,還包括構成主鍵的其他 3 個鍵。這是因為具有聚集索引的表上的所有非聚集索引都使用聚集鍵來標識主表中的行位置。有關完整詳細資訊,請參閱此連結。儘管如此,該索引仍將比您的~200 列表窄得多。

引用自:https://dba.stackexchange.com/questions/184086