1

SET STATISTICS IO ONJDBC インターフェイス経由で使用する場合に SQL Server から返される統計情報を取得したいと考えています。

SET SHOWPLAN_XML ONへの呼び出しの実行後は実行計画になるため、実行計画の取得は非常に簡単ですStatement.execute()SET STATISTICS XML OFF2 番目の ResultSetを使用すると、Statementインスタンスによって返されます。

ただし、SET STATISTICS IO ON使用前に実行するStatement.execute()と、クエリ結果のみが返されます。それ以上の ResultSet も警告も何もありません。

その情報を入手する方法を知っている人はいますか? どこに隠されている可能性がありますか?

SQL Server 2005、SQL Server 2008R2、および SQL Server 2012 に対して、jTDS と Microsoft の JDBC ドライバー (3.0 および 4.0) を使用してみました。

クエリによって返されたすべての ResultSet ( を使用してチェック) と、およびStatement.getMoreResults()によって返された警告オブジェクトをチェックしました。Connection.getWarnings()Statement.getWarnings()

4

1 に答える 1

1

それとは反対に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統計を取得することもできます。

于 2012-07-23T12:42:41.110 に答える