示例如下:
SELECT <columns>
FROM (..........<subquery>..........) AS xxx
INNER JOIN(s) with xxx.............
LEFT OUTER JOIN(s) with xxx........
WHERE <filter conditions>
如有错误,请指正:
- 是
<subquery>
派生表? - 如果它返回关于服务器内存的太多数据(例如数百万行),这是否是一个问题,因为我知道 WHERE 子句应用于最终结果集,并使服务器从子查询中处理太多内容,即使最终结果也是如此结果有 10 行?
- 如果没有内部联接(以减少数据)而只有左侧外部联接,情况会变得更糟/更慢吗,因为它必须与子查询中的所有行进行联接?
- 如果(2)是一个问题,那么我想到的一个解决方案是通过在其中添加其他联接来限制子查询返回的数据,这会使速度变慢(我已经尝试过)。对此还有什么其他想法吗?
- 如果我无法限制子查询的结果,因为 where 子句取决于子查询后的连接,该怎么办?
- 澄清一下,子查询返回太多数据的原因是因为我尝试使用 UNION ALL (没有过滤条件)组合多个表中的数据,然后,foreach 子查询返回的行, join 得到我需要在 WHERE 子句中使用它的信息。另一种方法是对子查询内部的每个 UNION ALL 执行您在子查询外部看到的所有联接,是的,这确实限制了结果集,但会进行更多联接,正如我所说,这会减慢速度。换句话说,我必须在执行此操作的子查询之间进行选择:
(
SELECT * FROM A UNION ALL
SELECT * FROM B UNION ALL
SELECT * FROM C...
) AS xxx
left outer join T with xxx
并且
SELECT * FROM A
LEFT OUTER JOIN T ...
WHERE....
UNION ALL
SELECT * FROM B
LEFT OUTER JOIN T ...
WHERE....
UNION ALL
SELECT * FROM C
LEFT OUTER JOIN T ...
WHERE....
最佳答案
- 是的。
- 不,查询优化器将整个查询视为一个 block 。它不会运行派生表,然后对结果运行外部语句。它“通过”派生表进行优化。
- 再说一次,不。拥有派生表并不意味着性能不佳。您始终必须从整体上看待您的查询。
- 这不是问题。
- 那就好了。信任查询优化器。你见过写这本书的人吗?他们的智力可怕。
在每种情况下,都值得查看您的查询执行计划并查找痛点。当它们可以进行搜索时,寻找正在进行扫描的东西,这通常会给你带来显着的提升。在以下情况下,事物会进行扫描而不是搜索:
- 没有可查找的索引
- 您要寻找的是函数的结果(例如
WHERE function(field) = value
) - 优化器认为扫描实际上更快。
但问题的底线答案是 - 不,如果您单独选择派生表,您不应该担心它们会包含大量数据。
关于sql-server - 如果子查询返回太多数据,我应该担心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802150/