QUEST® SQL OPTIMIZER FOR SQL SERVER 8.0引入的新规则

作者:杜伟业(Richard To) 翻译:DELL软件珠海研发中心

原文:http://www.toadworld.com/products/sql-optimizer-for-sql-server/b/weblog/archive/2012/05/21/new-rules-for-quest-174-sql-optimizer-for-sql-server-8-0.aspx

正文:

新版本Quest SQL Optimizer for SQL Server 8.0有两个主要的增强功能:SQL重写引擎的改进和新模块Plan Control的引入。现在我想讨论Quest SQL Optimizer for SQL Server 8.0引入的一些新转换规则。

怎样评估SQL Server内部优化器的性能?

你可能已经知道,每条SQL语句在处理之前都会被数据库内部的SQL优化器进行优化。简单地说,数据库内部的优化器设计的初衷是为了找到处理SQL语句的最佳方法。有两种因素用于评估数据库内部的SQL优化器。第一是成本估计的正确性,第二是计划空间的大小。

一个好的成本估计算法通常会从数据库内部SQL优化器产生所有的计划中择优选取出一个好的查询计划。更大的计划空间意味着数据库内部优化器可以发掘更多的途径来处理你的SQL语句。但是,这两种因素都暴露了各自的缺点。比如,更大的计划空间需要一个更精准的成本估计算法;否则,它可能会错失SQL优化器产生的大多数好的计划。相比之下,如果一个高精准的成本优化算法仍然不能为一条SQL语句找到一个合理的计划,计划空间就会太小而不能处理这一类型的SQL语句。数据库内部SQL优化器应该提供更大的计划空间(查询方法)。

深入探索SQL Server内部SQL优化器的潜能

我们已经研发出一个新的SQL优化模块Plan Control,Quest SQL Optimizer for SQL Server 8.0引入了这一模块。根据我对SQL语句提示(HINTS)排列应用的研究,发现SQL Server的计划空间远比我想象的大得多。这就意味着SQL Server可以为一条SQL语句提供越过我预期的更多的处理方法(查询计划)。一些SQL语句性能差的问题可能由于在SQL优化过程中SQL Server内部的计划树修整或者SQL Server对计划成本的错误计算导致的。很多以前不能被我们的重写引擎搜寻到的查询计划,现在都可以被新的提示(HINTS)置换计划控制算法发现。因此,我决定在我们的重写引擎中加入新的规则,用来深入探索SQL Server内部的SQL优化器的潜能。

新的提示(HINTS)置换规则

新的提示(HINTS)置换规则是设计用来尝试在给定的配额内HINTS应用的每种组合。在市场上还没有其它产品可以完成这样的深度搜索,来为一条SQL语句探索潜在的查询计划。实际上,这种人工智能算法首次是应用在我们的SQL Optimizer for Oracle产品中。这个算法在兼顾提示(HINTS)置换树的广度和深度有很好的表现。通过引导SQL Server从它的计划空间中选择正确的计划,而避免了太多的SQL调优技术对一条SQL语句的干预。

一些干扰式SQL变换规则

上面提到过的提示置换规则是用于在SQL优化过程中探索那些没有被SQL Server选取的替在的查询计划,但是那个查询计划仍然是SQL Server计划空间中的一个。我们并没有引入任何SQL Server不能为SQL语句产生的新的东西到计划空间。

我将用下的的SQL变换规则来阐述干扰查询计划。SQL Server内部不能产生这样的计划。由于这条规则引入额外的表操作到查询计划,我将此规则称作“干扰”。从技术角度来讲,设计这一类型的规则的目的是为了扩展SQL Server内部SQL优化器的计划空间。

“NOT IN”换成“IN EXCEPT”

原SQL

Select * from TableA A

Where A.F1 NOT IN (Select B.F1 from TableB

where_clauseB)

转换后:

Select * from TableA A
Where A.F1 IN (Select C.F1 from TableA C 
EXCEPT
Select B.F1 from TableB 
where_clauseB)

这两条SQL看起来很不同,但输出结果是一样的。如果A.F1和B.F1 不是空字段。你会发现"NOT-IN 子查询"被IN和子查询(现在是WHERE子句中的TableB 组成的 “EXCEPT”部分)中的TableA所替代。这个新的语法的用意是排除TableA的A.F1 在TableB的B.F1所有记录,然后再用A.F1 排除的记录再从TableA中取回记录。新的语法引入了查询计划的另一个表访问,它是当前SQL Server版所不能产生的;如果下面的条件满足,这将是一个好的查询计划:

  1. A.F1列有索引
  2. A.F1和B.F1列有重复的值
  3. 用EXCEPT 转换过的IN子查询仅仅返回一个小的结果集

下面的SQL语句说明了这条规则结合其它规则以达到更好的性能:

相似的规则,将“NOT EXISTS” 换成“IN EXCEPT”,如下所示:

我们同样也实现了另外一些很有用的转换,如下所示。应用此规则后,这并不意味着你的SQL语句的性能可以马上得到提高。因为它必须结合其它提示(HINTS)或重写技术使SQL Server产生一个更好的查询计划。

{NOT}IN转换成INTERSECT

Select * from TableA A

Where A.F1 {NOT} IN (Select B.F1 from TableB

where_clauseB)

转换后:

Select * from TableA A

Where A.F1 {NOT} IN (Select C.F1 from TableB B

where_clauseB

INTERSECT

Select C.F1 from TableA C)

 

我的看法

在过去几个月的测试当中,我发现新重写引擎的解决问题能力相对以前的版本有了显著的提高。很多以前的版本不能优化的SQL语句现在用重写和提示(HINTS)置换规则很容易找到有改进的SQL语句。由于会产生更多的替代SQL,其代价是延长了优化的时间。你会发现智能等级的改变会显著影响产生替代SQL的数量,所以当你不能找更好的替代SQL时可以调高智能等级。

最新版本下载地址:

https://support.quest.com/softwaredownloads.aspx?pr=268445262

 

转载于:https://www.cnblogs.com/sql-expert/p/3169566.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值