两次运行相同的查询后,我希望数据被缓存,但我看到数据仍然从磁盘读取:
-> Index Scan using product_pkey on product (cost=0.42..3.51 rows=1 width=4) (actual time=0.132..0.132 rows=0 loops=25713)
Index Cond: (id = product_property_default.product)
Filter: ((lexeme @@ '''laptop'' | ''laptop-ul'''::tsquery) AND ((language)::oid = '20657'::oid))
Rows Removed by Filter: 1
Buffers: shared hit=152936 read=6111
I/O Timings: read=2602.604
完整计划:https ://explain.dalibo.com/plan/oJUn
询问:
explain (analyze, buffers)
select distinct "product"."id"
from "product"
inner join product_property on product_property.product = product.id
where "product"."lexeme" @@ plainto_tsquery('ro'::regconfig, 'laptop')
and "product_property"."meaning" = 'B'
and "product_property"."first" in (1.7179869184E10)
and "product"."language" = 'ro'::regconfig;
我的索引大小是 38MB:
\di+ product_pkey
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+--------------+-------+----------+---------+-------+-------------
pse | product_pkey | index | postgres | product | 38 MB |
为什么总缓冲区数 (x8KB) 大于我只有 38MB 的索引?
它是否包括数据库获取的行?
表大小 755MB:
\dt+ product
List of relations
Schema | Name | Type | Owner | Size | Description
--------+---------+-------+----------+--------+-------------
pse | product | table | postgres | 755 MB |
配置:
- work_mem=64MB
- 有效缓存大小=512MB
- shared_buffers=256MB
我的数据库 docker 容器使用低内存。来自docker stats
:
NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
db 0.32% 75.36MiB / 512MiB 14.72% 359MB / 406MB 64.5GB / 14GB
请注意,同一台机器上还运行着其他 docker 服务。
free -h
:
total used free shared buff/cache available
Mem: 3.9G 2.9G 143M 274M 850M 488M
Swap: 4.0G 1.7G 2.3G
使用 Postgres 12.4(泊坞窗图像postgres:12.4-alpine
)
您的索引扫描不是仅索引扫描。它必须为在索引中找到的每一行命中表。并且看起来“词素”很大并且已经过 TOAST,所以它必须读取多个多个页面才能重新组合完整的值。所有这些磁盘访问都显示在一个节点中,因此索引有多少以及从索引驱动的表有多少并不明显。
你有一个关于词素的 FTS 索引,它只是没有被使用吗?还是缺少索引?