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 EXTENDED
或ANALYZE
【参考方案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 很快的主要内容,如果未能解决你的问题,请参考以下文章
select into from 和 insert into select 的用法和区别
PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
Oracle中insert into select和select into的区别