Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多列排序会降低postgresql的性能,有什么方法可以修复吗?_Sql_Postgresql - Fatal编程技术网

多列排序会降低postgresql的性能,有什么方法可以修复吗?

多列排序会降低postgresql的性能,有什么方法可以修复吗?,sql,postgresql,Sql,Postgresql,我在一个大表(500k行)上运行了一个非常简单的查询来显示结果 最初我使用的是这个查询,它非常快: select * from deck order by deck.sas_rating desc limit 10 其解释分析显示执行时间为0.2ms。酷 但是sas_rating列有重复的整数值,我在对结果进行分页时(对其他页面使用偏移量)意识到我得到了重复的结果。没问题,请按将主键添加为辅助顺序。但是表演很糟糕 这需要685毫秒,并解释分析: Li

我在一个大表(500k行)上运行了一个非常简单的查询来显示结果

最初我使用的是这个查询,它非常快:

 select * from deck 
    order by
        deck.sas_rating desc    
    limit 10
其解释分析显示执行时间为0.2ms。酷

但是
sas_rating
列有重复的整数值,我在对结果进行分页时(对其他页面使用偏移量)意识到我得到了重复的结果。没问题,请按将主键添加为辅助顺序。但是表演很糟糕

这需要685毫秒,并解释分析:

Limit  (cost=164593.15..164593.17 rows=10 width=1496) (actual time=685.138..685.139 rows=10 loops=1)
  ->  Sort  (cost=164593.15..165866.51 rows=509343 width=1496) (actual time=685.137..685.137 rows=10 loops=1)
        Sort Key: sas_rating DESC, id
        Sort Method: top-N heapsort  Memory: 59kB
        ->  Seq Scan on deck  (cost=0.00..153586.43 rows=509343 width=1496) (actual time=0.009..593.444 rows=509355 loops=1)
Planning time: 0.143 ms
Execution time: 685.171 ms
在我较弱的生产服务器上情况更糟。我的搜索时间从125毫秒增加到35秒


我尝试添加多列索引,但这并没有提高性能。在使用limit+offset时,是否有任何方法可以防止重复结果而不破坏查询的性能?

我相信您可能添加了错误的多列索引-例如,您使用了
sas_rating,id
而不是
sas_rating desc,id
,因为只有后者可以用于您的订单


sas_rating
上的索引仅可用于
sas_rating desc
排序,因为数据库可以向后遍历它。多列索引的情况并非如此-您必须保留排序中列的升序/降序。

如果您只想消除此列上的重复项,则在postgres中(接近末尾)似乎有一个
不同的
。@dyukha没有重复行。这是因为当我使用
限制10
进行选择,然后使用
限制10偏移量10
进行另一次选择时,我可以检索到一些相同的结果,因为
sas_rating
包含非唯一值。看看这个问题,但没有适合我的解决方案。我明白了。如果您尝试在(按id排序)
上按
行编号()排序,该怎么办?可能类似于这里:,但使用
按顺序
而不是
where
。很抱歉,我不确定它是否有效,也没有地方测试它。这里描述了另一个分页选项:您是对的。我只需要我的多列索引就可以使用适当的
desc
顺序进行
sas\u评级
。我甚至没有意识到索引有
desc
vs
asc
@托梅茨基。哇!很好的观察。我认为Postgres应该足够聪明,使用
(sas\u rating,id)
来达到这个目的。但这需要实现跳过扫描。
Limit  (cost=164593.15..164593.17 rows=10 width=1496) (actual time=685.138..685.139 rows=10 loops=1)
  ->  Sort  (cost=164593.15..165866.51 rows=509343 width=1496) (actual time=685.137..685.137 rows=10 loops=1)
        Sort Key: sas_rating DESC, id
        Sort Method: top-N heapsort  Memory: 59kB
        ->  Seq Scan on deck  (cost=0.00..153586.43 rows=509343 width=1496) (actual time=0.009..593.444 rows=509355 loops=1)
Planning time: 0.143 ms
Execution time: 685.171 ms