我正在将复合类型转换为 NoSQL 类型之一,并对 hstore 和 jsonb 进行了性能测试。由于某种原因,jsonb 越慢,键-> 值对越多。
我当前的类型如下所示:create type comp_type (key integer, value integer);
它作为数组存储在表中create table test_table (id serial, values comp_type[]);
这很好,直到我需要在复合类型的数组中获取具有某些键的行,而这样做的唯一方法是这样做unnest()
很昂贵。因此,我决定将此数据类型迁移到 hstore 或 jsonb 中,因为它们都提供了我需要的运算符 ( ?|
)。
hstore 在 seq 扫描期间和使用 gin 索引时都更快。我承认 hstore 上的 gin 索引比 jsonb 上的等价物要贵得多,但即便如此,在 hstore 上进行 seq 扫描也比在 jsonb 上使用索引要快。
这是它在现场演示中的样子:http ://rextester.com/KPNQ26624
实际数据有更多的 key->value 对,因此性能下降得更多,以至于 jsonb 作为简单的 key->value 存储毫无价值。任何想法为什么会发生这种情况以及如何解决?