Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
如何在Postgres中优化此SQL查询?_Sql_Performance_Postgresql_Optimization - Fatal编程技术网

如何在Postgres中优化此SQL查询?

如何在Postgres中优化此SQL查询?,sql,performance,postgresql,optimization,Sql,Performance,Postgresql,Optimization,我有一个相当大的表,有将近一百万行,有些查询需要很长时间(超过一分钟) 这是一个让我特别难过的时刻 EXPLAIN ANALYZE SELECT "apps".* FROM "apps" WHERE "apps"."kind" = 'software' ORDER BY itunes_release_date DESC, rating_count DESC LIMIT 12; Q

我有一个相当大的表,有将近一百万行,有些查询需要很长时间(超过一分钟)

这是一个让我特别难过的时刻

EXPLAIN ANALYZE SELECT "apps".* FROM "apps" WHERE "apps"."kind" = 'software' ORDER BY itunes_release_date DESC, rating_count DESC LIMIT 12;
                                                           QUERY PLAN                                                            
---------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=153823.03..153823.03 rows=12 width=2091) (actual time=162681.166..162681.194 rows=12 loops=1)
   ->  Sort  (cost=153823.03..154234.66 rows=823260 width=2091) (actual time=162681.159..162681.169 rows=12 loops=1)
         Sort Key: itunes_release_date, rating_count
         Sort Method: top-N heapsort  Memory: 48kB
         ->  Seq Scan on apps  (cost=0.00..150048.41 rows=823260 width=2091) (actual time=0.718..161561.149 rows=808554 loops=1)
               Filter: (kind = 'software'::text)
 Total runtime: 162682.143 ms
(7 rows)
那么,我该如何优化它呢?PG版本为9.2.4,FWIW


kind
kind,itunes发布日期
上已经有索引了看起来你缺少了一个索引,例如
(kind,itunes发布日期描述,评级计数描述)
应用程序表有多大?你至少有这么多的内存分配给博士后吗?如果每次都要从磁盘读取,查询速度会慢得多


另一个可能有用的方法是将表聚集在“apps”列中。这可能会加快磁盘访问速度,因为所有
软件
行都将按顺序存储在磁盘上。

加快此查询速度的唯一方法是在
上创建一个复合索引(itunes发布日期、评级计数)
。它将允许Postgres直接从索引中选择前N行。

这并不能回答您的问题,但如果您有100万条记录,您最好创建一个
app\u kind
表,其中包含
apps
中的数字引用,而不是重复
varchars
,例如
“软件”
allover@LukasEder:或者他可以使用枚举来保持现有查询不变。在
kind
上建立索引就足够了吗?不确定增加多少列将加快排序速度。对种类进行索引可能很有用,但仍将产生top-n排序。要使用索引直接获取前12名,OP还需要在索引中添加(所有)排序列。@AngerClown:该计划似乎表明150k行具有
kind='software'
,所以索引也不会过滤selectively@LukasEder作为复合索引的一部分,它仍然有帮助。@LukasEder该索引将有助于检索有限的行,而无需对整个表(或整个150k行)进行排序。群集没有帮助,因为查询需要完全扫描和排序。Postgres的内存分配可能会有所帮助,但不会太多。