zoukankan      html  css  js  c++  java
  • Oracle Hint 用法

    正确的语法是:

    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适用的场景其实很少,就是知道有这么个东西,用的时候要谨慎

    参考:

    https://www.cnblogs.com/attlia/p/3866593.html

  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/xiaohuizhenyoucai/p/11002242.html
Copyright © 2011-2022 走看看