Oracle Hint(提示)和INDEX(索引)的一些忠告
Oracle的hint种类繁多,大致可以分为下面几类:
优化方式和目标:如RULE、CHOOSE、FIRST_ROWS、ALL_ROWS等。
访问路径:如INDEX、FULL、CLUSTER、INDEX_FFS等。
查询转换:如MERGE、USE_CONCAT、NO_EXPAND等。
连接顺序:如LEADING、ORDERED、STAR等。
连接操作:如USE_NL、USE_HASH、USE_MERGE等。
并行执行:如PARALLE、NOPARALLEL、PARALLEL_INDEX等。
其他类型;如APPEND、UNNEST、CACHE等。
INDEX只是Hint的一类。
关于LEADING、ORDERED:
/*+ORDERED*/提示按照from后表的顺序执行。
/*+LEADING(table1 table2 ...)*/提示按照指定顺序执行。
关于USE_NL、USE_HASH、USE_MERGE:
我测试的是10g,三者只需填写表名作为参数,无顺序需要,应该是Oracle自动选择驱动表。
但是、可以用LEADING或ORDERED指定顺序。
(注意)INDEX的使用影响的是表自身的查询;USE_NL、USE_HASH、USE_MERGE影响的是表之间的连接。
详细参考:http://hi.baidu.com/di_wan/modify/blog/618aedca267ab783c8176829
关于INDEX参考:http://hi.baidu.com/di_wan/blog/item/fd943290b5a66388a877a424.html
Hint是把双刃剑,甚至是颗炸弹。
对于DB设计者、SQL制作者、DBA在优化SQL时,存在以下效率的高低:
追加约束条件 > 调整SQL逻辑 > 设计INDEX > 加入Hint
而且越后面的风险也越大。
因为开发环境、测试环境、最终客户环境的数据量、数据库版本、硬件等等总会有不同;
而Hint是强制执行的(自动忽略错误Hint语句),
就会产生在某处高效的Hint,在另一处却非常耗费资源。
如果不是可以在最终客户环境上操作的DBA,最好不要写Hint,
只要做好INDEX,
Oracle的自动优化一定会用。