2011-06-18 41 views
0

有時,我想運行一個存儲過程以粗略估計兩個或三個不同表中有多少記錄滿足某些條件。如果在估算過程中添加,刪除或更新新記錄,那就不存在真正的問題(我只想粗略估計)。那麼,我可以使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED來支付這個過程。然而,我有兩個問題:閱讀未提及和估計

1)由於我只使用SELECT COUNT(*)指令,我真的需要將這些語句包裝在BEGIN/COMMIT TRANSACTION塊嗎?

2)我是否需要SET TRANSACTION ISOLATION LEVEL READ COMMITTED回到存儲過程的末尾,還是會在執行結束後自動設置?

回答

0
  1. 號讀取並不需要在交易

  2. 的SET只對存儲過程作用域。在這裏看到我的答案:Is it okay if from within one stored procedure I call another one that sets a lower transaction isolation level?。但是,您將使用NOLOCK提示,而不是SET:SELECT COUNT(*) FROM myTable WITH (NOLOCK)

如果您希望沒有WHERE過濾器的近似計數,請使用sys.dm_db_partition_stats。請參閱我的答案:Fastest way to count exact number of rows in a very large table?

0

1)否。如果您未指定事務範圍,則它對每個語句使用隱式事務。您不必爲顯式事務範圍設置「設置事務隔離級別」。

2)您不必將其重置爲原始。它將由SQL Server負責。請參閱此SO條目:Transaction Isolation Level Scopes