2011-10-19 46 views
6

我正在開發類似系統的工作流程。我有一個任務表和狀態字段。狀態值可以是New,ready,processing,error,abort,done之一。設計表以支持使用sql server更快速地更新一個字段的最佳實踐

我有7個程序會根據不同的情況觸發來改變任務狀態的值。大多數時間每個進程將在自己的數據集上工作,每次只處理多達5000條記錄。但是如果數據達到約200萬條記錄,我仍然會看到一些僵局。我用SQL Profiler檢查,看起來像一些頁面資源相關。我不擅長sql server的性能調優,也不太瞭解它。

由於不活動任務將每天歸檔,因此我正在考慮重新設計表格以支持大約1000萬條記錄。

很少的選擇可能是:

  1. 創建基於狀態分解表。
  2. 創建靜態數據,並支持表主表基於狀態

是否有這種情況的任何好的做法?

謝謝!

+0

謝謝Siva,我們使用的是SQL Server 2005 +。並將按照您的建議應用隔離。但我們並不要求客戶端必須具有Enterprise SQL Server。因此,分區可能是一些可以支付更多費用的客戶的選擇。 –

+0

任務表是否定義了聚集索引? – gonsalu

+0

是的。 TaskId是主鍵和int類型。我試圖讓它成爲非羣集。但表現更糟糕。 –

回答

0
  • 您可以根據狀態列對錶格進行分區。活躍記錄在一個parition。在另一個區域中關閉記錄
  • 您也可以每月清除已關閉的記錄(如果不再需要,請將其刪除)或移動到歸檔表
  • 分割表格我認爲這不是一個更好的選擇對於相同的功能,您不需要多個表)
  • 避免死鎖,您正在使用哪個版本的SQL Server
  • 如果您使用SQL 2005及更高版本使用讀取提交的快照隔離來讀取提交的數據。這將確保你讀不阻止寫道:
0

我知道我應該張貼一個答案,但這些問題的答案可能如下:

1)是否有適當的表提示?如果不是,那麼嘗試應用那些

2.)是否使用了所有可用的索引,並且是唯一可接受的索引的TaskId列?有時候,分析時的某些情況會帶來對新索引的需求

3.)在任何給定的時間,所有200萬條記錄是否存在/活動?

4.)您是否檢查過零碎索引?每日歸檔可能會導致索引碎片,所以你可能想在你的存檔作業步的末尾添加爲new檢查和修復破碎

5)狀態字段,readyprocessingerrorabortdone是下什麼數據類型?

6.)你有試驗過索引視圖嗎?如果您已經知道您限制某些數據並希望避免表掃描,則可能可以幫助