Postgresql Postgres-UNION ALL vs INSERT哪个更好?

Postgresql Postgres-UNION ALL vs INSERT哪个更好?,postgresql,Postgresql,我有两个UNIONALL查询和insert到临时表中 问题1 select * from ( select a.id as id, a.name as name from a union all select b.id as id, b.name as name from b ) 问题2 drop table if exists temporary; create temp table temporary as select id as id, name as na

我有两个UNIONALL查询和insert到临时表中

问题1

select * 
from (
    select a.id as id, a.name as name from a
    union all
    select b.id as id, b.name as name from b
)
问题2

drop table if exists temporary;

create temp table temporary as
select id as id, name as name 
from a;

insert into temporary
select id as id, name as name 
from b;

select * from temp;

请告诉我哪一个性能更好?

我希望第二个选项具有更好的性能,至少在数据库级别。两个版本都需要对
a
b
表进行完整的表扫描。但第一个版本将创建一个不必要的中间表,仅用于insert

执行两个单独插入的唯一潜在问题是延迟,即可能需要一些进程才能到达和离开数据库。如果您对此感到担忧,则可以限制为一条insert语句:

INSERT INTO temporary (id, name)
SELECT id, name FROM a
UNION ALL
SELECT id, name FROM b;

这只需要访问数据库一次。

我希望第二个选项具有更好的性能,至少在数据库级别。两个版本都需要对
a
b
表进行完整的表扫描。但第一个版本将创建一个不必要的中间表,仅用于insert

执行两个单独插入的唯一潜在问题是延迟,即可能需要一些进程才能到达和离开数据库。如果您对此感到担忧,则可以限制为一条insert语句:

INSERT INTO temporary (id, name)
SELECT id, name FROM a
UNION ALL
SELECT id, name FROM b;

这只需要访问数据库一次。

我认为使用union all是性能更好的方法,不确定,您可以自己尝试。在SQL应用程序的“运行”选项卡中,始终显示运行时间。我在oracle中拍摄快照;mysql和SQLSV有相同的工具来查看它

我认为使用union all是性能更好的方法,不确定,您可以自己尝试。在SQL应用程序的“运行”选项卡中,始终显示运行时间。我在oracle中拍摄快照;mysql和SQLSV有相同的工具来查看它

我很困惑,为什么第一个查询会创建不必要的中间表?你是说查询2吗?我也很困惑,因为你的第一个例子实际上没有插入。但看起来您将执行
插入到临时SELECT*FROM(…)
,这是浪费,因为您正在强制执行一个中间表。嗯。。。我不是OP,但我猜他只是想问“通过并集选择两个表”和“通过插入另一个表选择两个表”,哪一个更快。我想我理解你的意思,如果你说“但是‘第二个’版本会创建一个不必要的中间表”,如果最终目标是“仅仅”返回联盟的结果,第一个肯定是更好的选择。@a_horse_,没有名字,我也许不应该回答,因为仍然不清楚OP是在尝试插入还是只是选择。我很困惑,为什么第一个查询会创建不必要的中间表?你是说查询2吗?我也很困惑,因为你的第一个例子实际上没有插入。但看起来您将执行
插入到临时SELECT*FROM(…)
,这是浪费,因为您正在强制执行一个中间表。嗯。。。我不是OP,但我猜他只是想问“通过并集选择两个表”和“通过插入另一个表选择两个表”,哪一个更快。我想我理解你的意思,如果你说“但是‘第二个’版本会创建一个不必要的中间表”,如果最终目标是“仅仅”返回联盟的结果,第一个肯定是更好的选择。@a_horse_,没有名字,我也许不应该回答,因为仍然不清楚OP是尝试执行插入还是仅执行选择。您使用的是SQL Server还是Postgres?我删除了
SQL Server
标记作为
创建表作为..
对SQL Server无效您使用的是SQL Server还是Postgres?我删除了
SQL Server
标记作为
创建表作为..
不是对SQL Server有效