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