hstore内部如何存储数据?

4

我正在使用postgresql的hstore扩展,想知道数据是如何在内部存储的。请告诉我在hstore源代码中查看实现细节的位置。

2个回答

9

hstore是什么?

hstore是PostgreSQL主要分发的一部分,可以在http://git.postgresql.org/和GitHub上找到。你可以访问这里查看git head中的hstore

如何存储hstore?

它似乎是作为varlena存储的,这意味着像其他任何内容一样,它也可以被TOAST。缺点是如果压缩了字段,就需要从磁盘读取整个字段才能提取一个键。

这也意味着,与任何其他正常字段值一样,更新字段的任何部分都需要将整个元组(行)的新副本写入表中,并在其不再对任何活动事务可见时将旧副本标记为过期(请参见Pg手册中的MVCC)。因此,对于经常更改的数据而言,大型hstore是不可取的,因为每当其中任何部分发生更改时,都需要重新编写整个内容(以及包含它的行)。

如何了解hstore的结构和存储方式?

源代码中似乎没有太多的注释来提供关于如何结构化和存储hstore值的概述,而且这些代码中有很多宏,需要花费一些时间去理解。


3
存储本身并不令人惊讶。有趣的部分是如何进行索引以能够高效地回答查询,例如:
select osm_id、name、tags from planet_osm_line where 'frequency => 16.7、railway => "rail"' <@ tags;
(这是一个真实例子)意思是:“查找所有记录,其中(hstore)字段“包含”映射频率 => 16.7和铁路 => rail。”
注意:这只是从记忆中获取的信息。
其中有两个组成部分:
首先是GiST索引,可以看作是一种“松散的B树”,有时不会准确告诉您要选择哪个分支,但会给出一些分支。PostgreSQL用它来处理几何索引(您可以查询一个点是否在多边形内,例如)。该索引不能给出完美的结果,但可能大大减少搜索空间。
其次是对“哈希”(对于Perl程序员)/“字典”(对于Python程序员)的编码,以利用GiST:将哈希的每个键和每个键/值对哈希到一个小整数(细节有点模糊,但让我们假设为0..255),取一个位域,大小为此,并针对您获得的那些哈希值在您的位域中打一个洞(我想Knuth用针织针举了一个带有开/关孔的索引卡的很好的例子-是的,在这里)。
然后你只需要将这两者相结合。据我所知,Oleg Bartunov和Theodor Tsigaev提出了这个方法。我第一次看到它的时候,我的脑袋爆炸了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接