A) 选择运算尽可能优先,这是最基本的一条
B) 在连接操作操作前对表进行排序或者建立索引,这样是为了减少扫描时间
C) 投影和选择同时进行。数据是以记录为单为存取得,选择运算可以过滤很多不符合条件的记录,而投影运算还是必须读取整个记录,然后选择其中的列,不过在进行笛卡尔乘积之前,是一个非常好的策略。
D) 把投影和其前的双目运算符结合起来,没有必要为了去掉一些字段而单独扫描一遍整个表
E) 把某些选择和它前面要执行的笛卡尔乘积结合起来形成一个连接运算
如果有重复出现的子表达式,并且计算这个表达式的时间大于从外存中读取表达式的结果的关系,那么可以考虑把这个表达式先计算一次,把结果保存到一个临时文件,并且从其中读取结果关系
********************
曹晓钢 在 2002-4-5 15:53:05 提供了如下回答, 请您查阅和评估:
--------------------------------------------------------------------------
---
找到SQL Expert了。
它是LECCOTECH www.leccotech.com出品的。我下了一个3.21版的for oracle的。它
居然
还有简体中文版的!其他语种都没有。
它优化的过程是这样的。你输入一个SQL语句,它开始分析所有的join什么的,还有
和
一些模式进行匹配,然后生成一堆具有同样功能的SQL语句。有一次我生成出来了114
个。
大部分情况是10个一下。它为每一个SQL语句会产生一个Expert Rank,大致标志性能
好坏。
然后你可以Batch Run.就是逐个的跑,他自己会计算时间。你可以设置如果执行时间
比原来
的还长,就中止。这样把所有的SQL都跑下来,你就知道哪个SQL是最适合你database
中的真
实数据的乐。可以想象,如果表结构一样,但是数据不同,可能优化出来的SQL是不
一样的。
比如1000条记录和1000000条记录,可能结果不同。
我把我的系统中的SQL挑了几个长的运行了一下。表连接比较少的效果就不明显。挑
两个明显的
说说。
一个是这样的 xxx and a.status <>5 .
被优化成了 a.status>5 or a.status<5 .猜猜效率提高了多少?4.23 second 到
1.67 second!
我们估计是Oracle对<>无法应用index的原因。
还有一个是原来在where字句里用了 NOT IN ( A ),它改成了 IN ( B-C)的形势,这
次从3.45秒
优化到1.07秒。
赫赫。用了这个东西,只有一个坏处,人会变懒的...
有谁有注册机的?