对INSERT进行基准测试的最佳方式 - 全包?

时间:2011-07-17 22:45:48

标签: sql-server query-tuning

如果我想对不同的表定义如何影响SQL Server中的行插入速度进行基准测试,我想仅仅将事务从BEGIN计时到COMMIT是不够的:这只测量将INSERT附加到(顺序)日志的时间花费。正确?

但真正的I / O命中是在INSERT实际应用于真实表时(在INSERT之后可能会稍微重组的聚​​簇索引)。如何衡量使用的总时间,包括所有时间?也就是说,所有INSERT(写入日志)的时间+用于更新“真实”数据结构的时间?在停止计时器之前执行“检查点”是否足够?

2 个答案:

答案 0 :(得分:1)

由于缺乏回应,我将自己回答。

据我在各种文档中看到,我会通过发出all related disk activity来查询CHECKPOINT。这将强制将所有脏页写入磁盘。

如果只执行要测量的查询,则唯一的脏页将是查询所触及的页面。所进行的实验似乎支持这种“理论”。

答案 1 :(得分:0)

对于您在设置后运行的每个语句,

SET STATISTICS TIME ON将为您提供MS的运行和CPU时间

编辑: 使用下面的查询,您可以确切地了解执行时缓冲池中有多少页面是脏的,以及它们的大小(以MB为单位)以及在服务器和总计上配置的最大/最小内存。

SELECT
ISNULL((CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END),'Total Pages') AS [Database Name],
SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END)  AS [Dirty Page Count],
SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END)  AS [Clean Page Count],
COUNT(*) * 8.0 / 1024.0 [Size in MB], a.value_in_use [Min Server Memory], 
b.value_in_use [Max Server Memory]
FROM sys.dm_os_buffer_descriptors
INNER JOIN sys.configurations a on a.configuration_id = 1543
INNER JOIN sys.configurations b on b.configuration_id = 1544
GROUP BY [database_id],a.value_in_use,b.value_in_use WITH CUBE
HAVING A.value_in_use IS NOT NULL AND B.value_in_use IS NOT NULL
ORDER BY 1;