Postgresql

為什麼索引沒有記憶體?

  • August 4, 2021

兩次執行相同的查詢後,我希望數據被記憶體,但我看到數據仍然從磁碟讀取:

->  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 索引,它只是沒有被使用嗎?還是缺少索引?

引用自:https://dba.stackexchange.com/questions/297573