"SELECT * FROM (SELECT ..."是否创建临时表?



做一个

SELECT * FROM (SELECT foo.id, bar.name FROM foo LEFT JOIN bar ON bar.foo_id = foo.id)
              --------------- Will this be a temp table? --------------------------/

创建与在存储过程中使用 # 声明表相同类型的临时表?或者它创造了一个视图或其他魔法?对临时表的快速搜索仅显示它们在存储过程中使用。

它是的,但仅在内部

执行整个查询后,您将无法访问它。

临时表将在内存中创建,然后如前所述,丢失。对于复杂的子查询,这显然会给内存带来一些压力,但与大多数事情一样,内存比磁盘快。

您可以将嵌套查询作为单个查询执行,使用临时表(在磁盘上)执行另一个查询,最终删除该表。

在您的示例中,外部查询不执行任何操作。 因此,查询优化器将对其进行优化。

您可以在查询执行计划中查看结果集的流程。 例如,loop join会产生一个包含结果行的临时结构。 临时结构可以像临时表一样存储在 tempdb 中。 但它对你不可见,并且在查询完成后将被解除分配。

相关内容

最新更新