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%5Fwan/modify/blog/618aedca267ab783c8176829

关于INDEX参考:http://hi.baidu.com/di%5Fwan/blog/item/fd943290b5a66388a877a424.html


Hint是把双刃剑,甚至是颗炸弹。

对于DB设计者、SQL制作者、DBA在优化SQL时,存在以下效率的高低:
追加约束条件 > 调整SQL逻辑 > 设计INDEX > 加入Hint
而且越后面的风险也越大。
因为开发环境、测试环境、最终客户环境的数据量、数据库版本、硬件等等总会有不同;
而Hint是强制执行的(自动忽略错误Hint语句),
就会产生在某处高效的Hint,在另一处却非常耗费资源。

如果不是可以在最终客户环境上操作的DBA,最好不要写Hint,
只要做好INDEX,
Oracle的自动优化一定会用。

原文地址:https://www.cnblogs.com/datang/p/2420040.html