Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PostgreSQL不在一个小表上使用我的索引?_Sql_Postgresql_Postgresql Performance - Fatal编程技术网

为什么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 );

我在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 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>参数为特定查询使用索引。这些参数仅用于测试目的,一般不应在生产中使用。