在咱们的OLAP的实现中,SQL超级复杂,用了不少的临时表,tempdb在安装时默认选择了安装SQLserver的本地磁盘路径,没有使用磁盘阵列。数据库
在学习PostgreSQL时发现不少专家建议把临时表空间放在SSD上或者使用RAID0+1的方式来提升写入速度,从而提升性能。性能
于是就选了一个比较复杂的SQL语句进行了相关测试,发现TempDB的存放路径对性能有很大的影响。学习
测试描述,单个临时表55w行,共生成8张临时表,最后8个临时表作join联接select group by测试
测试结果以下:优化
1. 本机磁盘 2X136G 10K SAS硬盘 RAID1spa
2. EVA4400 36块 15KX300G SAS 磁盘阵列 RAID 0+1server
3. EVA4400 36块 15KX300G SAS 磁盘阵列 RAID 5blog
能够看到把tempdb 放入磁盘阵列能够获得2倍多的性能提高,奇怪的是RAID1+0 没有比RAID5性能高多少。难道EVA已经对写入作了优化?it
放入生产环境后,原来Tempdb的平均堵塞时间由原来的300 多毫秒,下降到 9毫秒,报表的性能获得了很大提高,初步看来响应时间下降到原来的50%左右。io
另一个比较重要的优化是把tempdb的数据文件个数设置成多个,数据文件具体数目和数据库CPU的数目一致(注意不是核数)。
另外根据tempdb的大小状况,设置合适初始文件大小和增加率。
查看是否磁盘瓶颈的SQL以下:
SELECT
DB_NAME(fs.database_id) AS [Database Name]
, mf.physical_name
, io_stall_read_ms
, num_of_reads
, CAST(io_stall_read_ms / (1.0 + num_of_reads) AS NUMERIC(10, 1)) AS [avg_read_stall_ms]
, io_stall_write_ms
, num_of_writes
, CAST(io_stall_write_ms / (1.0 + num_of_writes) AS NUMERIC(10, 1)) AS [avg_write_stall_ms]
, io_stall_read_ms + io_stall_write_ms AS [io_stalls]
, num_of_reads + num_of_writes AS [total_io]
, CAST((io_stall_read_ms + io_stall_write_ms) / (1.0 + num_of_reads
+ num_of_writes) AS NUMERIC(10, 1)) AS [avg_io_stall_ms]
FROM
sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN
sys.master_files AS mf
ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
ORDER BY
avg_io_stall_ms DESC
OPTION
(RECOMPILE) ;