正确的语法是:
select /*+ index(x idx_t) */ * from t x where x.object_id=123
/*+ */ 和注释很像,比注释多了一个“+”,这就是Hint
上面这个hint的意思是让Oracle执行这个SQL时强制走索引。
如果hint的语法有错误,Oracle是不会报错,只是把/* */里的内容当做注释而已。
不合理使用Hint的危害:
由于表中的数据是会变化,一般不能在程序中的sql里用Hint,假如像上面的Hint一样强制走索引。万一某一天object_id=123的返回结果占了全表的50%以上,这时候走索引会比全表扫描慢。所以不该强制所有情况都走索引。Hint一般用于一次执行,比如做数据抽取。而且一般Oracle在99%的情况下会判断正确是否该走索引,不需要我们去指定。Hint只是为了应付1%的情况下。
Append的使用:
append是另一种Hint,一般用法:
insert /*+ append */ into b select * from a;
这种insert比普通的insert会快一些,但代价也大。
1、当表中的数据被delete以后,表空间会留下空隙,下次insert时会去填补空隙。但是append的insert不会去找空隙,而且直接追加到新的空间里。如果一直用append,会使表空间越来越大。
2、这点是比较致命的,就是用append的时候,会把整个表锁住,别的用户即使insert别的数据也要被阻塞。
所以生产环境肯定不能用append,append也一般用于数据抽取一类的工作。
其实大多数情况下,用append提高不了多少效率。
因为append之所以快的原因,是因为减少了日志产生。
只有以下场景append会减少日志产生:
1、非归档模式下
2、归档模式下,表的状态是nologging
首先非归档状态一般是不可能的,稍微重要点的系统都必须开归档。
归档模式下nologging一般也很少,没日志了,也就意味着将来恢复数据会不完整,这是有风险的。
总之就是,Hint适用的场景其实很少,就是知道有这么个东西,用的时候要谨慎