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

时间:2014-12-22 07:49:25

标签: sql performance postgresql query-optimization postgresql-performance

如何提高此查询的性能:

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上建立索引并没有多大帮助。

2 个答案:

答案 0 :(得分:2)

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

2)你把索引放在哪一列?尝试索引状态并包括成绩和ID。

3)可以陈述=' in_stock'被过滤整数值并产生相同结果的东西取而代之?可以将state字段本身转换为int类型并编入索引,然后为这些整数值创建查找表吗?

答案 1 :(得分:1)

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

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

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