2012-10-30 102 views

回答

7

hstore是主要PostgreSQL發行版的一部分,它在http://git.postgresql.org/和GitHub上。 Here is hstore in git head

它看起來像存儲爲varlena,這意味着它像其他東西一樣TOASTable。缺點是整個領域需要從磁盤讀取 - 至少如果它被壓縮 - 提取一個密鑰。

這也意味着像任何其他正常字段值更新該字段的任何部分需要整個元組(行)的新副本必須寫入表和舊的標記爲過期,當它是對任何活動交易都不再可見(請參見Pg手冊中的MVCC)。一個大的hstore因此對於經常變化的數據是不理想的,因爲當它的任何部分發生變化時,你都需要重寫整個事物(和包含它的行)。

來源似乎並沒有包含在註釋的方式大大提供的存儲如何hstore值的結構和概況,這是一個有點宏觀森林迅速採取。

3

存儲本身並不令人驚訝。

有趣的部分是,是如何建立索引,以便能夠有效地回答查詢,如

選擇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提出了這個問題,當我第一次看到那個時,我的頭爆炸了。