1. ホーム
  2. sql

[解決済み] SET NOCOUNT ON 使用法

2022-03-16 20:03:41

質問

インスパイアード・バイ この質問 SET NOCOUNTについて見解の分かれるところですが...。

SQL Server では SET NOCOUNT ON を使用する必要がありますか?そうでない場合、なぜそうしないのでしょうか?

機能概要 2011年7月22日、6を編集

DML の後に表示される "xx rows affected" というメッセージを抑制します。これは結果セットであり、送信されるとクライアントはそれを処理する必要があります。これは小さなことですが、測定可能です(以下の回答を参照してください)。

トリガなどでは、クライアントは複数の "xx rows affected" を受け取り、これは一部の ORM、MS Access、JPA などであらゆる種類のエラーを引き起こします (以下の編集を参照)。

背景

一般的に受け入れられているベストプラクティス(私はこの質問までそう思っていました)は SET NOCOUNT ON は、SQL Server のトリガーとストアドプロシージャで使用されます。ググってみると、多くの SQL Server MVP がこれに同意していることがわかります。

MSDNによると、これは .net SQLDataAdapter .

さて、これは私にとって、SQLDataAdapter は "n rows affected" メッセージが一致することを期待するので、全く単純な CRUD 処理に限定されるということです。ということで、使えません。

  • 重複を避けるため IF EXISTS (no rows affected メッセージ) 注意:使用には注意が必要です
  • WHERE NOT EXISTS (予想より少ない行数)
  • 些細な更新(実際にデータが変更されていないなど)をフィルタリングする
  • テーブルへのアクセスを事前に行う(ロギングなど)
  • 複雑さまたは非修飾を隠す
  • その他

質問の中で、(SQLに詳しい)marc_sさんは、使わないでくださいとおっしゃっています。これは私の考えと異なります(私もSQLにはある程度長けていると自負しています)。

私が見落としている可能性もありますが(当たり前のことを遠慮なく指摘してください)、皆さんはどう思われますか?

注:最近はSQLDataAdapterを使わないので、このエラーを見たのは何年か前のことです。

コメント・質問後の編集

編集部:さらに考えを巡らせる...

あるクライアントは C# SQLDataAdaptor を使用し、別のクライアントは Java から nHibernate を使用することがあります。これらは SET NOCOUNT ON .

ストアドプロックをメソッドと見なすなら、ある内部処理が自分の目的のためにある方法で動作すると仮定するのは悪い形式(アンチパターン)です。

編集2:a nHibernateを壊すトリガーに関する質問 ということです。 SET NOCOUNT ON を設定することはできません。

(と重複しているわけではありません)。 この )

編集3:MVPの同僚に感謝し、さらに情報を追加しました。

編集4:2011年5月13日

Linq 2 SQLも指定しないと壊れる?

編集5:2011年6月14日

JPA、テーブル変数を使用したストアドプロセスが壊れる。 JPA 2.0はSQL Serverのテーブル変数をサポートしていますか?

編集 6: 2011年8月15日

SSMS の "Edit rows" データグリッドには SET NOCOUNT ON が必要です。 GROUP BYを使った更新トリガー

編集 7: 2013年3月7日

RemusRusanuさんより詳細な情報をいただきました。
SET NOCOUNT ONは本当にそんなにパフォーマンスの違いがあるのか?

解決方法は?

さて、これで調査は終わりましたが、ここからが本題です。

TDSのプロトコルでは SET NOCOUNT ON のみが保存されます。 1クエリあたり9バイト SET NOCOUNT ON"というテキスト自体はなんと14バイトもあるのです。私は以前、次のように考えていました。 123 row(s) affected は、サーバーから別のネットワークパケットにプレーンテキストで返されるのですが、そうではありません。実際には DONE_IN_PROC をレスポンスに埋め込みました。これは別のネットワークパケットではないので、ラウンドトリップが無駄になることはありません。

パフォーマンスを気にすることなく、ほとんどデフォルトのカウント動作にこだわることができると思います。しかし、フォワードオンリーカーソルなど、事前に行数を計算することがパフォーマンスに影響するケースもあります。そのような場合はNOCOUNTが必要かもしれません。それ以外は、quot;use NOCOUNT wherever possible"のモットーに従う必要は全くありません。

の無意味さについて、非常に詳しい分析があります。 SET NOCOUNT を設定します。 http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/