2012-06-19 70 views
1

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

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

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

有没有人有线索我怎么能得到这些信息?它可能隐藏在哪里?

我尝试使用JTDS以及微软的JDBC驱动程序(3.0和4.0)对SQL Server 2005,SQL服务器2008 R2和SQL Server 2012的

我检查查询返回的所有结果集(通过使用Statement.getMoreResults()检查)以及由Connection.getWarnings()Statement.getWarnings()返回的警告对象。

回答

0

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统计信息的例子。

我已经很快地查看了SQL Server的MS JDBC驱动程序,并没有发现任何关闭,最好的是我发现这是:Is there a way to display PRINT results with SQL server JDBC driver?。 虽然上述SQL Server消息结果链接仅提及“SQL Server Native Client OLE DB提供程序”,但我的Java知识很薄弱,并且其他驱动程序中可能有类似的内容。


寻找多一点之后,我发现,你可以得到的消息乳宁痕迹(与分析器),并显示为“用户错误消息”事件类,其中包含下一个跟踪消息的消息您可以使用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/,您可能会在跟踪中插入需要的事件,或者运行另一个事件,然后从中读取。

虽然很恳切,但我希望你找到更好的解决方案。

编辑:

我不知道为什么你就可以得到打印的消息,但没有IO统计与JDBC功能,但我会提出别的东西,在我开始跟踪的方向。

你可以做到这一点与扩展的事件,把右边事件句柄,像这样的东西之后读了踪迹:

首先对数据库执行此:

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统计信息。

+0

感谢您的回答。使用'PRINT'“发送”的消息可以使用提到的'Statement.getWarnings()'或'Connection.getWarnings()'来检索。我已经使用它来获取这些消息。但是他们都没有返回IO统计数据。 –