2014-11-08 41 views
0

我有一個三層系統。當某些條件不可用時減少邏輯讀取

  • 的跟蹤/監測分貝(這是在MSSQL)
  • Web服務作爲一個包裝與該通信DB
  • 寡婦服務執行實際的操作

窗戶服務通常每分鐘向Web服務發送一次請求,以查看是否有任何要處理的內容。如果在跟蹤數據庫的任何記錄與狀態CREATED

過程被觸發。

狀態列有四個可能值

  • REQUESTED
  • CREATED
  • FAILED
  • 竣工

我創建該狀態列的索引與在必要的細節INCLUDE列表,並且在狀態爲CREATED的記錄中工作正常。

但是,如果Status沒有創建記錄,那麼會導致該表中有大量邏輯讀取。

當沒有狀態爲CREATED的記錄時,是否有減少邏輯讀取次數的建議?

+0

檢查執行計劃以驗證索引是否按預期使用。如果查詢計劃顯示正在按預期使用索引,則會期望少量邏輯讀取。如果您提供「CREATE TABLE」,「CREATE INDEX」和查詢,它可能會有所幫助。無論如何,考慮一個過濾索引WHERE'Status ='CREATED''。 – 2014-11-08 02:53:44

回答

0

這聽起來像是有很少的記錄時,統計直方圖確切知道在該範圍內存在多少記錄。當記錄爲零且統計數據更新時,直方圖將顯示字符範圍,而不是精確值,並使用確實存在的值的平均分佈來猜測提供的值的分佈情況,以及平均分佈該表中的其他值可能非常大。如果您將表定義更改爲使用int來表示狀態的查找表,而不是直接在表中使用varchar列,那麼我將很有興趣瞭解如何將這種情況反應出來。我懷疑int的直方圖比varchar更適合你。我相當肯定的另一種選擇是使用基於對錶的行計數的「if/else」,它將直接從索引中提供,並在「else」塊中,當存在沒有行,「select top 0 ...」,所以它仍然返回正確的模式,但沒有實際的工作。