zoukankan      html  css  js  c++  java
  • 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 子句来应用新名称。

    二:性能区别

    ----创建一个基础数据库
    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 方式去操作了。

  • 相关阅读:
    Django--templates(模板层)
    基于 Hive 的文件格式:RCFile 简介及其应用
    Gobblin采集kafka数据
    Scala 中下划线的用途
    Gobblin编译支持CDH5.4.0
    Kafka到Hdfs的数据Pipeline整理
    Hadoop NameNode的ZKFC机制
    Windows下Eclipse提交MR程序到HadoopCluster
    Kettle实现MapReduce之WordCount
    hadoop中MapReduce多种join实现实例分析
  • 原文地址:https://www.cnblogs.com/Rawls/p/10732135.html
Copyright © 2011-2022 走看看