一直以來,在高負載,復雜的生產環境中,tempdb的壓力是成為整個實例瓶頸的重要因素之一.微軟的工程師們也在各個版本中不斷優化它的使用.到了Sql Server2014又有了新的特性使其性能得tempdb的性能有一定提升.這里我將通過實例給大家介紹tempdb在新版本中的實現變化.
我們都知道tempdb的日志無需提前落盤是其快的重要原因之一,日志無需落盤,那么數據又是如何操作的呢?這里先介紹一個重要的概念:主動寫(Eager write)
主動寫:Sql server引擎在面對最小化日志操作的情形時(blukinsert,select into,etc)會采用主動寫的方式將數據頁批量刷入(一般32頁/次)磁盤,以減小惰性寫(lazy write),檢查點(checkpoint)操作時所帶來的磁盤壓力.
熟悉Sqlserver開發的DBA或是開發人員應該知道,在使用tempdb時存在著大量的最小化日志操作,如select * into #xx,而Sql Server由于其引擎主動寫的特性使得即便是批量寫入的優化方式也會使得由于tempdb的頻繁寫入使整個磁盤IO面臨較大的壓力.好在微軟的工程師們注意到了這個情況,在Sql2014的tempdb中引擎放松了主動寫在tempdb的必要性,在特定操作中數據頁可以駐留在內存中而無需主動刷入磁盤(Sqlserver認為短暫的時間窗口),減輕了磁盤的負載,于此同時也使得tempdb的性能更高效.這里我通過一個簡單的實例給大家演示.
注:為了演示不同版本的特性,我們需要開啟跟蹤標記(TF 3917)用以捕捉主動寫行為.
我們先來看下sql2008R2 SP2下的情況 如圖1-1
select @@VERSION--Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 dbcc traceON(3604,3917,-1)----catch eager writeselect * into aaa from dbo.bigPRoductdbcc traceOFF(3604,3917,-1)-----remember turn off the TF!
新聞熱點
疑難解答