假设我们有一个耗时的查询,描述如下:
(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"。
最后,如果你想获得最高的速度,可以考虑取消数据的标准化并消除动态连接——基本上,你会以存储空间和数据一致性为代价将预处理(连接)离线(根据你运行更新的频率,你的实时表会有点落后)。
我希望这能有所帮助。