0

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

(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

在一个表中,并将临时索引添加到它。

我的问题

使用实时查询的“JOIN”性能与“JOIN”对包含先前实时查询结果的表的性能有何不同,该表将添加临时索引?

另一种说法:

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

4

1 回答 1

1

答案是“也许”。

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

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

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

最后,如果您想要最高速度,请考虑对数据进行非规范化并消除即时发生的连接 - 基本上您以存储空间和数据一致性(您的活动表)为代价将预处理(连接)移动到离线状态根据您运行更新的频率,会稍微落后)。

我希望这有帮助。

于 2012-09-01T14:55:36.797 回答