2016-07-25 64 views
1

我有一個超過25M記錄的Postgres表,那裏有一個名爲info的jsonb列。在jsonb中替代像postgres

樣品JSON格式:

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

我要找到匹配「用戶%」鍵值的記錄數。

這裏是我的查詢

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

這個查詢工作,我得到的結果爲,但它是需要長時間在25M記錄執行此查詢。

有什麼辦法可以優化這個查詢或任何其他方法來實現它?請幫忙。

在此先感謝!

+2

查詢總會讓步0 – klin

回答

0

由於@klin如指出的那樣,這個查詢只會給你0:

select count(1) from tablename where info::text like '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%' 
+0

對不起我的意思是「%用戶%」,並從上面的查詢,我能找到的計數,如果我知道確切的關鍵文本,在這裏我不知道e xact文本,這就是我使用like的原因。 – Arunraj

+0

我的意思是我不能提供信息? 'username1',因爲我不知道確切的文本(username1),我得到的只是'用戶',我需要獲取所有以'user'開頭的記錄。希望這個清除! – Arunraj

+0

查看更新的回答 – e4c5

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;