Insert Into select 与 Select Into 哪个更快?

在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO ;

那么二者语法上有什么区别?性能上又如何呢?

围绕着这两个问题,今天就来总结对比下:

一:语法区别

1: INSERT INTO SELECT  的语法

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

如果两个表的结构一致,字段类型一致:

INSERT INTO table2
SELECT * FROM table1;

如果两个表结构不一致,只有某几列一致:

INSERT INTO table2 (column_name)
SELECT column_name FROM table1;

2:SELECT INTO 的语法

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。

如果想要复制所有的列:

SELECT *
INTO newtable
FROM table1;

如果想要复制部分的列:

SELECT column_name
INTO newtable
FROM table1;

提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。如果想要修改字段的名称,可以使用 AS 子句来应用新名称。

 

二:性能区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
----创建一个基础数据库
CREATE TABLE TestDataTable(
    id int not null,
    userName varchar(20),
    remark varchar(100)
)
----填充100W测试数据
DECLARE @id INT,@userName NVARCHAR(50),@remark NVARCHAR(50);
DECLARE @i INT;
 
SET @id=0;
SET @userName ='';
SET @remark='';
SET @i=0;
 
WHILE @i<1000000
BEGIN
    SET @id=@i;
    IF(@i%2=0)
        begin
            set @userName='二狗子';
            set @remark='SELECT INTO 最快!'
        end
    else
        begin
            set @userName='李四';
            set @remark='快你妹,INSERT INTO 最快'
        end
    INSERT INTO TestDataTable(id,username,remark)
    VALUES (@id,@username,@remark )
    SET @i=@i+1
END
<br>--查询填充后的数据
SELECT * FROM TestDataTable<br>--删除表结构以及数据【慎用】
DROP Table TestDataTable

  耗时1分钟58秒,数据填充好了,真是不给力,竟然用了快2分钟;

好了,在去创建一个目标数据库;

--创建一个目标数据库,把100W数据复制到这个里面取
CREATE TABLE TargetDB(
    id int not null,
    userName varchar(20),
    remark varchar(100)
)

测试1:INSERT INTO SELECT

SET STATISTICS TIME ON
INSERT INTO TargetDB
SELECT *
FROM TestDataTable
GO
SET STATISTICS TIME OFF

 

 

测试2:SELECT INTO

SET STATISTICS TIME ON
SELECT *
INTO TargetDB
FROM TestDataTable
GO
SET STATISTICS TIME OFF

 

三:结论

经过上面的对比,可以看出SELECT INTO 的性能要比INSERT INTO 快出不少;

虽然SELECT INTO 数据的导入速度有很大优势,但是也有不好的地方,就是此语句只能在目标表没有创建的情况下使用,如果目标表结构已经存在,就会提示数据库中已存在名为 'TargetDB' 的对象(如下图),此时就只能用INSERT INTO SELECT 方式去操作了。

 

posted @   好奇未必害死猫  阅读(14373)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示