[解決済み] SET NOCOUNT ON 使用法
質問
インスパイアード・バイ この質問 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の同僚に感謝し、さらに情報を追加しました。
- KB 240882 SQL 2000以前のバージョンで切断される問題
- パフォーマンス向上のデモ
編集4:2011年5月13日
編集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/
関連
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
[解決済み] MSSQL2008 - Pyodbc - 前の SQL はクエリではありません。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] SQL Server - INSERT後の戻り値