通常对于一种功能单一的数据库来讲,在实例级设置一个优化器模式就可以了,
比如对于OLAP系统,绝大多数时候数据库上运行着的是报表作业,执行基本上是聚合类的SQL操作,
如GROUP BY,这时候,把优化器模式设置成all_rows是恰当的。
而对于一些分页操作比较多的网站类数据库,设置成first_rows会更好一些。
假设我们的数据库上运行着的基本上是一个OLAP系统,所以优化器模式设置为ALL_ROWS,这有利于报表SQL的快速完成。
但数据库上还运行着一些用户查询的业务,查询的方式可以说成是分页的。有时候就会oracle账号出现用户抱怨查询慢的问题,
尽管我们知道问题所在,却比较难解决,因为这些SQL已经被开发人员写到代码里面了。
针对这种情况,如果能在开发阶段就考虑到这个问题,针对需要分页操作的SQL,开发人员在SQL里通过Hint的方式来将优化模式转换成FIRST_ROWS,这样就可以大大地提高数据的处理速度。
比如这样一个每次取出10条记录的分页查询:
Select * from (SELECT /*+ first_rows(10) */ a.*,rownum rnum from (SELECT /*+ first_rows(10) */ id,name from t1 order by id) a Where rownum=1;
可以在每个子查询中重复使用FIRST_ROWS(n)来提高查询效率。
尽管说在SQL中人为地加入Hint操作不是一个好主意,但是有些时候,比如需要兼顾其他的用户操作时,可以考虑做这样的设定。
但前期需要做一些测试工作,以确保这样的设定能够带来性能上的提高,同时不会对数据库造成其他方面的影响。这是系统设计阶段应该仔细考虑好的一个问题。
本文出自“风中一叶”