sql server语言 - 对insert进行基准测试的最佳方式-包括所有内容



如果我想对不同的表定义如何影响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;

相关内容

  • 没有找到相关文章

最新更新