【发布时间】:2014-08-14 17:58:08
【问题描述】:
我尝试在包含数千万行的表中的外键列上添加索引,而我正在运行的半复杂查询的执行时间从 4 秒缩短到 10 毫秒。好的!
然后我尝试再次删除它以进行更多测试,但是当我执行相同的查询时,它仍然需要 10 毫秒(与添加索引之前需要 4 秒相比)。
删除索引是否会重置性能增益?如果没有,如何彻底删除索引?
查询如下所示(此查询每分钟运行一次,并将结果存储在另一个表中):
SELECT COUNT(*) AS count
FROM (
SELECT MAX(ze.timestamp) AS time, r.device_id
FROM loc_zone_events ze
INNER JOIN loc_zones z ON ze.zone_id = z.id
INNER JOIN raw_events r ON ze.raw_event_id = r.id
WHERE z.app_id = 1
AND ROUND(EXTRACT('epoch' FROM NOW() - ze.timestamp) / 60) BETWEEN 0 AND 10
GROUP BY r.device_id
ORDER BY time DESC
) AS t
【问题讨论】:
-
您的查询中是否有 distinct/group by?限制 xxx ?你有有效的统计数据吗?你有默认的配置设置吗?
-
我在编辑中添加了查询。我正在使用基本的 Windows 安装配置进行测试(生产环境位于 Amazon RDS r1.2xlarge 上)。至于有效的统计数据,我不确定你的意思
-
这是您实际的查询吗?计算 max() 和 ORDER BY ... 效率非常低,您不需要...
-
这不是 my 查询,但是是的,那是实际查询。你会做些什么来增强它?
-
COUNT DISTINCT(r.device_id)对我来说似乎已经足够了。日期范围选择看起来也很尴尬。 (源于mysql?)
标签: sql postgresql indexing