Database 创建索引并没有改变我的查询成本
我试图通过在评级列上创建索引来降低查询执行的成本。该表有2680个元组Database 创建索引并没有改变我的查询成本,database,postgresql,query-optimization,Database,Postgresql,Query Optimization,我试图通过在评级列上创建索引来降低查询执行的成本。该表有2680个元组 SELECT * from cup_matches WHERE rating*3 > 20 然而,当我使用pgAdmin查看索引前后的查询成本时,它保持不变。由于索引(减少I/O成本)到内存,我认为它会减少,因为索引过程会减少从硬盘获取数据的成本。有人能告诉我为什么它保持不变吗?因为索引在评级上,而不是评级*3。要使用当前索引,请尝试 SELECT * from cup_matches WHERE rating &
SELECT * from cup_matches WHERE rating*3 > 20
然而,当我使用pgAdmin查看索引前后的查询成本时,它保持不变。由于索引(减少I/O成本)到内存,我认为它会减少,因为索引过程会减少从硬盘获取数据的成本。有人能告诉我为什么它保持不变吗?因为索引在
评级
上,而不是评级*3
。要使用当前索引,请尝试
SELECT * from cup_matches WHERE rating > 20/3
成本并没有减少,因为您正在where中执行变异操作,因此它无法使用索引。删除“*3”操作就可以了
SELECT * from cup_matches WHERE rating > 20
应该提高性能,因为您不再改变评级值。当值发生变化时,您需要进行完整的表扫描以进行比较。执行计划是什么?您可以通过
EXPLAIN
或EXPLAIN ANALYZE
命令找到这一点。为什么要执行rating*3>20
而不是rating>20/3
?@jmelesky Seq扫描杯形匹配(成本=0.00..61.20行=893宽度=27)(实际时间=0.026..1.114行=1215个循环=1)过滤器:((rating*'3':双精度)>'20'::双精度)过滤器删除的行:1465计划时间:0.138毫秒执行时间:1.226ms@BShaps这会导致成本保持不变吗?不要在注释中添加代码或附加信息。您的问题,并确保在添加执行计划时保留缩进。这里应该提到20/3==6。但是为什么执行时间会减少呢?