在平常數據庫操作的時候,我們有時候會遇到表之間數據復制的情況,可能會用到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 方式去操作了。