sql - 未使用嵌套 JSONB 字段的索引
问题描述
我在嵌套的 JSONB 字段上创建了一个索引:
CREATE INDEX foo_idx ON some_table(cast(content->'meta'->>'version' AS int));
但选择查询仍然进行全表扫描:
select *
from some_table
where (content->'meta'->>'version')::INT <= 9000
LIMIT 1;
我还尝试将查询表达为:
select *
from some_table
where cast(content->'meta'->>'version' AS INT) <= 9000
LIMIT 1;
结果相同。
查询计划:
Limit (cost=0.00..1.06 rows=10 width=52)
-> Seq Scan on some_table (cost=0.00..38429.27 rows=361441 width=52)
Filter: ((((content -> 'meta'::text) ->> 'version'::text))::integer <= 9000)
我在这里想念什么?
编辑:这更像是一个巧合。我在查询中添加了一个ORDER BY random()
并得到了以下查询计划:
Limit (cost=31644.83..31644.83 rows=1 width=52) (actual time=0.017..0.017 rows=0 loops=1)
-> Sort (cost=31644.83..32548.43 rows=361441 width=52) (actual time=0.016..0.016 rows=0 loops=1)
Sort Key: (random())
Sort Method: quicksort Memory: 25kB
-> Bitmap Heap Scan on game_object_user (cost=6769.60..29837.62 rows=361441 width=52) (actual time=0.011..0.011 rows=0 loops=1)
Recheck Cond: ((((content -> 'meta'::text) ->> 'version'::text))::integer < 9000)
-> Bitmap Index Scan on foo_idx (cost=0.00..6679.23 rows=361441 width=0) (actual time=0.009..0.009 rows=0 loops=1)
Index Cond: ((((content -> 'meta'::text) ->> 'version'::text))::integer < 90000)
Planning time: 0.074 ms
Execution time: 0.040 ms
使用了索引。
解决方案
推荐阅读
- node.js - 通过节点 js 脚本运行 GraphQL 变异(Apollo)服务器端
- laravel - 将 JSON 转换为新模型(包括它自己的转换)
- tensorflow2.0 - 小编辑后如何创建新的张量板?
- javascript - 日期之间每 X 天验证一次的功能
- javascript - 无法使用 javascript 设置文件输入的值
- android - 运行 Robolectric 单元测试时出现“进程完成,退出代码 1 类未找到”错误
- javascript - 如何从对象数组中获取键和子键?
- google-cloud-platform - 从具有不同时区偏移量的字符串中提取日期
- elasticsearch - 麋鹿。未找到嵌套值
- android - Android Studio 谷歌登录弹出