在对Oracle查询进行优化的时候,大家的重点一般落在索引的建立使用、提示的使用等方面,往往会忽略表间顺序的问题,在进行简单的多表查询的时候,按照正常的业务逻辑得出的结果,有可能会造成效率的极大降低。
例如:人物表Person有记录10万,状态表(State)有记录100万。
现要找在10天内发生变化的人物信息,只要将人物表的pid与状态表的id相关联,并且定位时间条件即可,按照正常思维逻辑的很容易得出如下写法:
select p.* from Person p, State s where p.pid=s.id and s.updtime>sysdate-10
按照这种写法,当然也能得出来结果,可是经过查看执行计划,发现查找过程是以State为基础表执行的,实际上我们完全可以用Person表做为基础表进行查询,这样可以极大地简化计算量,所要做的就是将表的前后顺序调换一下,将数据量较小的表放在后面作为基础表,如下:
select p.* from State s,Person p where p.pid=s.id and s.updtime>sysdate-10
经过以上调整,计算量简化了,效率也提高了。当然如果只是2个表间的关联查询,性能上的提升在目前超高的计算机计算速度下,不是那么明显。可是,一些复杂的语句里,几处这样微小的调整可能带来整体效率几十倍甚至上百倍的提升。
当然Oracle中关于基础表的选择是一个非常复杂的过程,不是简单的表间顺序就能决定的。Oracle的优化网上个有很多的资料可以参考,并不是当前关注的重点。但是一个不好的习惯往往在不经意间,就会造成效率的低下,并且不易察觉。本文想要提醒的,同样也是非常容易被忽略的一个问题就是:在进行检索查询的时候,一定要留心表间顺序,基础表的正确选择有时候会带来效率的提升,反之。。。。。
1 条评论:
高,实在是高。
发表评论