在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到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 子句来应用新名称。

二:性能区别

----创建一个基础数据库
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

--查询填充后的数据
SELECT * FROM TestDataTable
--删除表结构以及数据【慎用】
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 方式去操作了。

Insert Into select 与 Select Into 哪个更快?的更多相关文章

  1. oracle 中 insert select 和 select insert 配合使用

    Insert Into select 与 Select Into 哪个更快? 在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SEL ...

  2. Oracle中复制表的方法(create as select、insert into select、select into)

    转: Oracle中复制表的方法(create as select.insert into select.select into) 2018-07-30 22:10:37 小白白白又白cdllp 阅读 ...

  3. [T-SQL]INSERT INTO SELECT 与 SELECT INTO FROM

    1.INSERT INTO SELECT 语法:INSERT INTO Table2(field1,field2,...) select value1,value2,... from Table1 要 ...

  4. sql: sybase与oracle中insert into select和select into的用法

    1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...

  5. 关键字(8):数据库记录的增删查改insert,delete,select,update

    insert:一般只要参数个数和类型没问题,不会插入异常 INSERT INTO t_pos_dynamic_map(autoid, lt_termno, lt_merchno) VALUES(SEQ ...

  6. JPA进行insert操作时会首先select吗

    在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...

  7. insert into select 和select into from 备份表

    一 insert into select要求表必须存在 INSERTINTO order_record SELECT * FROM order_today FORCEINDEX (idx_pay_su ...

  8. SQL笔记1:SELECT及SELECT高级应用

      T-SQL笔记1:SELECT及SELECT高级应用 本章摘要 1:安装AdventureWorks 2:基本运算符和表达式 3:between 4:like 5:escape 6:TOP 7:G ...

  9. select * 比select column快很多奇怪案例分析

    遇到MYSQL傻傻的地方,下面给个案例,大家感受下: 注意以下两个sql只有select *和select g.id区别. SQL1:SELECT g.idFROM table1 gINNER JOI ...

随机推荐

  1. Sql server 2014 数据库还原奇异现象

    用A库来还原B库   对正在使用的B库执行还原,还原时修改数据库名称,还原出错,提示数据库正在使用.删除B库,仍然提示正在使用,感觉像僵尸     重启SQL SERVER,因B库已删除,在A库上点击 ...

  2. Fragment与Activity的生命周期对比

    因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.

  3. 关于JPasswordField的getText()方法过时问题解决

    这几天想做一个登陆界面,用Jframe做,连接数据库时发现JPasswordField的getText()过时了,没法使用.查了资料发现改成了: try{ String sql="SELEC ...

  4. PJSUA2开发文档--第十二章 PJSUA2 API 参考手册

    12 PJSUA2 API 参考手册 12.1 endpoint.hpp PJSUA2基本代理操作.  namespace pj PJSUA2 API在pj命名空间内. 12.1.1 class En ...

  5. MySQL分数排名同分并列与不并列查询

    Scores表 | Id | Score | | 3.50 | | 3.65 | | 4.00 | | 3.85 | | 4.00 | | 3.65 | 并列 | Score | Rank | | | ...

  6. maven常用仓库

    ==================2014-04-19添加========可访问=============================== http://nexus.openkoala.org/ ...

  7. php+qrcode类+生成二维码方法

    //生成二维码 public function qrcode() { $data = input(); if(!$data['param']){ return json(['code ' => ...

  8. docker容器日志收集方案(方案四,目前使用的方案)

    先看数据流图,然后一一给大家解释 ​ 这个方案是将日志直接从应用代码中将日志输出到redis中(注意,是应用直接连接redis进行日志输出),redis充当一个缓存中间件有一定的缓存能力,不过有限,因 ...

  9. C#基础知识之面向对象以及面向对象的三大特性

    在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...

  10. jquery-插件iCheck 使用

    这是一个兼容多种浏览器的插件 官网:http://icheck.fronteed.com/ 官方给出了很多的例子,我说一个使用的问题. 使用的时候,要放到window..load的外部. 页面html ...