数据库中选择优化,默认的行

时间:2019-02-01 16:54:29

标签: sql postgresql

我需要在一个表,该表是不是在主键的确实快速查找一行。我有个主意。

我的表将只有几百行,一列将是一个布尔值(不是主键),我想运行一次select以查看是否有任何行将该列设置为false。

当我更新一行以将该列设置为false时,我想我也可以设置一个默认行,因此,如果有任何行为false,则将默认行设置为false,如果没有行具有false,则将默认行设置为true。< / p>

然后,当我选择时,我只检查默认行。

我认为这将是一个非常快的选择。没有人认为这是一个坏主意,或是否有更好的方式来做到这一点。

进行选择的线程必须非常快,而执行更新的线程不必那么快,我认为可以处理有问题的行和默认行的更新。

2 个答案:

答案 0 :(得分:1)

如果您经常在非PK列上执行查询,则应在此(这些)列上创建索引,这样可以获得更好的性能。

CREATE INDEX index_name
ON table_name (column1, column2, ...);

您也可以通过执行查询计划来验证这一点,具体取决于您的数据库类型。

答案 1 :(得分:1)

通常不建议在布尔列上使用索引。但是,对于这样的查询:

select (case when exists (select 1 from t where not column1) . . .

那么索引可能会有用:

create index idx_t_column1 on t(column1);

您将必须测试数据库中是否实际使用了索引。我实际上会在索引中添加第二列,只是为了使其更有用,例如,对于具有where和另一列的column1子句。

也就是说,扫描几百行并不是特别慢;因此即使不使用索引,性能也可能不错。如果要在某个地方设置“默认”值,我认为它应该在另一个表中。但是,无论您在哪里设置它,都将产生开销-实际上使insertupdatedelete s的持续时间加倍。