当只查询索引列时,索引扫描将去堆中获取结果

An index scan is going to the heap for fetching results when only the indexed column is queried

我在 Postgres 中创建了以下测试 table,其中有 500 万行

create table temp_test(
id serial, 
latitude float, longitude float,name varchar(32),
questionaire jsonb, city varchar(32), country varchar(32)
);

我使用以下查询

在此table中生成了随机数据
CREATE OR REPLACE FUNCTION
random_in_range(INTEGER, INTEGER) RETURNS INTEGER
AS $$
    SELECT floor(( + ( -  + 1) * random()))::INTEGER;
$$ LANGUAGE SQL;


insert into temp_test(latitude,longitude,name,questionaire,city,country)
Select random_in_range(-180,180),random_in_range(-180,180),md5(random()::text),'["autism","efg"]',md5(random()::text)
,md5(random()::text)
from generate_series(1,5000000);

列 'id' 有一个 btree 索引

CREATE INDEX id_index ON temp_test (id);

当我尝试仅使用具有索引的 'id' 进行查询并“解释分析”查询时

explain analyse select id from temp_test where id = 10000;

我得到以下结果:

此查询的执行时间约为 0.049 秒,如果我重新运行相同的查询(考虑到数据库正在缓存),我将在大致相似的持续时间内得到结果。

从结果中,我看到即使我在索引列上查询并且不获取任何其他列(我知道这不切实际)为什么当信息存在于索引中时使用堆内存。

如果我从索引中提取信息,我希望查询不会触及堆。

这里有我遗漏的东西吗?任何帮助,将不胜感激。提前致谢!

查询可能正在访问堆以检查可见性 ma。 运行 vacuum full verbose 看看 postgres 怎么说.. 这将使行对所有事务可见。有时 postgres 无法 运行 出于某种原因完全清理真空,因此提供冗长的帮助。

我找到了解决办法,我 运行 在我的 table

上吸尘
vacuum temp_test;

而不是 运行“Vacuum Full Verbose”

虽然有效,但我想知道这两个命令有什么区别