2016-07-25 8 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レコードにこのクエリを実行するのに長い時間がかかっています。

私はこのクエリまたはそれを達成するための代替方法を最適化する方法はありますか?助けてください。

ありがとうございます! @klinとして

+2

クエリはいつも私が「%ユーザー%」を意味0 – klin

答えて

0

指摘したように、このクエリはあなたに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 (
    SELECT * FROM JSONB_EACH(info) FROM tablename 
) AS a WHERE a.key like '%user%' 
+0

は申し訳ありませんが生じ、と私は正確なキーのテキストを知っていれば上記のクエリから、私は数を見つけることができます、ここで私は電子を知りませんでした私が好きなように使っている理由です。 – Arunraj

+0

私は情報を与えることができないのですか? 'username1'は、正確なテキスト(username1)がわからないのですが、私が持っているのは 'user'だけです.Jsonで 'user'で始まるすべてのレコードを取得する必要があります。これがクリアすることを願っています! – Arunraj

+0

更新された回答を見る – e4c5

0

を行うことができます

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

:あなたは「ユーザー%」キーワードの有限数を持っている場合は、このような何かを試すことができますそれは醜いに見えますが、私はこの仕事ができると思う:

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; 
関連する問題