SQL Server 2005 查询计划指南

原创 2007年10月04日 11:28:00

 使用背景

   1 应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本

   2 我们不希望直接更改查询文本而又要提高查询性能

 

 基本介绍:

   SQL Server 2005引入了称为计划指南的新特性,可以帮我们解决上述问题。本质上,计划指南是通过将查询提示附加到计划指南来影响查询的优化。

 

  运作原理:

1 当应用程序向Sql Server发送代码,查询优化器首先检查在缓存中是否有一个适当的询问计划,如果有,查询就按被找到的查询计划执行。

2 如果没有匹配的查询计划,代码将被与一个称为内部查寻表(lookup table)比较, 看是否有一个已存在的计划指南与之匹配

3 如果在第2步找到匹配的计划指南,询问优化器将修改源代码以包括计划指南中查询提示。源代码中之前的任何查询提示将被新提示替换

4 查询计划将被编译和缓存

5 查询将按照你之前在计划指南设定的查询提示执行。

 

  计划指南的分类:

有三种方式的计划指南:

1OBJECT 计划指南:与在 Transact-SQL 存储过程、标量函数、多语句表值函数和 DML 触发器的上下文中执行的查询匹配。

2SQL 计划指南:与在独立的 Transact-SQL 语句和批处理(不属于数据库对象)的上下文中执行的查询匹配。基于 SQL 的计划指南还可用于与参数化为指定形式的查询匹配。SQL 计划指南适用于应用程序使用 sp_executesql 系统存储过程频繁提交的语句和批处理。

3TEMPLATE 计划指南:与参数化为指定形式的独立查询匹配。这些计划指南用于覆盖查询类的数据库的当前 PARAMETERIZATION 数据库 SET 选项。TEMPLATE 计划指南用于覆盖特定查询形式的参数化行为。您可以在以下任一情况下创建 TEMPLATE 计划指南:

 

  可以在计划指南使用中的查询提示

{HASH | ORDER} GROUP

{CONCAT | HASH | MERGE} UNION

{LOOP | MERGE | HASH} JOIN

FAST number_rows

FORCE ORDER

MAXDOP number_of_processors

OPTIMIZE FOR ( @variable_name = literal_constant ) [ ,…n ]

RECOMPILE

ROBUST PLAN

KEEP PLAN

KEEPFIXED PLAN

EXPAND VIEWS

MAXRECURSION number

USE PLAN <xmlplan>

 

  使用示例:

   以下二个存储过程创造和处理计划指南

sp_create_plan_guide

sp_control_plan_guide

 

1. sp_create_plan_guide

创建用于将查询提示与数据库中的查询进行关联的计划指南

语法:

sp_create_plan_guide [ @name = ] N'plan_guide_name'
     , [ @stmt = ] N'statement_text'
     , [ @type = ] N'{ OBJECT | SQL | TEMPLATE }'
     , [ @module_or_batch = ]
       {
                    N'[ schema_name. ] object_name'
          | N'batch_text'
          | NULL
        }
     , [ @params = ] { N'@parameter_name data_type [ ,...n ]' | NULL }
     , [ @hints = ] { N'OPTION ( query_hint [ ,...n ] )' | NULL }

 

示例

sp_create_plan_guide

@name = N'PlanGuideTest',

@stmt = N'SELECT COUNT(*) AS Total

FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d

WHERE h.SalesOrderID = d.SalesOrderID and h.OrderDate

BETWEEN ''1/1/2000'' AND ''1/1/2005'' ',

@type = N'SQL',

@module_or_batch = NULL,

@params = NULL,

@hints = N'OPTION (MERGE JOIN)'

GO

 

代码的运作原理

@name = N'PlanGuideTest'

指定计划指南的名称为 PlanGuide1

 

@stmt = N'SELECT COUNT(*) AS Total FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID and h.OrderDate
BETWEEN "1/1/2000" AND "1/1/2005" '

这段代码是询问优化器应该匹配的代码。 无论应用程序何时向服务器发送这段代码,询问优化器设法匹配代码。当发现代码和上面列出的匹配时,查询优化器在内部查询表(loolup table)中查找正确的计划指南,并运用计划指南

 

@type = N'SQL',

说明计划指南的类型,这是一个 SQL 计划指南

 

@module_or_batch = NULL,

这个代码行用于指定statement_text对象的名字,仅在计划指南类型是OBJECT 计划指南时需要

 

@params = NULL,

指定嵌入 statement_text 中的所有参数的定义,在Template 计划指南类型时需要

 

@hints = N'OPTION (MERGE JOIN)'

指定将 OPTION 子句附加到与 @stmt 匹配的查询上

 

 

2sp_control_plan_guide

删除、启用或禁用计划指南。

语法

sp_control_plan_guide [ @operation = ] N'<control_option>' [ , [ @name = ]
     N'plan_guide_name' ]

<control_option>::=

{

 DROP          --删除由plan_guide_name 指定的计划指南

 | DROP ALL     --删除当前数据库中的所有计划指南

 | DISABLE      --禁用由plan_guide_name 指定的计划指南

 | DISABLE ALL  --禁用当前数据库中的所有计划指南

 | ENABLE       --启用由plan_guide_name 指定的计划指南

 | ENABLE ALL   --启用当前数据库中的所有计划指南

 

下面是有些例子的是怎样使用这个存储过程

sp_control_plan_guide N'DROP', N'PlanGuideTest'
sp_control_plan_guide N'DISABLE', N'PlanGuideTest'
sp_control_plan_guide N'ENABLE', N'PlanGuideTest'

 

        注: 如果您设法删除﹑修改﹑一个涉及到计划指南的存储过程﹑函数﹑或DML触发器, 它系统将报错。 必须先删除计划指南

 

3.查看计划指南

可以使用sys.plan_guides目录视图查看数据库中的计划指南

SELECT * FROM sys.plan_guides

 

    

  使用事件探查器验证是否执行计划指南:

 1. 启动事件探查器 跟踪,选中性能”->”Showplan XML” 事件类型。

2. 运行查询

3. Showplan XML 事件中查找受影响的查询。

4. 如果计划指南的类型为 OBJECT SQL,则验证 Showplan XML 事件是否包含您希望与查询匹配的计划指南的 PlanGuideDB PlanGuideName 属性。或者,如果计划指南的类型为 TEMPLATE,则验证 Showplan XML 事件是否包含预期计划指南的 TemplatePlanGuideDB TemplatePlanGuideName 属性。这可以验证计划指南是否在运行。这些属性包含在计划的 <StmtSimple> 元素下。

 

 

 计划指南通常使用的情况:

1 在参数化的查询中增加OPTIMIZE FOR or RECOMPILE 询提示

2 USE PLAN查询提示强制使用更好的查询计划

3 强迫非并行查询使用MAXDOP查询提示

4 强制join查询试验join查询提示

5 删除,修改,替代现有的查询提示

 

  最佳实践:

    1 计划指南的作用域是创建这些计划指南所用的数据库

2 计划指南需要有经验的DBA才能使用

3 如果没有其他方法来解决查询效率问题,请使用一个计划指南

4 计划指南需经过测试才正式使用

5 Sql Server版本涉及或打SP补丁后,需要重新评估计划指南的效率,以确定是否继续使用计划指南

 

SQL Server 2005 查询计划指南

SQL Server 2005 查询计划指南 一  使用背景   1 应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本   2 我们不希望直接更改查询文本而又要提高查询性能 二  基本...
  • happydreamer
  • happydreamer
  • 2007年02月08日 10:59
  • 4905

《SQL Server 2005技术内幕:查询、调整和优化》:不太实用的一本书

 本书英文书名:Inside Microsoft SQL Server 2005: Query Tuning and Optimization。看英文书名大部分人会以为这是一本讲sql优化的书。中文书...
  • vincent_zuo
  • vincent_zuo
  • 2010年04月11日 22:19
  • 2937

修改维护计划,提示“库没有注册”

系统环境是 winxp sp3  解决方法:  regsvr32 dts.dll  regsvr32 msxml6.dll  regsvr32 msxml3.dll...
  • myflysun
  • myflysun
  • 2015年11月16日 16:49
  • 971

SQL server 2005 编程自动补全

微软直到SQL server 2008才支持编程自动补全功能,作为广大的SQL 2005党,我们肿么办呢? 简单的方法: 使用神工具SQL  Prompt 5.3.4.1 下载SQL...
  • guoguiyang
  • guoguiyang
  • 2013年06月20日 17:43
  • 330

SQLSERVER 2000 以及SQL Server 2005的版本号

本文主要列出了SQLSERVER 2000 以及SQL Server 2005的版本号:  首先是SQL SERVER 2000,主要包括:  RTM 2000.80.194.0  SQL Serve...
  • leamonjxl
  • leamonjxl
  • 2011年07月08日 14:44
  • 4776

SQL Server 2008 参数化查询 --可重用的缓存计划

我将讨论如果一个查询可以被参数化,那么SQL Server优化器怎样尝试将其参数化,以及你可以怎样建立你自己的参数化查询. 1.什么是参数化查询? 一个简单理解参数化查询的方式是把它看做只是一个T...
  • leamonjxl
  • leamonjxl
  • 2012年04月11日 15:14
  • 2168

SQL Server 2005外部不能访问的解决办法

最近安装了SQL Server 2005企业版。其他都还顺利,但是却无法连接著名的1433端口,百思不得其解。于是进入SQL Server的配置管理器中才发现SQL Server 2005默认没有开启...
  • JimFire
  • JimFire
  • 2014年10月09日 18:05
  • 3717

sqlserver 2005导出数据为sql的办法

在2005中只能把数据库表的结构导出为sql是可以的,但是默认情况下是无法导出数据为sql的。但是在2008中是可以把数据也导出为sql的。这里介绍一个办法在2005中把数据导出为sql。先下载一个m...
  • silence1214
  • silence1214
  • 2011年04月12日 15:40
  • 5599

Sql server 2005占用CPU100%

大家看下解决过程: 一旦异常出现,正如医生看病,首先要探明问题出现的原因,才能够对症下药,有的放矢,方能解决问题。DBA某种程度上正是数据库的医生。面对持续100%的CPU占用率这样的经典疑难杂症,...
  • hjm1980_2004
  • hjm1980_2004
  • 2015年03月10日 11:51
  • 449

SQL SERVER 2005 简介

      SQL SERVER 2005 简介    一直以来,T-SQL都是容易上手的结构化查询语言,随着SQL Server的版本演进,除了内部功能增加,T-SQL也大幅扩增了新的查询指令。例如...
  • ylqmf
  • ylqmf
  • 2010年02月23日 18:08
  • 4844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 2005 查询计划指南
举报原因:
原因补充:

(最多只允许输入30个字)