それとは反対にSET SHOWPLAN_XML ON
、クエリの結果ではなく、後続のステートメントの結果セットをプランに変更しますSET STATISTICS IO ON
。
SET STATISTICS IO ON
クエリを実行し、統計をメッセージとして表示します。http://msdn.microsoft.com/en-us/library/ms131350.aspxを参照してください
ADO.NETでは、InfoMessageと呼ばれるSqlConnectionオブジェクトにイベントがあり、ハンドラーをプラグインして、サーバーが表示するメッセージ(印刷物やIO統計など)を取得できます。
SQLServer用のMSJDBCドライバーをすばやく調べましたが、近いものは見つかりませんでした。最も良いのは、SQL Server JDBCドライバーを使用してPRINT結果を表示する方法はありますか?。私のJavaの知識は薄く、他のドライバーにも同様のことがある可能性がありますが、SQLServerメッセージの結果に関する上記のリンクには「SQLServerNative ClientOLEDBプロバイダー」のみが記載されています。
もう少し調べてみると、(プロファイラーを使用して)トレースを実行しているメッセージを取得でき、メッセージは「ユーザーエラーメッセージ」EventClassの下にトレースメッセージとして表示されます。このイベントクラスには、関連付けに使用できるTransactionIDが含まれています。あなたのバッチにそれ。
SQLServerのバックグラウンドで実行されているデフォルトのトレースがあります。http://www.simple-talk.com/sql/performance/the-default-trace-in-sql-server --- the-power-of-performance-and-security-auditing /およびhttp://を参照してください。 www.sqlservercentral.com/articles/sql+server+2005/64547/を使用すると、必要なイベントをトレースに挿入するか、別のイベントを実行してそこから読み取ることができます。
正直なところですが、もっと良い解決策を見つけていただければ幸いです。
編集 :
JDBC関数を使用して印刷メッセージを取得できるがIO統計を取得できない理由はわかりませんが、トレースから始めた方向で、他の何かを提案することはできます。
これは、拡張イベントを使用して実行し、適切なイベントにハンドルを設定して、次のようにトレースを読み取ることができます。
最初にこれをDBで実行します。
CREATE EVENT SESSION QueryStats ON SERVER
ADD EVENT sqlserver.error_reported
(
ACTION(sqlserver.sql_text)
WHERE (severity = 10
AND state = 0
AND user_defined = 0
AND error = 3615)
)
ADD TARGET package0.ring_buffer
WITH(max_dispatch_latency = 1 seconds)
GO
それからあなたの声明の周り:
ALTER EVENT SESSION QueryStats ON SERVER STATE = START
SET STATISTICS IO ON
select * from MyTable -- your statement(s)
SET STATISTICS IO OFF
WAITFOR DELAY '00:00:01'; -- you have to wait because you can't set under 1 second of max_dispatch_latency
WITH QueryStats
AS (
SELECT CAST(target_data AS xml) AS SessionData
FROM sys.dm_xe_session_targets st
INNER JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE name = 'QueryStats'
)
SELECT
error.value('(@timestamp)[1]', 'datetime') as event_timestamp
,error.value('(action/value)[1]', 'nvarchar(max)') as sql_text
,error.value('(data/value)[5]', 'varchar(max)') as [message]
FROM QueryStats d
CROSS APPLY SessionData.nodes ('//RingBufferTarget/event') AS t(error)
ALTER EVENT SESSION QueryStats ON SERVER STATE = STOP
GO
そして、IO統計で2番目の結果セットを取得します。
それでも、待機時間を削除し、トレースのスコープをより適切に設定する必要があるため、ソリューションは最終的なものにはほど遠いです。これは可能かもしれません。また、トレースを実行して、それらを使用して何をしようとしているのかに応じて、後ですべてのステートメント/IO統計を取得することもできます。