如果我想对不同的表定义如何影响SQL Server中的行插入速度进行基准测试,我想仅仅从BEGIN到COMMIT计时事务是不够的:这只测量将insert附加到(顺序)日志所花费的时间。对吧?
但是真正的I/O命中出现在insert实际应用到真实表(一个聚集索引,在insert之后可能会稍微重新组织)时。我如何测量使用的总时间,包括所有的时间?也就是说,所有insert(写入日志)的时间+用于更新"实际"数据结构的时间?在停止计时器之前执行"检查点"是否足够?
由于缺乏回应,我将亲自回答。
就我在各种文档中看到的,我将通过发出CHECKPOINT
来达到由查询引起的all related disk activity
。这将强制将所有脏页写入磁盘。
如果只执行要测量的查询,那么唯一的脏页面将是查询所触及的页面。所做的实验似乎支持这一"理论"。
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;