我有一個很常見的任務,在我們的Web應用程序(asp.net + mssql)中顯示銷售歷史記錄。 我有銷售交易就像一個表:如何通過分組和過濾加速SQL Server查詢
- SellerID (string)
- Product PartNumber
- Product ManufacturerName
- ProductID (string uniq normalized PN+MN)
- Date of sale
- Price
- Qty
- Option 1
- Option 2
- Option 3
選擇一些特定的屬性(如合同號等)。
我需要顯示按產品ID分組的總量爲數量和金額的銷售數據。 此外,我需要提供一個能夠通過SellerId,日期和選項進行過濾。 所以用戶應該可以看到表:
- Part Number
- Manufacturer Name
- Sum(Qty)
- Sum(Price)
而且用戶可以排序和篩選所顯示的列去一翻
目前我們有銷售的大約500萬的記錄,和«正向»查詢與這樣的分組,過濾和排序需要很多時間(並且不會考慮這個Web服務可以被多個併發用戶使用)。
爲了使其工作更快,我們使用查詢中使用的所有標準創建緩存鍵,並使用相同的方案(加上緩存鍵)將查詢的整個結果複製到緩存表中。但有一些缺點,如緩存錶快速增長,並在緩存表中創建indecies困難(它會減緩插入)
我很確定這個任務是非常普遍的,對大多數業務應用程序銷售。
人們如何解決所有這些問題?
UPD: 我忘了提。
有沒有銷售數據的插入(我們用來在一個季度一次手動加載)
我在想OLAP,但它在現實從來沒有工作過。使用olap有意義嗎?
我們不是強與SQL Server的限制,如果它是有道理的,我們可以使用任何其他數據庫
您是否嘗試過對'(productID)INCLUDE(所有其他列)'進行索引?還要創建索引,並使用篩選列領先。 – usr
我不確定索引會有幫助。例如。用戶只能在報告設置中選擇2013年,因此分組結果將被更改。換句話說,mssql必須每次都重新計算聚合(然後由它們進行排序和過濾),我不知道索引如何在這裏幫助 –
那麼年份索引對於剛剛給出的示例(2013年)肯定會有所幫助。 SQL Server然後可以將掃描限制在一個小範圍內。如果productID中的下一個關鍵字列可以進行流聚合。非常快。所有其他過濾列也是如此。 – usr