数据库选择优化,默认行
Posted
技术标签:
【中文标题】数据库选择优化,默认行【英文标题】:Database select optimization, default row 【发布时间】:2019-02-01 16:54:28 【问题描述】:我需要快速查找不在主键中的表中的一行。我有个主意。
我的表只有几百行,一列是布尔值(不是主键),我想运行一个选择来查看是否有任何行将该列设置为 false。
当我更新一行以将该列设置为 false 时,我想我也可以设置一个默认行,因此如果任何行为 false,则将默认行设置为 false,如果没有行为 false,则将默认行设置为 true。
然后,当我进行选择时,我只检查默认行。
我认为这将是一个非常快速的选择。有没有人认为这是一个坏主意或有更好的方法来做到这一点。
执行选择的线程需要非常快,执行更新的线程不需要那么快,我认为可以处理更新有问题的行和默认行。
【问题讨论】:
您使用的是 Postgresql 还是 SQL Server (T-SQL)?除此之外,听起来你只需要一个索引。 @mrmannione 。 . .我删除了不兼容的数据库标签。请标记您真正使用的数据库。 【参考方案1】:通常不建议在布尔列上使用索引。但是,对于这样的查询:
select (case when exists (select 1 from t where not column1) . . .
那么索引可能有用:
create index idx_t_column1 on t(column1);
您必须测试该索引是否实际用于您的数据库。实际上,我会在索引中添加第二列,以使其更有用,例如用于具有 column1
和另一列的 where
子句。
也就是说,扫描几百行并不是特别慢;所以即使不使用索引,性能也可能没问题。如果您要在某处设置“默认”值,我认为它应该在另一个表中。但是,无论您在哪里设置,都会产生开销——基本上是 insert
s、update
s 和 delete
s 的持续时间加倍。
【讨论】:
【参考方案2】:如果您经常在非 PK 列上进行查询,则应在此(这些)列上创建索引,您将获得更好的性能。
CREATE INDEX index_name
ON table_name (column1, column2, ...);
您也可以通过执行查询计划来验证这一点,执行此操作的方式取决于您的数据库类型。
【讨论】:
以上是关于数据库选择优化,默认行的主要内容,如果未能解决你的问题,请参考以下文章
[从零开始学DeepFaceLab-16]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - SAEHD模型训练参数详解与优化