0

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

该表有很多字段,但与此相关的是:

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

查询采用以下形式:

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 次的视频重)。

该表使用以下索引(其中包括):

"video_index1" btree (video_id, day_date, textfield1, textfield2, textfield3)

在查询上做一个EXPLAIN ANALYZE给我这个:

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查询。

4

1 回答 1

1

你的总结对我来说没有意义。我想你想要的是

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小提琴

于 2013-09-16T14:26:32.970 回答