SQL Server 性能調優之--tempdb 之存放路徑

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

相關文章
相關標籤/搜索