SELECT * FROM(... union ...)AS tablexyz是否创建临时表?

时间:2019-12-17 01:15:40

标签: sql union temp-tables

这样的查询是否创建临时表?还是一次在查询中使用?

SELECT A
FROM
(
    SELECT A, B FROM TableA
    UNION
    SELECT A, B FROM TableB
) AS tbl
WHERE B > 'some value'

我正在使用psql和雪花

2 个答案:

答案 0 :(得分:1)

否,它不会创建临时表

但是,它确实实现了行。我很确定它在所有数据库中都能做到。使用union需要删除重复项。复制删除通常使用排序或哈希算法完成。

在这两种情况下,数据都将被写入中间存储。

但是,通常不会写入用于临时表的额外元数据。这只是“查询内”的临时空间。

答案 1 :(得分:0)

在Postgres中,不会创建临时表。 “临时表”是指磁盘上的一个文件,在Sub Insert_New_Col() Dim R As Range, BeforeR As Long 'Find 'Totals' in row 5 of active sheet Set R = Rows(3).Find(what:="Total for the Year", lookat:=xlWhole) 'identify the column to copy (last month) BeforeR = R.Column - 1 If R Is Nothing Then MsgBox ("The word 'Totals' was not found in Row 5 - macro terminated!") Exit Sub ElseIf Not R Is Nothing Then 'copy last month's column Columns(BeforeR).Copy 'insert copied cells before the Totals column Columns(R.Column).Insert Shift:=xlRight Application.CutCopyMode = False End If End Sub 中有一个relfilenode条目,该文件在pg_class会话期间一直存在。为了执行查询,在内存中创建了一个“表”,但是从可以从中查询的意义上说,它不是“表”(更多是数据结构)。

您要问的基本上是Postgres如何处理子查询-评估并实现子查询,然后将其存储到内存/缓存中以备将来参考。如果您在重复查询2-3次时查看psql,则会看到生成了一个子查询节点,随后对该查询的调用将导致EXPLAIN (ANALYZE, BUFFERS),表明先前的呼叫已被缓存,以便以后更快地访问。