|
|
Blogs
Toad World blogs are a mix of insightful how-tos from Quest experts as well as their commentary on experiences with new database technologies. Have some views of your own to share? Post your comments! Note: Comments are restricted to registered Toad World users.
Do you have a topic that you'd like discussed? We'd love to hear from you. Send us your idea for a blog topic.
Feb
28
Written by:
中文技术资料库
2/28/2011 12:45 PM
(原文: “HOW QUEST SQL OPTIMIZER WORKS WITH HINTS” 作者:虹天软件(珠海)有限公司 杜伟业(Richard To) 原文投稿日期:2007年8月14日 星期二)
当今的数据库厂商更愿意为最终用户提供一种手段来影响一条SQL语句使用执行计划的决定。这是因为数据库的优化器不能保证它们能为一条给定的SQL语句产生最佳的执行计划。但是,当你应用优化提示(Optimization Hints)时,有时指定的提示(Hints)可能并没有影响到数据库的SQL优化器的决定。之所以优化器没有按照提示(Hints)的方向来选择执行计划,是你的SQL语句的语法阻止了数据库的SQL优化器去采用提示(Hints)。
我们来看看下面带有提示 (Hints) 和不带提示 (Hints) 的SQL语句和执行计划:

看下执行计划,这个例子显示那个USE_NL提示没有引起Oracle的SQL优化器为这条SQL语句产生嵌套循环(Nested Loop)连接。其实这是经常发生的情况,由于SQL语法的限制,数据库的SQL优化器不会按照你的提示。对于复杂的SQL语句,情况更为复杂,因为我们可能无法分辨是否提示(Hints)将被采用或者由于采用了提示(Hints)后结果是不是会变好。这就是为什么Quest SQL Optimizer采用不同的方法而没有走知识导向型的SQL调优路线。Quest SQL Optimizer中的那个SQL变换引擎将尝试尽可能多的重写SQL语法的组合并且结合了应用优化提示 (Optimization Hints) ,以探索数据库的SQL优化器的潜能,如下图所示:

这个SQL变换引擎的第一步变换了原SQL语句并且产生了一组可选的SQL语句,所有这些可选的SQL语句仍然提供了完全相同的结果集。然后Quest SQL Optimizer重写每个新产生的SQL语句并且生成另一组可选的SQL语句。引擎将继续重写每个可选的SQL语句,直到所有的SQL语句不能被重写或者直到配额用尽。
在这个SQL变换引擎用尽了对SQL语句语法的重写后,优化提示(Optimization Hints)就会被应用到原SQL语句和被重写过的每个可选的SQL语句,直到所有选择的提示(Hints)都被应用了或者直到配额用尽。
这个SQL变换引擎免去了人们“试验和错误”的努力,取而代之是复杂的计算机算法。其结果是语法重写和应用提示(Hints)结合的一个可选SQL的集合。你需要做的就是测试每个可选SQL的性能,并找出一个更好的去替代你的性能差的原SQL语句。
|
|