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
<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 方式去操作了。
注意
注意:
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