2013-07-20 111 views
1

我有一個很常見的任務,在我們的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: 我忘了提。

  1. 有沒有銷售數據的插入(我們用來在一個季度一次手動加載)

  2. 我在想OLAP,但它在現實從來沒有工作過。使用olap有意義嗎?

  3. 我們不是強與SQL Server的限制,如果它是有道理的,我們可以使用任何其他數據庫

+0

您是否嘗試過對'(productID)INCLUDE(所有其他列)'進行索引?還要創建索引,並使用篩選列領先。 – usr

+0

我不確定索引會有幫助。例如。用戶只能在報告設置中選擇2013年,因此分組結果將被更改。換句話說,mssql必須每次都重新計算聚合(然後由它們進行排序和過濾),我不知道索引如何在這裏幫助 –

+0

那麼年份索引對於剛剛給出的示例(2013年)肯定會有所幫助。 SQL Server然後可以將掃描限制在一個小範圍內。如果productID中的下一個關鍵字列可以進行流聚合。非常快。所有其他過濾列也是如此。 – usr

回答

2

你的問題的解決方案取決於查詢的結構和構造您的數據。

對於你所描述的,自然格式將是一箇中間有事實表的星型模式。然而,事實表可能非常接近你現在擁有的。不同的是記錄的大小。事實記錄會將大部分「可讀」內容移到引用表中,因此每條記錄都儘可能小。它可能看起來像:

  • SellerID - 一個整數id
  • 的ProductID - 一個整數id
  • 發售日期
  • 價格
  • 數量
  • 選項1 - SMALLINT
  • 選項2 - smallint
  • 選項3 - smallint

事情是這樣:

  • 產品PARTNUMBER
  • 產品ManufacturerName
  • 賣方名稱

將是一個參考表。

這本身可能會將事實表的大小縮小到您的緩存的合理大小。

接下來,開始在其上建立索引。根據過濾標準,您可能需要多個索引:(date, salesid, productid, option1, option2, option3)(productid, date)等等。我意識到索引確實需要額外的插入工作。影響取決於每天插入的數量。對於決策支持系統,您應該能夠忍受「數據滯後」,您需要定期更新數據。批量插入有助於索引構建開銷。

如果您的要求是實時報告,那麼請考慮對數據進行分區,以便最近的數據位於一個小分區中。分區索引較小,因此插入的開銷應該較小。如果您的需求真的很重 - 每分鐘有很多實時更新,大量實時報告切片和切塊以及大量需要完整歷史記錄的查詢 - 然後投入更多內存,以便表格將很容易融入記憶。一路走來,您可以優化中央數據結構,使其由ID和數字量組成,參考表格包含附加數據。主鍵上的連接速度比存儲數據要快,否則這種情況會多得多。

+0

我會嘗試thnx。是的,我忘記提及銷售表具有不斷的性質(我們在一個季度內手動插入數據一次) –

+0

也是,您所描述的內容看起來像olap或數據多維數據集。我從來沒有在實踐中使用數據立方體,不知道,在這裏使用olap可能更好嗎? –

+1

@ user909291。 。 。你有一個OLAP問題,所以這可能有助於你正在做的事情。您可以使用事實表方法實施OLAP解決方案。如果你想要更多的細節,我會推薦Ralph Kimball的書。 –