优化JOIN:与索引表进行比较

时间:2012-08-24 07:52:25

标签: join left-join inner-join sqlperformance

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

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

我们假设

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

返回许多行(比方说10 M)。每一行都必须与BAR中的数据连接。

现在让我们说插入

的结果
    SELECT ...
    FROM ...) AS BAR

在表格中,并将ad hoc索引添加到其中。

我的问题

使用 live 查询的“JOIN”的性能与“JOIN”与包含前一个 live 查询结果的表的性能有何不同? ,是否会添加临时索引?

另一种说法:

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

1 个答案:

答案 0 :(得分:1)

答案是“可能”。

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

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

如果您希望它更快,根据您使用的DBMS,您可以考虑创建一个跨越两个表的索引 - 如果您使用的是SQL Server,它们被称为“索引视图”,或者您也可以查看其他系统的'Reified indices'。

最后,如果你想要最终的速度,可以考虑对数据进行非规范化并消除即时发生的连接 - 基本上你会以存储空间和数据一致性为代价使预处理(连接)离线(根据您运行更新的频率,您的实时表格会略微落后。)

我希望这会有所帮助。