私はIT系・金融系の中でも、比較的にデータベースに強い。

元々はプログラミング言語特化だったのだが、今はデータベース系エンジニアとしての性格が強い。

(だからこそ、金融系ITerとして活躍できるのだが)

 

画像は以下から転用

https://gihyo.jp/dev/serial/01/redshift/0001

列思考DB、行思考DBの違い。

 

今はRedshiftをメインで扱っている。

Oracle、DB2、PostgreSQL、MySQLなどと違い、いわゆる列思考(カラムナー型)のDBの特徴なのか、相当にクセがある。

致命的なのは、Insertが遅い…どうしようもないぐらいに遅い。

 

従って、大量データを投入する場合には、insertではなくloadする事になる。

これは、既存のDBでもinsertよりもloadした方が速いのは一般的に知られているが「遅さ」がまるで違うのだ。

 

尚、Oracleに代表されるDBがinsertよりもloadの方が速い理由は、はっきりしている。

loadユーティリティを使う場合は、行挿入の都度indexを最適化しないのが大きな理由。

(indexを手動で外す、もしくは自動でindexを外しデータ挿入後にindexを再構築する)

だが、redshiftの遅延の原因はどうもそういう事ではないらしい…原因はもっと調べないとなぁ…。

 

とはいえ、現在は

oracleにデータ投入、S3経由でredshiftへデータ移行という、非常に迂遠な方法を取っているので、ちょっとした操作を頻繁に行う際には面倒くさくて仕方が無い。

S3経由せずに、copyコマンドで直接LOADしようとするとエラーになってしまうし…(環境の問題か?)

 

そこで、insertを少し考え直してみようと思う。

 

要するに、insertを大量発行するから悪いのかもしれない。

insert into aaa (a,b,c,d,e) values (1,1,1,1,1);

insert into aaa (a,b,c,d,e) values (2,2,2,2,2);

insert into aaa (a,b,c,d,e) values (3,3,3,3,3);

と、やらずに。

 

insert into aaa (a,b,c,d,e) values

(1,1,1,1,1),

(2,2,2,2,2),

(3,3,3,3,3)

とやれば、トランザクションは1回しか発生しないので早くなる説。

 

早速試してみよう