假设我们有一个耗时的查询,如下所述:
(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很慢,实际存储和索引我们加入的表会有任何好处吗?
答案 0 :(得分:1)
答案是“可能”。
这取决于相关数据的统计数据。您可以确定的唯一方法是将第一个查询实际加载到临时表中,在其上粘贴相关索引,然后运行查询的第二部分。
我可以告诉你速度是否符合你的要求,如果你可以将第一个查询的结果永久地加载到表中,那么你的查询当然会更快。
如果您希望它更快,根据您使用的DBMS,您可以考虑创建一个跨越两个表的索引 - 如果您使用的是SQL Server,它们被称为“索引视图”,或者您也可以查看其他系统的'Reified indices'。
最后,如果你想要最终的速度,可以考虑对数据进行非规范化并消除即时发生的连接 - 基本上你会以存储空间和数据一致性为代价使预处理(连接)离线(根据您运行更新的频率,您的实时表格会略微落后。)
我希望这会有所帮助。