使用SET NOCOUNT優化儲存過程

2021-04-13 03:28:39 字數 1235 閱讀 3815

每次我們在使用查詢分析器除錯sql語句的時候,通常會看到一些資訊,提醒我們當前有多少個行受到了影響,這是些什麼資訊?在我們呼叫的時候這些資訊有用嗎?是否可以關閉呢?

答案是這些資訊在我們的客戶端的應用程式中是沒有用的,這些資訊是儲存過程中的每個語句的done_in_proc 資訊。

我們可以利用set nocount 來控制這些資訊,以達到提高程式效能的目的。

msdn中幫助如下:

set nocount

使返回的結果中不包含有關受 transact-sql 語句影響的行數的資訊。

語法set nocount

注釋當 set nocount 為 on 時,不返回計數(表示受 transact-sql 語句影響的行數)。當 set nocount 為 off 時,返回計數。

即使當 set nocount 為 on 時,也更新 @@rowcount 函式。

當 set nocount 為 on 時,將不給客戶端傳送儲存過程中的每個語句的 done_in_proc 資訊。當使用 microsoft sql server 提供的實用工具執行查詢時,在 transact-sql 語句(如 select、insert、update 和 delete)結束時將不會在查詢結果中顯示"nn rows affected"。

如果儲存過程中包含的一些語句並不返回許多實際的資料,則該設定由於大量減少了網路流量,因此可顯著提高效能。

set nocount 設定是在執行或執行時設定,而不是在分析時設定。

許可權set nocount 許可權預設授予所有使用者。

結論:我們應該在儲存過程的頭部加上set nocount on 這樣的話,在退出儲存過程的時候加上 set nocount off這樣的話,以達到優化儲存過程的目的。

多說兩句:

1:在檢視sqlserver的幫助的時候,要注意「許可權」這一節,因為某些語句是需要一定的許可權的,而我們往往忽略。

2:@@rowcount是返回受上一語句影響的行數,包括找到記錄的數目、刪除的行數、更新的記錄數等,不要認為只是返回查詢的記錄數目,而且@@rowcount要緊跟需要判斷語句,否則@@rowcount將返回0。

3:如果使用表變數,在條件表示式中要使用別名來替代表名,否則系統會報錯。

4:在cud類的操作中一定要有事務處理。

5:使用錯誤處理程式,用來檢查 @@error 系統函式的 t-sql 語句 (if) 實際上在程序中清除了 @@error 值,無法再捕獲除零之外的任何值,必須使用 set 或 select 立即捕獲錯誤**。

NteCore EfCore使用sql和儲存過程

說明 眾所周知資料操作一般為增刪改查,增刪改返回影響行數,查詢返回資料表。neget包引用 microsoft.entityframeworkcore v3.1.8 選擇自己專案對應版本 microsoft.entityframeworkcore.tools v3.1.8 一 增刪改 增刪改使用db...

CloudStack 使用Ceph作為主儲存

ceph osd pool create cloudstack 10240 pool cloudstack created rbd create cloudstack primary size 10240 p cloudstack rbd ls p cloudstack cloudstack pri...

oracle gi 使用 iscsi 實現共享儲存

os centos 6.8 在不太容易實現共享儲存的地方,可以通過iscsi輕易實現.只是生產環境慎用.iscsi 分為 target server 和 initiator client 資訊如下 192.168.56.102 nodea2 yum install gcc gcc c cd lib ...