查询性能改进——排序过滤器
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 行的所有列?
【讨论】:
以上是关于查询性能改进——排序过滤器的主要内容,如果未能解决你的问题,请参考以下文章