一周以來工作總結--關於高水位線


      熬過了月初的匆忙之后終於有一個喘息的機會了。最近又開始接手過去的存儲過程的改造工作,我在改造中發現了一些問題,我們的同事寫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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM