当只查询索引列时,索引扫描将去堆中获取结果
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”
虽然有效,但我想知道这两个命令有什么区别
我在 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”
虽然有效,但我想知道这两个命令有什么区别