OracleDB

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

2018年7月27日

こんにちは!土門大貴(daikidomon)です。

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 ;
created by Rinker
¥2,178 (2020/08/08 21:27:39時点 Amazon調べ-詳細)

関連記事

-OracleDB

Copyright© スタートアップIT企業社長のブログ , 2020 All Rights Reserved.