优化数据受列限制的 postgres 查询
Optimize a postgres query where data is limited by a column
我有一个 postgres table,其中有一列已存档 (true/false)。我有一个用例,我每个月都会归档数据,所以现在我 90% 的数据是 archived=true
.
当我查询 table 时,我只想查询 archive=false
99% 的时间,这需要时间来执行,因为当我与其他人进行连接时它不使用索引table 或者当我添加多个过滤器时。即使我强制 psql 使用此索引,我仍然无法在使用过滤器时在其他列上使用索引。
我很难理解您如何优化此类设计,以便您的查询始终快速。
PostgreSQL 有一些有趣的索引方法,其中一种是部分索引。部分索引是节省一些磁盘 space 和提高记录查找性能的好方法。通用规则是“在你负担得起的时候使用它”——换句话说,如果你所有的查询都涉及一些过滤器,通常认为将这样的过滤器包含到索引定义中是一个好主意,以减少它的大小并提高它的性能。
这是我们如何创建部分索引的示例:
create index non_archive_order_date_idx
on orders (order_date)
where archive=false;
如果我们正在优化的查询在 billed 列上包含相同的过滤器,查询规划器将考虑该索引。过滤器针对的是 table 中整个行量的一小部分,我们应该会看到相应索引扫描的性能显着提高。
我有一个 postgres table,其中有一列已存档 (true/false)。我有一个用例,我每个月都会归档数据,所以现在我 90% 的数据是 archived=true
.
当我查询 table 时,我只想查询 archive=false
99% 的时间,这需要时间来执行,因为当我与其他人进行连接时它不使用索引table 或者当我添加多个过滤器时。即使我强制 psql 使用此索引,我仍然无法在使用过滤器时在其他列上使用索引。
我很难理解您如何优化此类设计,以便您的查询始终快速。
PostgreSQL 有一些有趣的索引方法,其中一种是部分索引。部分索引是节省一些磁盘 space 和提高记录查找性能的好方法。通用规则是“在你负担得起的时候使用它”——换句话说,如果你所有的查询都涉及一些过滤器,通常认为将这样的过滤器包含到索引定义中是一个好主意,以减少它的大小并提高它的性能。 这是我们如何创建部分索引的示例:
create index non_archive_order_date_idx
on orders (order_date)
where archive=false;
如果我们正在优化的查询在 billed 列上包含相同的过滤器,查询规划器将考虑该索引。过滤器针对的是 table 中整个行量的一小部分,我们应该会看到相应索引扫描的性能显着提高。