【问题标题】:Most efficient way to retrieve a unique list of keys from all rows of an hstore?从 hstore 的所有行中检索唯一键列表的最有效方法?
【发布时间】:2012-08-18 04:48:30
【问题描述】:

为简单起见,假设我有一个表,其中只有一个 hstore。从 hstore 的所有行中获取所有键的唯一列表的最有效方法是什么?

例如。

my_hstore
------------
a=>1,b=>2
b=>2,c=>3
x=>10,y=>11
y=>11,z=12

检索包含 (a,b,c,x,y,z) 的列表/数组/集合的最有效方法是什么?

【问题讨论】:

    标签: postgresql postgresql-9.1 hstore


    【解决方案1】:

    总是有直接的skeys 方法:

    select distinct k
    from (
        select skeys(my_hstore) as k
        from your_table
    ) as dt
    

    如果你需要一个数组,那么添加一个array_agg:

    select array_agg(distinct k)
    from (
        select skeys(my_hstore) as k
        from your_table
    ) as dt
    

    【讨论】:

    • 谢谢,这行得通。它当然很快,但它是不是最有效的,又不会太过分和过于复杂?我可以添加任何类型的索引来加速此类查询吗?
    • 查看文档,我没有看到关于 hstore 的键将被索引的事实(这是有道理的,因为 hstore 应该是一个通用容器,而不是与索引表相同的功能)。所以我想上面的查询是最有效的。
    • 一个 hstore 列可以用 GiST 索引(也许是 GIN,我不确定),但我看不出这样的索引对 this i> 特定查询。如果表中有很多行,使用索引搜索特定的键/值对 is 会更快。一般来说,索引对所有数据都在一页或两页中的表格没有帮助。
    • @kgrittn:关于如何以一种不会是表扫描的方式执行此操作的任何想法?我想你可以有一个(key,n) 缓存表和一些触发器来维护计数器(n)并在n = 0 时删除缓存表行,但这可能是太多的机器。
    • 我认为select distinct skeys(my_hstore) from my_table 有效
    猜你喜欢
    • 2016-07-25
    • 2023-02-09
    • 1970-01-01
    • 2014-12-31
    • 2018-12-18
    • 2013-02-28
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多