2017-03-21 7 views
1

私のpgは9.5+です。postgresでjsonbインデックスを使用する方法

{ 
    "id":"58cf96481ebf47eba351db3b", 
    "JobName":"test", 
    "JobDomain":"SAW", 
    "JobStatus":"TRIGGERED", 
    "JobActivity":"ACTIVE" 
} 

そして私は、本体とキーのインデックス作成: 私は列 '身体' 内jsonbデータを持っている。これは、私のクエリです

CREATE INDEX scheduledjob_request_id_idx ON "ScheduledJob" USING gin ((body -> 'JobName')); 
CREATE INDEX test_index ON "ScheduledJob" USING gin (body jsonb_path_ops) 

を:

SELECT body FROM "ScheduledJob" WHERE body @> '{"JobName": "analytics_import_transaction_job"}'; 
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10; 

ものがリターンされています正しいデータが、誰もインデックスを使用していません。 私が見た説明:

-> Seq Scan on public."ScheduledJob" (cost=0.00..4.55 rows=1 width=532) 

だから、私はインデックスを使用しなかった理由がわからない、とどのように正しくjsonbのインデックスを使用します。

更新:

  • 私は挿入データの前にインデックスを作成し、クエリがインデックスを使用することができます。
  • しかし、最初のデータを挿入した後にインデックスを作成すると、クエリは すべてのレコードをスキャンします。

これは非常に奇妙で、データを挿入するときにインデックスを有効にするにはどうすればよいですか。

+2

'body#> '{JobName}' 'を使用したクエリでは、(body - >' JobName ')のインデックスは使用されません。同じ表現(つまり、同じ演算子)を使用して、少なくともチャンスを持ちます。 - あなたの質問の 'EXPLAIN ANALYZE'を投稿してください。あなたのテーブル*はインデックスを使用するのに十分なサンプル行を含んでいないかもしれません。 – pozs

+1

それに加えて、最初のインデックスについては、 'INDEX ON" ScheduledJob "USING btree((body - >> 'JobName'))'を使う方が良いかもしれません。 –

+0

私のテーブルの行は900です。これはインデックスを使用するには小さすぎますか? –

答えて

0

だから、私はそれをいくつかの研究とテストを実行します。クエリのこの種のは、インデックスを使用することはありません

SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10; 

を。

テーブルだけで十分なデータがある、インデックスはいつでも利用できます。

関連する問題