我正在对postgressql 9.2中的表运行查询。
该表有很多字段,但与此相关的是:
查询采用以下形式:
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之间的分数),按每个视频的下载加权(所以a的平均播放次数) 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
个{h}每小时只有一次或两次INSERT
和UPDATE
次查询。
答案 0 :(得分: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'