优化JOIN:与索引表的比较



假设我们有一个耗时的查询,描述如下:

(SELECT ...
FROM ...) AS FOO
LEFT JOIN (
    SELECT ...
    FROM ...) AS BAR
ON FOO.BarID = BAR.ID

让我们假设

(SELECT ...
FROM ...) AS FOO

返回多个行(假设为10M)。每一行都必须与BAR中的数据连接。

现在假设我们插入的结果

    SELECT ...
    FROM ...) AS BAR

在一个表中,并向其中添加临时索引。

我的问题

带有live查询的"JOIN"的性能与带有上一个livequery结果的表的"JOIM"的性能有何不同?

另一种说法是:

如果JOIN很慢,那么实际存储和索引我们所加入的表会有什么好处吗?

答案是"也许"。

这取决于有关数据的统计数据。唯一可以确定的方法是将第一个查询实际加载到临时表中,在其上粘贴相关索引,然后运行查询的第二部分。

我可以告诉你,如果速度是你想要的,如果你可以将第一个查询的结果永久加载到表中,那么你的查询当然会更快。

如果你想更快,根据你使用的DBMS,你可以考虑创建一个跨两个表的索引——如果你使用的是SQL Server,它们被称为"索引视图",或者你也可以为其他系统查找"Reified indexes"。

最后,如果你想获得最高的速度,可以考虑取消数据的标准化并消除动态连接——基本上,你会以存储空间和数据一致性为代价将预处理(连接)离线(根据你运行更新的频率,你的实时表会有点落后)。

我希望这能有所帮助。

最新更新