我正在使用postgresql 9.6。(请不要要求我升级 - 我必须使用9.6(
我有一个具有JSONB列的表。我在此列上创建了杜松子酒索引。该表有320,000个记录。"解释分析"表明该索引没有使用,简单的查询大约需要3秒钟。
我们有一个调试记录仪,除了将其记录在格式{" key1":" value1"," key2":" value2",...}
我们通过提取键的值来收集统计信息。
表和索引的创建如下:
CREATE TABLE log (
id SERIAL PRIMARY KEY,
logEntry jsonb
);
CREATE INDEX log_idx_logentry on log using gin (logentry);
我运行了一个我知道不会返回结果的查询:
SELECT id FROM log WHERE logentry->>'modality' = 'XT'
这需要3秒才能运行。
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)
,只是为了证明表中有东西,
SELECT COUNT(id) FROM log WHERE logentry->'modality' @> '"CT"'::jsonb
返回42528
那么为什么未使用索引? klin 具有正确的答案。随着数据库的变化,性能的差异变得更加明显。