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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM