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

  • 相关阅读:
    深入理解Java虚拟机-走进Java
    springboot服务引入外部jar包在windows运行正常,在linux环境上无法加载到引入jar包的类
    ActiveMQ数据接收类型问题
    kafka报文一直打印的问题
    Java基本语法
    flask跨域问题
    flask接口传参
    iTextSharp导出PDF模板(报告)
    ASP.NET中<%=%>、<%%>、<%@%>、<%#%>的用法与区别
    python AES+SHA1PRNG
  • 原文地址:https://www.cnblogs.com/xiaohuizhenyoucai/p/11002242.html
Copyright © 2011-2022 走看看