zoukankan      html  css  js  c++  java
  • 一周以来工作总结关于高水位线

          熬过了月初的匆忙之后终于有一个喘息的机会了。最近又开始接手过去的存储过程的改造工作,我在改造中发现了一些问题,我们的同事写insert语句的时候总是喜欢加上append这个hints。这个习惯的养成应该都是我们那个模板造成的,大家在写的时候也就不去思考为什么要加这个hints了,也不知道加这个hints有什么坏处有什么好处。

         hints的作用就是叫oracle按照我们规定的方式执行SQL,比如说我们可以指定扫描某个索引,可以指定进行全表扫描。这个append就是告诉Oracle,跳过扫描freelist这个步骤,直接在队尾插入数据。

         我们都知道,表中的数据其实是存在在数据块中的,数据块中有一部分是used,有一部分是freespace,在你插入若干条数据之后,数据块就被占用了,因此会出现以下情况:

       

           这个表现在占用了1126个数据块,数据库默认的数据块大小一般都是8KB,因此现在这个表多大也能推算。后面还有一个empty_blocks,这是已经分配给数据表,但是还没有使用的数据块的数量,因为每一次对表进行拓展都是以extent为单位的,所以会出现空数据块。现在,这个1126就是这个TABLE1的高水位线。那么现在退潮了,我发现我的数据插入有错误,全错了,因此我现在delete掉所有的数据,这个时候再去查看水位线,结果会和上图一样,我就不再截图了。delete不能降低高水位线这个是共识了,不需要我证明。接下来我要把正确的数据(和刚才的数据量一样,有一个字段的值不一样而已)插入到数据表中,当然还是要加append,不然我的实验一点意义都没有,然后我再看看高水位线:

         

           看看,水位线高了,已经变成了2194。这个简单的小实验能阐述一个基本的事实:append方式插入数据时,直接在高水位线之上进行插入操作。其实这个表中还有1126个数据块被标记为了可写状态,但是这1126个块都没有被使用。如果可以的话,我可以称这1126个块为碎片,碎片影响性能,我想所有用过这个家伙的人都是知道这个道理的:

        

           说了这么多,就是为了说两个简单的道理:1 delete只是把数据清除掉,但是不能释放已经分配的空间,只有truncate能降低高水位线;2 append方式insert直接在高水位线之上进行插入操作。

          我发现把自己已经掌握的知识像写书一样写出来,会让你的知识得到升华,让你系统的知道自己会什么,不会什么,什么精通,什么略懂。我最近就在整理自己已经掌握的知识,而且在我写作的过程中我也通过查网上资料和看书获得了很多新知识,深入了解了很多我以前略懂的知识,我觉得这是一件很好的事情。

         如果想与我们分享知识,请加我们的群:120244471。

  • 相关阅读:
    Java 日期时间类
    JavaMail
    PHP连接 SQLSERVER 注意事项(经典中的经典)
    Spring 依赖注入的 几种方式
    ms sql 备份指令
    Struts2 日期类型编辑器 和 struts.xml 的存放路径
    如何将二维数组作为函数的参数传递
    gcc编译
    关于fflush(stdin)的使用与scanf输入缓冲区的问题
    LINUX socket 连接的几个问题
  • 原文地址:https://www.cnblogs.com/wingsless/p/2764620.html
Copyright © 2011-2022 走看看