如何使用一个SQL Server计划指南来调整查询
2009-01-05 10:18:37 来源:WEB开发网图1
然而,尽管只有两行存在于这个ProductID的Sales.SalesOrderDetail,针对ProductID = 897的第二次执行也还是使用了一次表扫描,在这个例子中,一个索引查找将是一个更好的选择,但是现在我们依赖于这个执行计划,该计划产生于第一次执行准备查询的时候。在一些情况下,这将成为一个棘手的性能问题,一个数据库管理员将增加一个重新编译的选项,促使优化器重新编译该语句并且每次它执行时都得到优化。
创建SQL计划指南解决了不能或不允许把提示怎发到数据库查询中的问题。下面的计划指南创建并命名为GETSALESPRODUCTS_RECOMPILE_Fix,它把重新编译应用到那个给我们带来悲痛的SELECT语句。
USE AdventureWorks
GO
EXEC sp_create_plan_guide
@name = N'GETSALESPRODUCTS_RECOMPILE_Fix',
@stmt = N'SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@ProductID int',
@hints = N'OPTION (RECOMPILE)'
GO
重新运行这些查询,适当的计划指南促使SQL语句重新编译,产生最理想的查询计划,由此在ProductID中实现传递。这样就避免了更改任何的代码。通过观察执行计划,我们可以看到对一张表的扫描可以用于ProductID = 870,但是一个索引的查找可以用在ProductID = 897。一个文件性能分析(profiler trace)也显示在该语句在执行之前被重新编译了:
更多精彩
赞助商链接