SQLバッチ、ステートメント、RPCの違いは?


35

SQLバッチ、T-SQLステートメント、およびリモートプロシージャコールの違いは何ですか?
T-SQLコードの一部がバッチまたはステートメントであるかどうかを確認するにはどうすればよいですか?

回答:


25

さて、私はあなたがプロファイラークラスについて主に話していると思いますが、説明はとにかく立っています。

SQLバッチは、グループ化され、GOステートメントで区切られた1つ以上のステートメントのセットです。EG:最後にGOがある場合、より多くのSELECTおよびINSERTステートメントがバッチを形成します。

RPC呼び出しは、クライアントアプリケーションからデータベースへの呼び出しです。EG:Windowsサービス、Webアプリケーション、Windowsアプリなど、データベースへの接続が実際に必要なものはすべてRPC呼び出しを行います。

これで、Profilerには、データベースサーバーに関係するすべてのものが表示されます。Management Studioからのバッチ、外部アプリケーションからのRPC呼び出し(バッチまたはストアドプロシージャコール)、Management Studioからのプロシージャ実行。

これらはそれぞれTSQLステートメントで構成されているため、このプロファイラークラスは、実行をさらに拡張して実際に実行されたものを確認する場合に役立ちます。挿入するもの、selects..etc

プロファイラーでそれらを調べる最も簡単な方法は、RPC呼び出しの終了またはバッチ呼び出しの終了のみを有効にして、必要なすべての統計(期間、IO、CPU)を表示することです。次に、TSQL Statementsクラスを有効にしてさらに深く掘り下げます。


4
+1指定するだけGOで、使用する一般的なクライアント(SSMSやsqlcmdなど)のデフォルトのバッチターミネーターとして受け入れられますがGO、バッチターミネーターとしての実際の文字列は変更される可能性があり、構成可能です。
トーマスストリンガー

1
「アンRPCコール(バッチまたはストアド・プロシージャ・コールのいずれかです)」。それで、すべてが最終的にRPCですか?それを明確にできますか?
イアンサミュエルマクリーン長老

いいえ、RPCコールは、ストアドプロシージャコールまたは複数のステートメントのバッチで構成されていると言いたいと思います。このプロファイラーイベントで実際に表示されるのは、単一のプロシージャまたは複数のステートメントのバッチです。
マリアン

こちらの説明をご覧ください。その他の情報はこちら
マリアン

14

バッチとT-SQLステートメント

これは、ここの SQL Server BOL 明確に定義されています

バッチは、実行のためにアプリケーションからSQL Serverに同時に送信される1つ以上のTransact-SQLステートメントのグループです。 Goは、SSMSを含むほとんどのクライアントアプリケーションで使用されるバッチ区切り文字です。

SQL Serverは、バッチのステートメントを、実行プランと呼ばれる単一の実行可能ユニットにコンパイルします。実行計画内のステートメントは、一度に1つずつ実行されます。

私の理解に基づいた簡単な用語では、RPCは、クライアントAPIを使用してストアドプロシージャを実行するときです(例:ADO.net CommandObject。Executeメソッド)

詳細な説明は、インターネットニュースグループの投稿の1つにあります

「RPC」対「バッチ」は、ADO.NET(または任意のSQL Serverクライアント)が使用するTDS実行モードです。パラメーターのないプレーンなSQLステートメントが実行される場合、「バッチ」を使用します。ストアドプロシージャが実行される場合、 RPCを使用します(これは、スタンドアロンネットワークリモートプロシージャコールとは異なりますが、TDS(SQL Serverネットワークプロトコル)でこのモードのRPCを呼び出すだけです)。また、パラメーターを指定してバッチを実行すると、実際には、sp_executesqlというストアドプロシージャを使用し、SQLステートメント自体と残りのパラメーターを渡すため、RPCとしても表示されます。

Pablo Castro
プログラムマネージャー-ADO.NET Team
Microsoft Corp.


バッチ内の1つのステートメントが失敗すると、バッチ全体が自動的にロールバックされますか?
MonsterMMORPG

いいえ、バッチがアクティブなトランザクション内にあるか、IMPLICIT_TRANSACTIONSをONに設定しない限り、バッチ内の各ステートメントは自律的にコミットされます。バッチとトランザクションは2つの異なる概念です。私は質問が非常に古いことを知っています、私はこれを将来の読者のためにここに残すだけです。
スパゲッティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.