我使用postgresql hstore擴展,並好奇數據如何存儲在內部。請指點我可以在hstore源代碼中查看實現細節。hstore如何在內部存儲數據?
回答
hstore
是主要PostgreSQL發行版的一部分,它在http://git.postgresql.org/和GitHub上。 Here is hstore
in git head。
它看起來像存儲爲varlena,這意味着它像其他東西一樣TOASTable。缺點是整個領域需要從磁盤讀取 - 至少如果它被壓縮 - 提取一個密鑰。
這也意味着像任何其他正常字段值更新該字段的任何部分需要整個元組(行)的新副本必須寫入表和舊的標記爲過期,當它是對任何活動交易都不再可見(請參見Pg手冊中的MVCC)。一個大的hstore
因此對於經常變化的數據是不理想的,因爲當它的任何部分發生變化時,你都需要重寫整個事物(和包含它的行)。
來源似乎並沒有包含在註釋的方式大大提供的存儲如何hstore值的結構和概況,這是一個有點宏觀森林迅速採取。
存儲本身並不令人驚訝。
有趣的部分是,是如何建立索引,以便能夠有效地回答查詢,如
選擇osm_id,名稱,標籤從planet_osm_line其中「頻率=> 16.7,鐵路=>‘軌道’」 < @標籤;
(這是從一個真實的例子)含義:「尋找到(hstore)字段中的所有記錄‘包含’映射頻率=> 16.7和鐵路=>軌
CAVEAT:這僅僅是從存儲器。
有兩個組成部分到:
首先是GiST index,這可以被看作是一種「不拘小節的B-Tree」的有時不會告訴你到底採取哪一個分支,但給你有一組分支,PostgreSQL將它用於諸如幾何索引之類的東西(在這裏你可以查詢一個點是否在po中例如,)。該指數並沒有給你一個完美的打擊,但可能會大大減少搜索空間。
其次,爲了利用GiST,您需要對散列(對於Perlists)/「字典」(對於Pythonist)進行編碼:將散列中的每個鍵和每個鍵/值對散列成一個小int(細節是模糊的,但我們假設爲0..255),取一個這樣大小的位域,併爲你獲得的每一個散列值在你的位字段中鑽一個洞(我認爲Knuth有一個很好的例子,索引卡片已經打開/在他們的邊緣和編織針上的封閉孔 - 是的,here it is。
然後,你只需要和那兩個人結婚吧,AFAIR Oleg Bartunov和Theodor Tsigaev提出了這個問題,當我第一次看到那個時,我的頭爆炸了。
- 1. Neo4j如何在內部存儲數據?
- 2. Android:如何在內部存儲器上存儲數據?
- 3. 數據庫如何在B-Tree/B + Tree內部存儲數據
- 4. 圖形數據庫如何在內部存儲其數據?
- 5. Javascript - 數組如何在內部存儲?
- 6. Android:在內部存儲數據
- 7. 在內部存儲數據C#
- 8. 如何在Android內部存儲數據結構(如HashMap)?
- 9. 將數據保存到內部存儲
- 10. 如何將數據庫從內部存儲備份到外部(共享)存儲
- 11. 如何使用存儲在內部數據存儲器中的圖像android
- 12. 如何查看數據庫內電話內部存儲器
- 13. 如何在內部存儲備份sqlite數據庫
- 14. 訪問數據如何在Android中形成內部存儲器
- 15. 如何在svg對象內部存儲自定義數據?
- 16. 將個人數據存儲在內部存儲器中
- 17. 在內部存儲
- 18. 在外部存儲數據
- 19. OpenGL如何在內部存儲命令?
- 20. BigInteger如何在內部存儲值?
- 21. Python如何在內部存儲列表?
- 22. JavaScript如何在內部存儲空值?
- 23. 如何存儲和讀取內部存儲器中的整數
- 24. 如何存儲小部件的數據?
- 25. 如何存儲大部分空數據?
- 26. 外部函數如何「存儲」內部函數的參數?
- 27. 如何將數據存儲內的MongoDB
- 28. 如何從內部存儲讀取數據?
- 29. 如何從內部存儲更新數據?
- 30. 如何將數據存儲到SWF內部