我们拥有大量写产品的数据库。我们刚刚购买了带有SSD的新服务器,以提供帮助。令我们惊讶的是,插入速度并不比存储速度慢得多的旧机器快。在基准测试期间,我们注意到SQL Server进程显示的IO速率非常低。
例如,我运行了在此页面上找到的脚本,除了我在循环周围添加了BEGIN TRAN和COMMIT之外。充其量我可以看到磁盘使用率达到7Mb / s,而CPU几乎没有达到5%。该服务器已安装64Gb并正在使用10。总运行时间为首次呼叫2分钟15秒,而后续呼叫大约1分钟。数据库正在简单恢复中,并且在测试期间处于空闲状态。我在每次通话之间都放了桌子。
为什么这么简单的脚本这么慢?几乎根本不使用硬件。专用的磁盘基准测试工具和SQLIO均表明SSD可以正常运行,并且读写速度高达500Mb / s。我知道随机写入比顺序写入要慢,但是我希望像这样的简单插入到没有聚簇索引的表中会更快。
最终,我们的情况要复杂得多,但是我觉得我需要先了解一个简单的案例。简而言之,我们的应用程序删除旧数据,然后使用SqlBulkCopy将新数据复制到临时表中,执行一些过滤,最后根据情况使用MERGE和/或INSERT INTO将数据复制到最终表中。
->编辑1:我遵循了马丁·史密斯(Martin Smith)链接的过程,得到以下结果:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
考虑到没有要显示的结果,也没有数据可以传输到SQL文件以外的任何地方,我发现NETWORK_IO花费的时间很奇怪。NETWORK_IO类型是否包含所有IO?
->编辑2:我创建了20Gb RAM磁盘,并从那里安装了数据库。我在SSD上的最佳时间是48秒,而RAM磁盘的时间减少到了37秒。NETWORK_IO仍然是最大的等待。对RAM磁盘的最大写入速度约为250Mb / s,而它每秒可以处理几千兆字节。它仍然没有使用太多的CPU,那么什么阻碍了SQL?
NETWORK_IO
可能是从3万美元的“1行(S)的影响”的消息被送回。您是否尝试添加SET NOCOUNT ON
到脚本?
EE_WaitStats*.xel
因此旧的脚本将污染您的结果。
SET NOCOUNT ON
到它。