Database OracleDB インフラ

[OracleDB] ”insert”文でデータ挿入。insert文を高速化するポイントも紹介。

こんにちは!シミダイ(@shimidai2100)です。

OracleDatabaseのデータ挿入SQL、「insert」文について紹介します。

insert」文は、「update」、「delete」と同様にDML(Data Manipulation Language )と呼ばれ、データを操作するSQL文になります。

「insert」文は単純SQLですが、「insert into ~ select」文などテクニックもあり意外に奥が深いです。

この記事で「insert文」の基本的な使い方から、insert高速化のためのTIPSも紹介します。


基本構文:insert into ~ value

insert 文の基本構文は以下になります。

insert into <テーブル名> (
    <列名①>,
    <列名②>,
    <列名③>...
) values (
    <列①の値>,
    <列②の値>,
    <列③の値>...
)

下がサンプルのinsert文になります。

create table EMPLOYEE (
    EMPNO  varchar2(10),
    NAME   varchar2(20),
    SALARY number
);

insert into EMPLOYEE (
    EMPNO,
    NAME,
    SALARY
) values (
    '00001',
    'TARO TANAKA',
    300000
);

select * 
  from EMPLOYEE;



EMPNO      NAME                          SALARY
---------- ------------------------- ----------
00001      TARO TANAKA                   300000

またinsert文は全カラムを指定した場合、列名を省略して記載することができます。

insert into <テーブル名>
values (
    <列①の値>,
    <列②の値>,
    <列③の値>...
)

下が全カラムを指定した場合のサンプルinsert文になります。

insert into EMPLOYEE 
values (
    '00001',
    'TARO TANAKA',
    300000
);

表データをまとめて挿入:insert into ~ select

表データをまとめてinsertすることが出来るのが「insert into ~ select」で実施することができます。

insert into <テーブル名> 
select 
    <列名>,
    <列名>,
    <列名>...
  from <ソースのテーブル名>;

以下がサンプルになります。

insert into EMPLOYEE 
select * 
  from EMPLOYEE_BK;

もちろん列名を指定してinsertすることも出来ます。

insert into EMPLOYEE 
    EMPNO,
    NAME,
    SALARY
select 
    EMPNO,
    NAME,
    SALARY
  from EMPLOYEE_BK;

ここでは記載しませんが、結合した表を1つの表へinsertすることもできます。

ダイレクト・パス・インサート:/*+ APPEND */

insert into ~ select」など効果的なinsert方法に「ダイレクト・パス・インサート」があります。

ダイレクト・パス・インサートとは、データベースバッファを経由せずデータファイルへ直接データを書き込みます。

そのため、バッチ処理のように大量のデータを一括でinsertさせる時に大変性能が向上します。

ダイレクト・パス・インサートを使用するためにはヒント句/*+ APPEND */」を使用します。

insert /*+ APPEND */ into <テーブル名> 
select * from <ソーステーブル名> ;

下が「/*+ APPEND */」を使用したサンプルです。

insert /*+ APPEND */ into EMPLOYEE_BK 
select * from EMPLOYEE ;

 

関連記事

-Database, OracleDB, インフラ

Copyright© shimidai2100 , 2020 All Rights Reserved.