与此相反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 统计信息,具体取决于您打算如何处理这些。