是否“SELECT * FROM(SELECT ...”创建一个临时表?

时间:2012-09-19 08:24:32

标签: sql-server

做一个

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

创建相同类型的临时表,因为在存储过程中使用#does声明表?或者它是创造一个视图还是其他一些魔术? 快速搜索临时表仅显示它们在存储过程中使用。

3 个答案:

答案 0 :(得分:1)

它确实是,但仅在内部。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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