Postgresql 如何在布尔列上创建索引

Postgresql 如何在布尔列上创建索引,postgresql,Postgresql,My DB表有一个主键和多个整数列,还有一个名为暂停的布尔列,它不在主键中。这个表只能容纳几百行,但我需要定期查询布尔列。我需要知道布尔暂停列中的任何一行是否为真,如果一行为真,我将返回真如果全部为假,我将返回假 我应该在布尔列上创建一个索引,该语法是什么样的,或者有没有其他方法来优化该查询 CREATE TABLE IF NOT EXISTS pause_metrics ( consumer TEXT NOT NULL, timstamp TIMESTAMP NOT NULL,

My DB表有一个主键和多个整数列,还有一个名为暂停的布尔列,它不在主键中。这个表只能容纳几百行,但我需要定期查询布尔列。我需要知道布尔暂停列中的任何一行是否为真,如果一行为真,我将返回真如果全部为假,我将返回假

我应该在布尔列上创建一个索引,该语法是什么样的,或者有没有其他方法来优化该查询

CREATE TABLE IF NOT EXISTS pause_metrics (
    consumer TEXT NOT NULL,
    timstamp TIMESTAMP NOT NULL,
    idle_counter INTEGER NOT NULL,
    paused BOOLEAN DEFAULT FALSE NOT NULL,
    PRIMARY KEY(consumer)
);

要支持以下查询:

SELECT paused 
from pause_metrics
where paused  
limit 1;
过滤索引将是最有效的:

create index idx_paused on pause_metrics(paused)
where paused;
索引中的实际列实际上并不重要,重要的部分是
where paused
,它只对已
paused=true
的行进行索引

要确定所有行是否都有
paused=false
,可以使用exists查询:

select not exists (SELECT 1 from pause_metrics where paused limit 1) as all_active

这将使用过滤后的查询,应该非常快。

要支持以下查询:

SELECT paused 
from pause_metrics
where paused  
limit 1;
过滤索引将是最有效的:

create index idx_paused on pause_metrics(paused)
where paused;
索引中的实际列实际上并不重要,重要的部分是
where paused
,它只对已
paused=true
的行进行索引

要确定所有行是否都有
paused=false
,可以使用exists查询:

select not exists (SELECT 1 from pause_metrics where paused limit 1) as all_active

这将使用过滤后的查询,速度应该相当快。

请回答您的问题,并为有问题的表(包括现有索引)和您试图优化的查询添加
create table
语句。请注意,“只有几百行”和索引可能永远不会用于开头-特别是如果真/假值具有均匀分布。如果有许多行具有其中一个值(例如,大多数行具有
paused=false
),则筛选的索引可能有意义,例如
create index on the_table(某些_列),其中未暂停
我添加了create table语句。我对调用这样的查询的最快方式很感兴趣。从purge_consumer_metrics中选择paused,其中paused=true limit 1;请回答您的问题,并为有问题的表(包括现有索引)和您试图优化的查询添加
create table
语句。请注意,“只有几百行”和索引可能永远不会用于开头-特别是如果真/假值具有均匀分布。如果有许多行具有其中一个值(例如,大多数行具有
paused=false
),则筛选的索引可能有意义,例如
create index on the_table(某些_列),其中未暂停
我添加了create table语句。我对调用这样的查询的最快方式很感兴趣。从purge_consumer_metrics中选择paused,其中paused=true limit 1;我只需要暂停列上的am索引。大多数情况下,所有行都将为false。有没有办法快速选择所有行都为false?索引在这里还有用吗?@mannione先生。如果对
pause=true
的查询没有返回任何行,那么您知道所有行都是错误的,所以如果我错了,请纠正我。1) 我不需要这个索引?2) 我最好的查询是:从purge\u consumer\u metrics中选择paused,其中paused=true limit 1;索引用于我显示的查询。如果需要,这取决于性能要求和硬件。只需在有索引和无索引的情况下测试查询,例如使用
explain(analyze,buffers)
进行测试我只需要在暂停的列上使用am索引。大多数情况下,所有行都将为false。有没有办法快速选择所有行都为false?索引在这里还有用吗?@mannione先生。如果对
pause=true
的查询没有返回任何行,那么您知道所有行都是错误的,所以如果我错了,请纠正我。1) 我不需要这个索引?2) 我最好的查询是:从purge\u consumer\u metrics中选择paused,其中paused=true limit 1;索引用于我显示的查询。如果需要,这取决于性能要求和硬件。只需使用索引和不使用索引测试查询,例如使用
explain(analyze,buffers)
进行测试