为什么PostgreSQL不在一个小表上使用我的索引?
我在PostgreSQL中有下表:为什么PostgreSQL不在一个小表上使用我的索引?,sql,postgresql,postgresql-performance,Sql,Postgresql,Postgresql Performance,我在PostgreSQL中有下表: CREATE TABLE index_test ( id int PRIMARY KEY NOT NULL, text varchar(2048) NOT NULL, last_modified timestamp NOT NULL, value int, item_type varchar(2046) ); CREATE INDEX idx_index_type ON index_test ( item_type );
CREATE TABLE index_test
(
id int PRIMARY KEY NOT NULL,
text varchar(2048) NOT NULL,
last_modified timestamp NOT NULL,
value int,
item_type varchar(2046)
);
CREATE INDEX idx_index_type ON index_test ( item_type );
CREATE INDEX idx_index_value ON index_test ( value )
我作出以下选择:
explain select * from index_test r where r.item_type='B';
explain select r.value from index_test r where r.value=56;
执行计划的解释如下:
Seq Scan on index_test r (cost=0.00..1.04 rows=1 width=1576)
Filter: ((item_type)::text = 'B'::text)'
INSERT INTO index_test(data,last_modified,value,item_type)
SELECT
md5(random()::text),now(),floor(random()*100),md5(random()::text)
FROM generate_series(1,1000);
SELECT max(value) from index_test;
索引测试r上的顺序扫描(成本=0.00..1.04行=1宽度=1576)
筛选器:((项目类型)::text='B'::text)'
据我所知,这是一次全表扫描。问题是:为什么不使用我的索引
可能是,原因是我的表中的行太少了?我只有20个。您能给我提供一个SQL语句,用随机数据轻松填充我的表,以检查索引问题吗
我找到了这篇文章:,但它不适合我。语句的效率并不重要,只是简单而已。您找到的示例是针对DB2的,在pg中,您可以使用
generate\u series
来实现它。
例如:
Seq Scan on index_test r (cost=0.00..1.04 rows=1 width=1576)
Filter: ((item_type)::text = 'B'::text)'
INSERT INTO index_test(data,last_modified,value,item_type)
SELECT
md5(random()::text),now(),floor(random()*100),md5(random()::text)
FROM generate_series(1,1000);
SELECT max(value) from index_test;
上面fiddle中的第二个查询应该使用仅索引扫描。您找到的示例是针对DB2的,在pg中,您可以使用
generate_series
来执行此操作。
例如:
Seq Scan on index_test r (cost=0.00..1.04 rows=1 width=1576)
Filter: ((item_type)::text = 'B'::text)'
INSERT INTO index_test(data,last_modified,value,item_type)
SELECT
md5(random()::text),now(),floor(random()*100),md5(random()::text)
FROM generate_series(1,1000);
SELECT max(value) from index_test;
上面fiddle中的第二个查询应该使用仅索引扫描
也许,原因是我的表中的行太少了
对。对于一个表中总共20行,seq扫描总是比index扫描快。这些行很可能位于单个数据库块中,因此seq扫描只需要一个I/O操作
如果你使用
explain (analyze true, verbose true, buffers true) select ....
你可以看到更多关于真实情况的细节
顺便说一句:您不应该使用text
作为列名,因为这也是Postgres中的数据类型(因此是保留字)
也许,原因是我的表中的行太少了
对。对于一个表中总共20行,seq扫描总是比index扫描快。这些行很可能位于单个数据库块中,因此seq扫描只需要一个I/O操作
如果你使用
explain (analyze true, verbose true, buffers true) select ....
你可以看到更多关于真实情况的细节
顺便说一句:你不应该使用
text
作为列名,因为这也是Postgres中的一种数据类型(因此也是一个保留字)。如果效率不重要,只是简单,你为什么要关心它是否使用索引?索引是不影响语义的性能优化-除了实现细节,例如Pg的唯一索引作为唯一约束的实现。Craig,“效率不重要”仅涉及插入虚拟行的方式,抱歉,这是一个误导性的短语。如果效率不重要,则只涉及简单性,你为什么关心它是否使用索引?索引是不影响语义的性能优化-除了实现细节,例如Pg的唯一索引作为唯一约束的实现。Craig,“效率不重要”仅涉及插入虚拟行的方式,抱歉,这是一个误导性的短语。如果效率不重要,则只涉及简单性,你为什么关心它是否使用索引?索引是不影响语义的性能优化-除了实现细节,例如Pg的UNIQUE Index作为唯一约束的实现。Craig,“效率无关紧要”只涉及插入虚拟行的方式,抱歉,这句话有误导性。@KutaBeach请注意,您可以通过使用手册中记录的enable\uu
参数强制索引扫描,以测试是否可以对特定查询使用索引。这些参数仅用于测试目的,通常不应在生产中使用。@KutaBeach请注意,您可以强制索引扫描,以测试是否可以使用手册中所述的enable\ucode>参数为特定查询使用索引。这些参数仅用于测试目的,通常不应在生产中使用。@KutaBeach请注意,您可以强制索引扫描,以测试是否可以使用手册中所述的enable\ucode>参数为特定查询使用索引。这些参数仅用于测试目的,一般不应在生产中使用。