Tempdb latch竞争的优化

Tempdb latch竞争的优化

一、前言

TempdbSQLserver 2005以来,已经成为SQL SERVER Instance的共享(其实一直是共享资源,这里强调下,哈哈)且关键资源,对此资源的优化,有时候对整个Instanceperformance的改善有至关重要的作用。

ATempdb中包含有:

1, User objects,如local temp table,global temp table,table variable

2, Internal objects,如用于存储group by,order by,union等操作的中间结果的worktable

3, Version store,下面这些情况会使用version store:

The following features make use of the version store:

Triggers — These have used row versions since SQL Server 2005, rather than scan the transaction log as they did in SQL Server 2000.

Snapshot Isolation and Read-Committed Snapshot Isolation — Two new isolation levels based on versioning of rows, rather than locking. Online Index Operations — Row versioning to support index updates during an index rebuild.

MARS (Multiple Active Result Sets) — Row versioning to support interleaving multiple batch requests across a single connection.

                 B监控Tempdb空间的DMV

                          Sys.dm_db_file_space_usage

                       Sys.dm_db_session_space_usage

                       Sys.dm_db_task_space_usage

                  

二、实验:高并发情况下,大量使用temp table造成对tempdb pfsgam,sgamlatch争用

 

I,实验代码:

USE test_r;

GO

CREATE PROCEDURE [dbo].[usp_temp_table]

AS

CREATE TABLE #tmpTable

(

c1 INT,

c2 INT,

c3 CHAR(5000)

) ;

 

CREATE UNIQUE CLUSTERED INDEX ix_c1 ON #tmptable ( c1 ) ;

 

DECLARE @i INT = 0 ;

WHILE ( @i < 10 )

BEGIN

INSERT INTO #tmpTable ( c1, c2, c3 )

VALUES ( @i, @i + 100, 'hahaha' ) ;

SET @i += 1 ;

END ;

GO

-- Create stored procedure that runs usp_temp_table 50 times

CREATE PROCEDURE [dbo].[usp_loop_temp_table]

AS

SET nocount ON ;

DECLARE @i INT = 0 ;

WHILE ( @i < 100 )

BEGIN

EXEC tempdbdemo.dbo.usp_temp_table ;

SET @i += 1 ;

END ;

 

II,使用ostress做压力测试工具

可以从:http://www.microsoft.com/en-us/download/details.aspx?id=4511

download,由于ostress需要Microsoft Report Viewer 2008 Redistributable (SP1 or later),请一并到

http://www.microsoft.com/en-us/download/details.aspx?id=3841下载

Microsoft Report Viewer 2008 Redistributable.

 

III,在ostress所在机器新建一个ODBC数据源,我这里ODBC数据源名是OST

 

 

单块硬盘:

 

开始实验:

A,首先看tempdb只有一个数据文件的情况

D:\Program Files\Microsoft Corporation\RMLUtils>ostress -S172.16.10.222 -DOST -dtest_r -T146 -E -Q"EXEC test_r.dbo.usp_loop_temp_table;" -ooutput.txt -n300

 

参数说明:

-S172.16.10.222 sql server instance名字,这里是默认实例

-DOST ODBC名,这里是OST

-dtest_r,test_r,数据库名

-E 使用windows集成验证

-Q,要执行的SQL命令

-o,日志存放目录

-n300 并发数,这里是300

更多参数说明,可以看ostress –help

 

                 实验结果:

                    使用

WITH TASKS

AS (

SELECT session_id,

    wait_type,

    wait_duration_ms,

    blocking_session_id,

    resource_description,

    PageID = Cast(Right(resource_description, Len(resource_description)-

    Charindex(':', resource_description, 3)) As Int)

From sys.dm_os_waiting_tasks

Where wait_type Like 'PAGE%LATCH_%' And resource_description Like '2:%')

 

SELECT

    session_id,

    wait_type,

    wait_duration_ms,

    blocking_session_id,

    resource_description,

    ResourceType = Case

    When PageID = 1 Or PageID % 8088 = 0 Then 'Is PFS Page'

    When PageID = 2 Or PageID % 511232 = 0 Then 'Is GAM Page'

    When PageID = 3 Or (PageID - 1) % 511232 = 0 Then 'Is SGAM Page'

    Else 'Is Not PFS, GAM, or SGAM page'

    End

From Tasks ;

查询得到下面的输出,d大量PAGELATCH_SHPAGELATCH_EXPAGELATCH_UPlatch争用:

图1

bb


查看下2:1:1是啥页面:

Select  db_name(database_id),page_type from sys.dm_os_buffer_descriptors where database_id=2 and file_id=1 and page_id =1

Output

   DBNAME  page_type

tempdb  PFS_PAGE

 

A, tempdbdatafile增加到CPU数量(我这里8个,每个100MB

 

USE [master]

GO

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 102400KB , FILEGROWTH = 102400KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev01', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev01.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

GO

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', FILEGROWTH = 102400KB )

GO

 

 

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev02', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev02.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

 

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev03', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev03.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev04', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev04.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

GO

 

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev05', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev05.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev06', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev06.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

 

 

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev07', FILENAME = N'E:\SQLDATA\MSSQL11.MSSQLSERVER\MSSQL\DATA\tempdev07.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB )

 

 

再跑:

D:\Program Files\Microsoft Corporation\RMLUtils>ostress -S172.16.10.222 -DOST -dtest_r -T146 -E -Q"EXEC test_r.dbo.usp_loop_temp_table;" -ooutput.txt -n300

 

 

输出:

    WITH TASKS

AS (

SELECT session_id,

    wait_type,

    wait_duration_ms,

    blocking_session_id,

    resource_description,

    PageID = Cast(Right(resource_description, Len(resource_description)-

    Charindex(':', resource_description, 3)) As Int)

From sys.dm_os_waiting_tasks

Where wait_type Like 'PAGE%LATCH_%' And resource_description Like '2:%')

 

SELECT

    session_id,

    wait_type,

    wait_duration_ms,

    blocking_session_id,

    resource_description,

    ResourceType = Case

    When PageID = 1 Or PageID % 8088 = 0 Then 'Is PFS Page'

    When PageID = 2 Or PageID % 511232 = 0 Then 'Is GAM Page'

    When PageID = 3 Or (PageID - 1) % 511232 = 0 Then 'Is SGAM Page'

    Else 'Is Not PFS, GAM, or SGAM page'

    End

From Tasks ;



图2

bb


 

Select  db_name(database_id)  DBNAME,page_type from sys.dm_os_buffer_descriptors where database_id=2 and file_id in (8,9) and page_id =1

 

DBNAME page_type

tempdb   PFS_PAGE

tempdb   PFS_PAGE

 

结果:依然存在大量的PFS争用,但是观察下来的确比单个datafile有所缓解

 

 

修改usp usp_temp_table的代码,如下

 

USE test_r;

GO

alter PROCEDURE [dbo].[usp_temp_table]

AS

CREATE TABLE #tmpTable

(

c1 INT unique clustered,

c2 INT,

c3 CHAR(5000)

) ;

 

--CREATE UNIQUE CLUSTERED INDEX ix_c1 ON #tmptable ( c1 ) ;

 

 

DECLARE @i INT = 0 ;

WHILE ( @i < 10 )

BEGIN

INSERT INTO #tmpTable ( c1, c2, c3 )

VALUES ( @i, @i + 100, 'hahaha' ) ;

SET @i += 1 ;

END ;

GO

 

 

结果:

  依然存在大量的PFS争用

 

 

开启 T1118依然存在大量PFS争用

 

 

 

 

 

 

 

多磁盘,单个tempdb datafile:

 图三

bb


fj.png1.jpg

fj.png2.jpg

fj.png3.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/101629/viewspace-762429/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/101629/viewspace-762429/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值