查询性能改进——排序过滤器

Posted

技术标签:

【中文标题】查询性能改进——排序过滤器【英文标题】:Query performance improvements -- Sort Filters 【发布时间】:2014-12-22 07:49:24 【问题描述】:

如何提高这个查询的性能:

SELECT designs.* FROM designs
WHERE designs.state = 'in_stock'
ORDER BY designs.grade, id DESC

解释输出:

 Sort  (cost=47475.35..47591.91 rows=46621 width=763)
   Sort Key: grade, id
   ->  Seq Scan on designs  (cost=0.00..12304.20 rows=46621 width=763)
         Filter: ((state)::text = 'in_stock'::text)

该表有超过 250000 条记录。

state 上建立索引并没有多大帮助。

【问题讨论】:

你试过索引列吗? postgresql.org/docs/8.4/static/indexes-ordering.html @NandakumarV 你建议哪些栏目 试试这个CREATE INDEX design_order_idx ON designs (grade, id); 对于性能问题,请始终添加您的表定义和您的 Postgres 版本。读取[postgresql-performance]的标签信息。 【参考方案1】:

1) 命名列而不是 *,例如 Select col1, col2....您是否需要所有列都在结果集中?如果不只显示您需要的这些列。

2) 您在哪些列上放置了索引?尝试按州编制索引并包括成绩和 ID。

3) state = 'in_stock ' 可以被替换为过滤整数值并产生相同结果的东西吗?能否将 state 字段本身转换为 int 类型并进行索引,然后为这些整数值创建查找表?

【讨论】:

【参考方案2】:

要针对给定查询进行优化(这可能不是总体上最好的策略),请使用具有匹配排序顺序的部分索引:

CREATE INDEX foo_idx ON designs (grade, id DESC) WHERE state = 'in_stock';

其实我会从你的表格布局开始,先看state的数据类型。 然后我会问您实际上需要从查询中返回哪些列和行。我怀疑您是否需要显示结果中所有 46621 行的所有列?

【讨论】:

以上是关于查询性能改进——排序过滤器的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 性能:在大表中排序很慢,即使过滤的子集很小

使用过滤器对一个结果进行ORDER BY语句的性能调整

django - 改进迭代查询

如何使用 Graphql SPQR 实现查询过滤器和排序?

性能改进:左外连接、排序依据、子查询:主查询未拾取索引

Elasticsearch (DSL 布尔查询 过滤器 排序 高亮显示