Postgresql
為什麼索引沒有記憶體?
兩次執行相同的查詢後,我希望數據被記憶體,但我看到數據仍然從磁碟讀取:
-> 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 索引,它只是沒有被使用嗎?還是缺少索引?