oracle insert select and select insert in conjunction with

Insert Into select the Select Into Which is faster?

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

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

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

A: syntax differences

1: INSERT INTO SELECT syntax

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
如果两个表的结构一致,字段类型一致:

INSERT INTO table2
SELECT * FROM table1;
如果两个表结构不一致,只有某几列一致:

INSERT INTO table2 (column_name)
SELECT column_name FROM table1;

2: SELECT INTO Syntax

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
如果想要复制所有的列:

SELECT *
INTO newtable
FROM table1;
如果想要复制部分的列:

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

II: Performance differences

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






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

Three: Conclusion

After the above comparison, we can see SELECT INTO performance a lot faster than the INSERT INTO;

Although the rate of introduction of SELECT INTO data has much to offer, but there are bad places, this statement is only used when the target table is not created if the target table structure already exists, it will prompt the name already exists in the database 'TargetDB' object (see below), can only be used at this time INSERT INTO SELECT way to operate.

note

注意: 
1:SELECT INTO FROM
如果在sql/plus或者PL/SQL执行这条语句,会报"ORA-00905:缺失关键字"错误,原因是PL/Sql与T-SQL的区别。
T-SQL中该句正常,但PL/SQL中解释是:
select..into is part of PL/SQL language which means you have to use it inside a PL/SQL block. You can not use it in a SQL statement outside of PL/SQL.
即不能单独作为一条sql语句执行,一般在PL/SQL程序块(block)中使用。

如果想在PL/SQL中实现该功能,可使用Create table newTable as select * from ...:
如: create table NewTable as select * from ATable;
NewTable 除了没有键,其他的和ATable一样
2:一般oracle中如果是原表向复制数据修改年度使用时 select insert 配合 insert select;
  如果时本表复制其他表数据 insert select

Guess you like

Origin www.cnblogs.com/xiaoshahai/p/11984069.html