首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合SQL查询的优化

聚合SQL查询的优化
EN

Stack Overflow用户
提问于 2013-09-16 13:49:08
回答 1查看 1.2K关注 0票数 0

我正在对postgressql 9.2中的一个表运行一个查询。

该表包含许多字段,但与此相关的字段是:

  • video_id BIGINT不为空
  • day_date日期不为空
  • total_plays BIGINT默认值0
  • total_playthrough_average双精度
  • total_downloads BIGINT默认值0

查询采用以下形式:

代码语言:javascript
复制
SELECT
  SUM(total_plays) AS total_plays
  CASE SUM(total_downloads)
    WHEN 0 THEN 100
    ELSE SUM(total_playthrough_average * total_downloads) / SUM(total_downloads) END AS total_playthrough_average
FROM
  mytable
WHERE
  video_id = XXXX

# Date parameter - examplified by current month
AND day_date >= DATE('2013-09-01') AND day_date <= DATE('2013-09-30')

查询的重点是找到playthrough_average (一般人看到多少视频,在0到100之间),按每个视频的下载来加权(因此,下载100次的视频的平均播放量比下载10次的视频重)。

该表使用以下索引(除其他外):

代码语言:javascript
复制
"video_index1" btree (video_id, day_date, textfield1, textfield2, textfield3)

在查询上执行EXPLAIN ANALYZE将给我以下结果:

代码语言:javascript
复制
Aggregate  (cost=153.33..153.35 rows=1 width=24) (actual time=6.219..6.221 rows=1 loops=1)
   ->  Index Scan using video_index1 on mytable  (cost=0.00..152.73 rows=40 width=24) (actual time=0.461..5.387 rows=105 loops=1)
         Index Cond: ((video_id = 6702200) AND (day_date >= '2013-01-01'::date) AND (day_date <= '2013-12-31'::date))
Total runtime: 6.757 ms

这似乎一切都很好,但这只是当我用已经执行的查询进行测试时。当我的程序运行时,我会收到很多查询,需要花费10-30 (通常每隔几秒钟)。我使用6-10个同时进行这些查询的进程运行它(除其他外)。

我是否可以在postgresql设置中进行一些调整,以获得更好的性能?该表会不断更新,尽管每个video_id可能每小时只更新一次或两次,同时使用INSERTUPDATE查询。

EN

回答 1

Stack Overflow用户

发布于 2013-09-16 14:26:32

你的总结对我来说毫无意义。我想你要的是

代码语言:javascript
复制
select
    sum(total_plays) as total_plays,
    sum(total_downloads) as total_downloads,
    sum(total_playthrough_average * total_downloads) as total_playthrough_average
from mytable
where
    video_id = 1
    and day_date between '2013-09-01' and '2013-09-30'

SQL Fiddle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18829675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档