在咱們的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) ;