INSERT INTO SELECT 很慢,但是单独运行时 INSERT 或 SELECT 很快

Posted

技术标签:

【中文标题】INSERT INTO SELECT 很慢,但是单独运行时 INSERT 或 SELECT 很快【英文标题】:INSERT INTO SELECT is very slow, but INSERT or SELECT are fast when running separetely 【发布时间】:2021-06-07 23:34:17 【问题描述】:

我有一个这样的 SQL:

INSERT INTO table1 (column1, column2) (
    SELECT column3, column4 FROM table2 WHERE column5 = 'value'
);
table1 有 3,500,000 行。 table2 有 900,000 行。 SELECT column3, column4 FROM table2 WHERE column5 = 'value' 返回 NO 寄存器(零),耗时约 0.004 秒。 INSERT INTO table1 (column1, column2) VALUES ('value', 'value') 也需要大约 0.004 秒。

但是当我在INSERT INTO SELECT 语句中结合两者时,如上所示,大约需要 7.7 秒。有解释吗?有没有解决办法?

【问题讨论】:

要插入多少行? 正在插入零行,戈登。 您需要向我们展示您的执行计划EXPLAIN EXTENDEDANALYZE 【参考方案1】:

有时,当您使用 SELECT 执行 INSERT 时性能会变慢,因为源表中的字段类型与目标表中的字段类型不同,因此当执行 INSERT-SELECT 时,会隐式转换 SELECT 中的值这样它们就可以保留在命运表中。这种隐式转换不是以最佳性能方式进行的,有时直接从值插入会更慢。

【讨论】:

由于 SELECT 不返回任何寄存器,我相信演员不会发生,joserobertog。 结果可能为空,但如果执行的查询有处理时间,那么可能是这种情况,但在有行的情况下会发生。 SELECT 大约需要 0.004 秒,joserobertog。 我参考了 INSERT INTO SELECT 的组合情况,时间约为 7.7 秒,其中可能存在隐式转换,而不是孤立选择。 column1 (bigint), column2 (longtext) := column3 (bigint), column4 (text)

以上是关于INSERT INTO SELECT 很慢,但是单独运行时 INSERT 或 SELECT 很快的主要内容,如果未能解决你的问题,请参考以下文章

insert into的用法

select into from 和 insert into select 的用法和区别

PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别