在jsonb postgres

时间:2016-07-25 15:32:03

标签: json postgresql jsonb

我有一个超过25M记录的Postgres表,我有一个名为info的jsonb列。

示例json格式:

{
"username1":{"name":"somename","age":22,"gender":"male"},
"fathername":{"name":"somename","age":22,"gender":"male"}
}

我将找到与'user%'键值匹配的记录数。

这是我的查询

select count(1) from tablename where info::text like '%user%';

此查询正在运行,我正在获取结果,但是需要很长时间才能在25M记录中执行此查询。

有什么方法可以优化此查询或任何其他方法来实现它?请帮忙。

提前致谢!

2 个答案:

答案 0 :(得分:0)

正如@klin所指出的那样,这个查询只会给你0:

select count(1) from tablename where info::text like 'user%';

为什么,因为这只是一个简单的模式匹配,并且您的信息栏中没有任何字符串以' user'开头。对于'%user%'你可能会有更好的运气但这将非常慢(除非您启用了trigram扩展并创建了索引)

如果您想准确计算username1设置了多少用户,那么这是一个非常简单的查询。

select count(1) from tablename where info ? 'username1'

这适用于9.5。如果你有一个有限数量的用户%'关键字,您可以尝试这样的事情:

select count(1) from tablename where info ?| array['username1','username2',..]

如果您不确定按键的性质,那么您可以

SELECT COUNT(1) FROM (
    SELECT * FROM JSONB_EACH(info) FROM tablename
) AS a WHERE a.key like '%user%'

答案 1 :(得分:0)

嗯,它看起来很难看,但我认为这可行:

select count(1) from (
    -- unnest an array of keys
    select id, unnest(array_agg(d.k)) as k from (
        -- extract info keys
        select id, jsonb_object_keys(info) as k from tablename
    ) as d
    where k like '%user%'
    group by id
) as q
group by id;