oracle 中 insert select 和 select insert 配合使用


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






測試2SELECT 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


免責聲明!

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



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