我想了解PostgreSQL物理索引布局是如何的。我所知道的是索引是作爲B樹數據結構的一組頁面的一部分存儲的。我想了解如何真空影響指數。它有助於控制它的大小嗎?PostgreSQL索引物理佈局
0
A
回答
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
重寫指數,從而擺脫的膨脹。不幸的是,這個操作會鎖定索引,這樣所有的併發訪問都會被阻塞,直到完成。
相關問題
- 1. Rails索引頁面佈局樣式
- 2. PostgreSQL裏的索引
- 3. 聚合物:網格佈局
- 4. 購物車概要佈局
- 5. 使用Rails/Postgresql索引多列索引
- 6. 引導佈局Coloumn
- 7. 引導DIV佈局
- 8. WPF物理引擎
- 9. Android物理引擎
- 10. WPF物理引擎?
- 11. 試圖理解布爾數組索引
- 12. PostgreSQL索引運行時間
- 13. PostgreSQL的索引JSONB陣列
- 14. PostgreSQL唯一索引錯誤
- 15. Postgresql索引範圍類型
- 16. PostgreSQL索引使用分析
- 17. HTML佈局清理?
- 18. 確定HTML文本和圖像的物理佈局
- 19. 如何在android中獲取物理鍵盤佈局
- 20. PostgreSQL索引如何引用行?
- 21. 爲什麼Postgresql搜索文本索引比Int索引快?
- 22. CListCtrl獲取物品索引
- 23. 獲取物品索引(rownum)
- 24. 添加間隔物線佈局的PyQt
- 25. Hook Rails引擎進入全局佈局
- 26. 兩欄佈局引導
- 27. Zend佈局和引導
- 28. 引導2列布局
- 29. React.JS碼頭佈局引擎
- 30. HTML5引導流程佈局