首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL Server 2005 计划指南,该如何处理

2012-01-28 
SQL Server 2005 计划指南一使用背景1应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本2

SQL Server 2005 计划指南
一     使用背景
      1   应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本
      2   我们不希望直接更改查询文本而又要提高查询性能

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

三     运作原理:
1.   当应用程序向Sql   Server发送代码,查询优化器首先检查在缓存中是否有一个适当的询问计划,如果有,查询就按被找到的查询计划执行。
2.   如果没有匹配的查询计划,代码将被与一个称为内部查寻表(lookup   table)比较,   看是否有一个已存在的计划指南与之匹配
3.   如果在第2步找到匹配的计划指南,询问优化器将修改源代码以包括计划指南中查询提示。源代码中之前的任何查询提示将被新提示替换
4.   查询计划将被编译和缓存
5.   查询将按照你之前在计划指南设定的查询提示执行。

四     计划指南的分类:
有三种方式的计划指南:  
1.OBJECT   计划指南:与在   Transact-SQL   存储过程、标量函数、多语句表值函数和   DML   触发器的上下文中执行的查询匹配。  
2.SQL   计划指南:与在独立的   Transact-SQL   语句和批处理(不属于数据库对象)的上下文中执行的查询匹配。基于   SQL   的计划指南还可用于与参数化为指定形式的查询匹配。SQL   计划指南适用于应用程序使用   sp_executesql   系统存储过程频繁提交的语句和批处理。
3.TEMPLATE   计划指南:与参数化为指定形式的独立查询匹配。这些计划指南用于覆盖查询类的数据库的当前   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   匹配的查询上


2.sp_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触发器,   它系统将报错。   必须先删除计划指南。


[解决办法]
学习
[解决办法]
学习
[解决办法]
学习
[解决办法]
学习

热点排行
Bad Request.