2012-12-17 89 views
4

我试图调整对操作的几个机修工我做一个数据库统计汇总2008年你如何在SQL Server一整套在SQL Server查询2008

为了挑选出最好的我经常使用SET STATISTICS IO ON这个问题的方法,但是当我将一组冗长的陈述与另一个陈述进行比较时,它并不是很方便。

因此,例如,我怎么能知道整个读/写它需要像下面这样的T-SQL语句:

WHILE @i < 1000 
BEGIN 
<some statements> 
SET @I = @I + 1 
END 

感谢您的帮助(原谅我的英文不好)。

+0

SQL事件探查器可以显示整个批处理以及单个语句的聚合数据(包括读/写)。不过这不是T-SQL方法。 –

回答

0

您可以创建一个表变量,并在其中跟踪代码段执行时间的持续时间。

例如:

DECLARE @Tracking TAABLE 
(
    ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL, 
    TheStep varchar(50), 
    Start datetime, 
    End datetime 
) 

DECLARE 
    @TheStep varchar(50), 
    @Start datetime, 
    @End datetime 

-- first block of code to track 

SET @TheStep = 'Grab data from MyTable.' 
SET @Start = getdate() 

SELECT * FROM MyTable 

SET @End = getdate() 

INSERT INTO @Tracking (TheStep, Start, End) 
SELECT @TheStep, @Start, @End 

-- reset variables for next batch of commands to measure 
SELECT @TheStep = NULL, @Start = NULL, @End = NULL 

-- after all is said and done, display the results along with duration (ms) for each. 
SELECT TheStep, DATEDIFF(ms, Start, End) 
FROM @Tracking 
+0

花费的时间并不是一个足够好的衡量标准,它无助于对锁定/并发性发表意见(而IO统计数据可以)。 – Serge

0

如何使用动态管理视图sys.dm_exec_query_stats代替SET STATISTICS IO

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Read_and_Write') 
    DROP TABLE Read_and_Write 

CREATE TABLE Read_and_Write (
    RowID INT NOT NULL, 
    RowValue CHAR(2000) 
) 

CHECKPOINT 
GO 
DBCC DROPCLEANBUFFERS 
GO 
DBCC FREEPROCCACHE 
GO 

INSERT Read_and_Write (RowID, RowValue) 
SELECT TOP 10000 
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
    'X' 
FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 

SELECT COUNT(*) 
FROM Read_and_Write 
WHERE RowID <= 500 

SELECT 
    cast((select [processing-instruction(q)] = 
    case when [sql_handle] is null then '' 
     else (substring(s.text,(q.statement_start_offset + 2)/2, 
    (case when q.statement_end_offset = -1 
      then len(convert(nvarchar(max),s.text)) * 2 
      else q.statement_end_offset 
     end - q.statement_start_offset)/2)) 
    end for xml path('')) as xml) AS sql_text, 
    last_worker_time, 
    last_elapsed_time, 
    last_logical_reads, 
    last_physical_reads, 
    last_logical_writes, 
    last_rows, 
    p.query_plan 
FROM sys.dm_exec_query_stats q 
CROSS APPLY sys.dm_exec_sql_text([sql_handle]) s 
CROSS APPLY sys.dm_exec_query_plan ([plan_handle]) p 
+0

我对不同语句的单个执行(代码中的最后一个)的统计信息不感兴趣。但是对于一组语句中的“当前”X(循环中X = 1000)执行的统计信息。 – Serge

+0

您是否希望收集一批语句的全部读取/写入操作?或者是否希望为每条语句读取/写入订单项,但是能够确定要查看的批次? – 8kb

+0

你的第一个建议是我正在寻找的。但我想所涉及的逻辑很容易适应,以实现你的第二个建议。 – Serge