2013-05-15 75 views
0

考慮到一個高度活躍的遠程數據庫在不斷的使用;將2或更多同時運行的查詢返回大約30m記錄,但在查詢中使用WITH(NOLOCK)使系統無法使用?多個查詢同時運行WITH(NOLOCK)

高度活躍:約200位用戶,查詢範圍從1個記錄查詢到上述最大值不等。

恆: 18/7

不可用: 5-15分鐘的延遲。外部應用程序或用戶無法訪問數據庫進行查詢。

+3

定義「不可用」。定義「高度活躍」。定義「不斷使用」。 – Oded

+0

現在如何:) – mechanicum

回答

1

您需要調查您的停機時間'不可用'作爲適當的。猜測不起作用。有很多情況下,可以使一臺服務器 '無法使用',如:

  • 數據庫增長
  • 日誌增長
  • 核心轉儲
  • 調度疲憊
  • 更多

其他次服務器可能只是「緩慢」而且看起來沒有反應。 200個查詢掃描30萬行的表可以導致scheduler exhaustion。您需要妥善調查。 Waits and Queues是一個很好的方法(例如它可以正確識別上面提到的調度程序耗盡)。

至於NOLOCK:從來沒有一個合理的理由來使用NOLOCK。您的用戶see incorrect data right now。考慮使用row versioning來代替。

1

如果你的意思

使系統其他用戶無法使用較少,同時選擇30米記錄

不行,WITH(NOLOCK)沒有任何作用。

請注意,選擇30m記錄本身很可能是一個非常I/O敏感的操作,所以我不會在選擇那麼多的記錄方面行動遲緩,但所有意圖和目的的WITH(NOLOCK)隻影響做選擇的人。

+0

我只是好奇,如果其他用戶和應用程序使用相同的數據庫會注意到,正在查詢30m記錄。例如,如果數據庫的速度變慢,應用程序就會超時,人們的反應會變慢。查詢完成需要花費很長時間(大約10分鐘)。 – mechanicum

+1

這很大程度上取決於你願意拋出的硬件配置*(讀錢)*,你應該做一些壓力測試以找出答案,但是我的第一反應是:是的,這將是顯而易見的。 –