我有一个基本的报告解决方案,我们有一个每天导出到 CSV 文件的视图集合。由于多种原因,我们不针对事务数据库运行报告,而是针对我们临时创建的快照运行报告,然后在报告完成后删除。
这些报告非常简单,在开发机器上运行良好,即使有数百万行。
在我们的测试环境中,性能无处不在,有时需要几秒钟(与开发相同)但通常需要一分钟以上。我已经运行了一些脚本来尝试找出原因,问题始终是等待类型的PAGEIOLATCH_SH
.
这些时候的磁盘 IO 很低(2-5mb/秒),CPU 占用率大约为 5%,不需要进行其他查询就会出现问题,并且与服务器内存相比,数据库较小 (2gb)( 32GB)。报告在同一台机器上运行,但写入不同的物理磁盘。
数据库位于 Always On 可用性组中是否可能导致问题?快照与主磁盘位于不同的磁盘上是否有帮助?
任何关于问题可能是什么或如何调查的指示将不胜感激!
PAGEIOLATCH_SH 表示等待读取数据库页面。创建数据库快照时,没有任何数据库页面在缓存中,您必须从磁盘中获取它们。
查询计划可能驱动小型随机 IO,而 2-5mb/sec 是您的磁盘所能提供的全部。
数据库快照是目标数据库的 NTFS 写时复制快照。数据库及其快照之间只共享未更改页面的一个副本。如果您使用备份/恢复而不是数据库快照,那么您可以将它放在不同的磁盘上。
实际问题是碎片化——我们的索引碎片化得可怕。由于索引已修复,问题已完全消失!