科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道细化解析:SQL Server2005查询计划指南

细化解析:SQL Server2005查询计划指南

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如果应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本,在不直接更改查询文本的前提下,怎样提高查询性能?

作者:赛迪网 Alice 来源:天新网 2008年4月24日

关键字: Mssql SQL SQL Server 数据库

  • 评论
  • 分享微博
  • 分享邮件

问:如果应用程序数据库查询性能低下,而我们又无法获得源代码来修改查询文本,在不直接更改查询文本的前提下,怎样提高查询性能?

答: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
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章