未在查询中使用PostgreSql jsonb列上的GIN索引

时间:2019-05-23 15:18:31

标签: postgresql indexing jsonb

我正在使用PostgreSQL 9.6。 (请不要要求我升级-我必须使用9.6)

我有一个表,其中有一个jsonb列。我在此列上创建了一个GIN索引。该表有320,000条记录。 “解释分析”表明该索引没有被使用,一个简单的查询大约需要3秒钟。

我们有一个调试记录器,它记录了所有内容,但是将其存储为JSON,格式为{“ key1”:“ value1”,“ key2”:“ value2”,...}

我们通过提取键值来收集统计信息。

创建表和索引的方式如下:

false

我运行了一个我知道不会返回任何结果的查询:

CREATE TABLE log ( 
  id SERIAL PRIMARY KEY,
  logEntry jsonb
);

CREATE INDEX log_idx_logentry on log using gin (logentry);

这需要3秒钟才能运行。

SELECT id FROM log WHERE logentry->>'modality' = 'XT'

如果我将查询写为:

EXPLAIN ANALYSE SELECT id FROM log WHERE logentry->>'modality' = 'XT' produces:

 Seq Scan on log  (cost=0.00..32458.90 rows=1618 width=4) (actual time=1328.654..1328.660 rows=0 loops=1)
 Filter: ((logentry ->> 'modality'::text) = 'XT'::text)
 Rows Removed by Filter: 323527
 Planning time: 0.450 ms
 Execution time: 1328.724 ms
(5 rows)

而且,只是为了证明表中有东西,

EXPLAIN ANALYSE SELECT id FROM log WHERE logentry->'modality' @> '"XT"'::jsonb

 Seq Scan on log  (cost=0.00..32458.90 rows=324 width=4) (actual time=1421.262..1421.266 rows=0 loops=1)
   Filter: ((logentry -> 'modality'::text) @> '"XT"'::jsonb)
   Rows Removed by Filter: 323527
 Planning time: 0.080 ms
 Execution time: 1421.309 ms
(5 rows)

返回42528

那为什么不使用索引?在生产中,我们希望日志表包含数百万条记录。

1 个答案:

答案 0 :(得分:0)

klin 有正确的答案。随着数据库的扩大,性能差异变得更加明显。