1

我想检索SET STATISTICS IO ON通过 JDBC 接口使用时 SQL Server 返回的统计信息。

获取执行计划非常简单,因为在运行SET SHOWPLAN_XML ON调用的结果之后Statement.execute()将是执行计划。当使用SET STATISTICS XML OFF第二个 ResultSet 时,Statement实例返回。

但是,SET STATISTICS IO ON在使用之前运行时,Statement.execute()只返回查询结果。没有更多的结果集,没有任何警告。

有谁知道我如何获得这些信息?它可能隐藏在哪里?

我尝试对 SQL Server 2005、SQL Server 2008R2 和 SQL Server 2012 使用 jTDS 以及 Microsoft 的 JDBC 驱动程序(3.0 和 4.0)。

我检查了查询返回的所有 ResultSets(使用检查Statement.getMoreResults()),以及由Connection.getWarnings()and返回的警告对象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 中,SqlConnection 对象上有一个名为 InfoMessage 的事件,您可以在该事件上插入一个处理程序并获取服务器显示的任何消息,例如打印或 IO 统计信息。

我快速查看了 SQL Server 的 MS JDBC 驱动程序,但没有找到任何接近的东西,我发现最好的是:Is there a way to display PRINT results with SQL server JDBC driver? . 我的 Java 知识很薄,尽管 SQL Server 消息结果上的上述链接仅提到“SQL Server Native Client OLE DB 提供程序”,但其他驱动程序中可能会有类似的东西。


在查看了更多信息后,我发现您可以获取运行跟踪的消息(使用分析器),并且该消息显示为“用户错误消息”事件类下的跟踪消息,其中包含您可以用来关联的 TransactionID它到你的批次。

在 SQL Server 的后台运行默认跟踪。请参阅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 统计信息的结果集。

尽管如此,解决方案还远未最终确定,因为需要消除等待时间并更好地确定跟踪范围,这可能是可能的。您还可以让跟踪运行并在以后及时获取所有语句/IO 统计信息,具体取决于您打算如何处理这些。

于 2012-07-23T12:42:41.110 回答