2017-03-16 117 views
0

我想了解PostgreSQL物理索引布局是如何的。我所知道的是索引是作爲B樹數據結構的一組頁面的一部分存儲的。我想了解如何真空影響指數。它有助於控制它的大小嗎?PostgreSQL索引物理佈局

回答

2

B-tree索引是十年前的技術,所以網絡搜索會帶來很多很好的詳細描述。簡而言之:

B樹是平衡樹索引頁(在PostgreSQL的8KB),也就是樹的每個分支都有相同的深度。 樹通常是上下顛倒的,起始(頂部)節點是根節點,底部的頁面被稱爲葉節點。 樹的每個級別分割搜索空間;級別越深,分區越精細,直到在葉節點中達到各個索引條目。 索引頁中的每個條目都指向一個表條目(在葉節點中)或下一級別的另一個索引頁。

這是深中三指數的草圖,但記住以下幾點:

  • 一些節點被省略,在現實中所有葉子節點都在3
  • 水平實際上這裏不三個條目()中的一個節點,但大約100

 

         ┌───────────┐ 
       level 1 (root node) │ 20 75 100 │ 
            └───────────┘ 
            ╱ ╱ │  ╲ 
            ╱ ╱ │  ╲ 
           ╱ ╱  │  ╲ 
        ┌───────────┐┌─────┐┌──────────┐┌─────┐ 
      level 2 │ 5 10 15 ││ ... ││ 80 87 95 ││ ... │ 
        └───────────┘└─────┘└──────────┘└─────┘ 
             ╱ ╱ │ ╲ 
             ╱ ╱ │  ╲ 
            ╱ ╱  │  ╲ 
          ┌─────┐┌─────┐┌──────────┐┌─────┐ 
     level 3 (leaf nodes) │ ... ││ ... ││ 89 91 92 ││ ... │ 
          └─────┘└─────┘└──────────┘└─────┘ 

一些注意事項:

  • 指針到一個新的水平實際上是在項目之間的差距,在索引中搜索就像「向下鑽取」正確的葉子頁。
  • 每個節點ia也與它的同胞連接,以便於插入和刪除節點。
  • 當一個節點已滿時,它被分成兩個新節點。這種分裂可以遞增,甚至到達根節點。當根節點被拆分時,索引的深度增加1.
  • 在現實生活中,B樹索引的深度幾乎不能超過5.
  • 當索引條目被刪除時,剩餘的空白空間。有些技術可以通過加入頁面來加以鞏固,但這很棘手,而PostgreSQL不會那樣做。

現在你的問題:

當一個表()項由VACUUM刪除,因爲它不是任何活動快照可見,在指數中的相應條目被移除。這會在索引中產生空的空間,可以被未來的索引條目重複使用。

可以刪除空索引頁面,但索引的深度永遠不會減小。因此,批量刪除可以VACUUM已完成其工作後)減少索引大小,但更可能導致臃腫索引頁面只包含幾個鍵和大量的空白空間。

一定數量的指數膨脹(高達50%以上)是正常的,但如果像海量更新和刪除這樣的異常使用模式導致指數膨脹不良,則必須用REINDEX重寫指數,從而擺脫的膨脹。不幸的是,這個操作會鎖定索引,這樣所有的併發訪問都會被阻塞,直到完成。