如果我想对不同的表定义如何影响SQL Server中的行插入速度进行基准测试,我想仅仅将事务从BEGIN计时到COMMIT是不够的:这只测量将INSERT附加到(顺序)日志的时间花费。正确?
但真正的I / O命中是在INSERT实际应用于真实表时(在INSERT之后可能会稍微重组的聚簇索引)。如何衡量使用的总时间,包括所有时间?也就是说,所有INSERT(写入日志)的时间+用于更新“真实”数据结构的时间?在停止计时器之前执行“检查点”是否足够?
答案 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;