oracle 中 insert select 和 select insert 配合使用

时间:2024-03-01 09:07:00

Insert Into select 与 Select Into 哪个更快?

1在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO ;
2
3那么二者语法上有什么区别?性能上又如何呢?
4
5围绕着这两个问题,今天就来总结对比下:
6

一:语法区别

1: INSERT INTO SELECT 的语法

 1INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
2如果两个表的结构一致,字段类型一致:
3
4INSERT INTO table2
5SELECT * FROM table1;
6如果两个表结构不一致,只有某几列一致:
7
8INSERT INTO table2 (column_name)
9SELECT column_name FROM table1;
10

2:SELECT INTO 的语法

 1SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
2如果想要复制所有的列:
3
4SELECT *
5INTO newtable
6FROM table1;
7如果想要复制部分的列:
8
9SELECT column_name
10INTO newtable
11FROM table1;
12提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。如果想要修改字段的名称,可以使用 AS 子句来应用新名称。
13

二:性能区别

 1----创建一个基础数据库
2CREATE TABLE TestDataTable(
3    id int not null,
4    userName varchar(20),
5    remark varchar(100)
6)
7----填充100W测试数据
8DECLARE @id INT,@userName NVARCHAR(50),@remark NVARCHAR(50);
9DECLARE @i INT;
10
11SET @id=0;
12SET @userName =\'\';
13SET @remark=\'\';
14SET @i=0;
15
16WHILE @i<1000000
17BEGIN
18    SET @id=@i;
19    IF(@i%2=0)
20        begin
21            set @userName=\'二狗子\';
22            set @remark=\'SELECT INTO 最快!\'
23        end
24    else
25        begin
26            set @userName=\'李四\';
27            set @remark=\'快你妹,INSERT INTO 最快\'
28        end
29    INSERT INTO TestDataTable(id,username,remark)
30    VALUES (@id,@username,@remark )
31    SET @i=@i+1
32END
33<br>--查询填充后的数据
34SELECT * FROM TestDataTable<br>--删除表结构以及数据【慎用】
35DROP Table TestDataTable
36  耗时1分钟58秒,数据填充好了,真是不给力,竟然用了快2分钟;
37
38
39
40好了,在去创建一个目标数据库;
41
42
43--创建一个目标数据库,把100W数据复制到这个里面取
44CREATE TABLE TargetDB(
45    id int not null,
46    userName varchar(20),
47    remark varchar(100)
48)
49测试1:INSERT INTO SELECT
50
51SET STATISTICS TIME ON
52INSERT INTO TargetDB
53SELECT *
54FROM TestDataTable
55GO
56SET STATISTICS TIME OFF
57
58
59
60
61
62
63测试2:SELECT INTO
64SET STATISTICS TIME ON
65SELECT *
66INTO TargetDB
67FROM TestDataTable
68GO
69SET STATISTICS TIME OFF
70

三:结论

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

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

注意

 1注意: 
21:SELECT INTO FROM
3如果在sql/plus或者PL/SQL执行这条语句,会报"ORA-00905:缺失关键字"错误,原因是PL/Sql与T-SQL的区别。
4T-SQL中该句正常,但PL/SQL中解释是:
5select..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.
6即不能单独作为一条sql语句执行,一般在PL/SQL程序块(block)中使用。
7
8如果想在PL/SQL中实现该功能,可使用Create table newTable as select * from ...:
9如: create table NewTable as select * from ATable;
10NewTable 除了没有键,其他的和ATable一样
112:一般oracle中如果是原表向复制数据修改年度使用时 select insert 配合 insert select;
12  如果时本表复制其他表数据 insert select
13