通过多个联接,分组依据和排序依据加快查询速度

时间:2019-05-28 03:50:05

标签: sql postgresql sqlperformance postgresql-performance

我有一个SQL查询,如下:

.env.local

表D包含5000万条记录,A包含3000万条记录,B&C分别包含30k条记录。索引是在联接,分组依据,排序依据中使用的所有列上定义的。

查询工作正常,无需使用order by语句,并在2-3秒左右的时间内返回结果。

但是,通过排序操作(排序依据),查询时间将增加到10-12秒。

我了解这背后的原因,执行者必须遍历所有记录以进行排序操作,而索引在这里几乎无济于事。

还有其他加快查询速度的方法吗?

这是此查询的解释分析:

SELECT
title,
(COUNT(DISTINCT A.id)) AS "count_title"

FROM 
B 
INNER JOIN D ON B.app = D.app
INNER JOIN A ON D.number = A.number 
INNER JOIN C ON A.id = C.id 

GROUP BY C.title
ORDER BY count_title DESC
LIMIT 10
;

1 个答案:

答案 0 :(得分:1)

您可以尝试在def display_btn(self): ... for value in data.values(): if value['delta'] is not None: print(f"action={value['action']}, delta={value['delta']}, grace={value['delay']}") streak_button = StreakButton(id=(value['action']), text=value['action'], color=(0,0,0,1), size=(400, 50), size_hint=(None, None)) self.root.screen_two.ids.streak_zone.add_widget(streak_button) ... b之间建立嵌套循环联接,因为d很小:

b

如果CREATE INDEX ON d (app); 清理得足够频繁,则可以看到仅索引扫描是否更快。为此,在索引中包含d(在v11中,为此使用number子句!)。 INCLUDE的输出表明您对EXPLAIN有额外的条件;您还必须为仅索引扫描也包括该列。