一直以来,在高负载,复杂的生产环境中,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!
新闻热点
疑难解答