2012年8月30日木曜日

カラム指向DB比較 - InfiniDB(番外編) - はまりポイント挙げるの巻。

前回までの続きっぽい番外編。
カラム指向DB比較 - MonetDB インストールの巻。
カラム指向DB比較 - MonetDB パフォーマンス検証の巻。
カラム指向DB比較 - InfiniDB インストールの巻。

前回 InfiniDB のインストールを行ったが、その時ハマった事や後から分かった Community Edition の制約について今回下記3点を挙げておこうと思う。

  1. Select+Insert 不可
  2. cpimport で管理者権限が必要
  3. 副問い合わせで関数を使用するとコネクション切断


1.  Select+Insert 不可
InfiniDB は Infobright と異なり Community Edition でも Insert/Update が実施可能である事を謳っているが、Select 結果を直接 Insert するような SQL には対応していない。
$ idbmysql 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.39 MySQL Community / Calpont InfiniDB Community 2.2.9-2 Final (COSS LA)

mysql> use test
Database changed

# テーブル作成
mysql> create table fromTable(id int, value int) engine=infinidb;
Query OK, 0 rows affected (0.34 sec)
mysql> create table toTable(id int, value int) engine=infinidb;
Query OK, 0 rows affected (0.49 sec)

# fromTable にデータ投入
mysql> insert into fromTable values (1, 100), (2, 200);
Query OK, 2 rows affected (0.21 sec)
Records: 2  Duplicates: 0  Warnings: 0

# fromTable から toTable へデータ移動 ⇒ 怒られる
mysql> insert into toTable select id, value from fromTable;
ERROR 138 (HY000): IDB-1009: Insert with Select is only available in InfiniDB Enterprise.
はっきりと Enterprise 版でしか対応していない(Select is only available in InfiniDB Enterprise)事を言っている。使いたければ金払えという強気の姿勢。
DB 内部で SQL を用いてデータクレンジング・データ集約を行うスタイルが好きなのだけどこれではかなり厳しい。SQL の結果を一度外部ファイルとして取り出してからのバルクロードという方向性になるが、正直あまりやりたくはないなーとか思ってしまった。

2. cpimport で管理者権限が必要
これも正直まいる。どうも cpimport 中に生成するバルクロード処理の定義ファイルが Infinidb のシステム領域(/usr/local/Calpont/data/bulk/tmpjob 以下)に作成されるらしく、通常ユーザだとここにアクセス権限が無いとかで処理がエラーで中断されてしまう。また定義ファイルの問題をクリアしても、cpimoprt がDBのデータファイルそのものを書き込みにいくため、やはり権限エラーが発生してしまう。
cpimport でエラー
# BulkLoad 用のテーブル作成
mysql> create table hoge(id int, value int) engine=infinidb;
Query OK, 0 rows affected (0.29 sec)

mysql> quit
Bye

# テーブル hoge のスキーマに合わせた csv を適当に作成して cpimport 実施
$ cpimport test hoge hoge.csv -s '\t'
Column delimiter : \t

Using table OID 3022 as the default JOB ID
Input file(s) will be read from : /home/you1025/tmp
Job description file : /usr/local/Calpont/data/bulk/tmpjob/test_hoge_D20120828_T021145_Job_3022.xml
I/O error : Permission denied
I/O error : Permission denied
2012-08-28 02:11:45 (7043) ERR  :  file /usr/local/Calpont/data/bulk/tmpjob/test_hoge_D20120828_T021145_Job_3022.xml does not exist [1055]

Error in loading job information, error code : 1055
※Infinidb の起動ユーザを mysql に変更し、/usr/local/Calpont 以下のファイルを全て mysql に変更する事で対応可能 (もっとうまいやり方があるはず。。。)

3. 副問い合わせで関数を使用するとコネクション切断
これはかなり微妙。あるクエリで必ず発生するので再現性としては申し分ないのだが、他にどういうパターンだと発生するのかが不明。たとえば自分のケースだと、where 句 で ifnull を使用した場合に発生する。
$ idbmysql 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 686
Server version: 5.1.39 MySQL Community / Calpont InfiniDB Community 2.2.9-2 Final (COSS LA)

mysql> create table tbl1(id int, value int, t datetime) engine=infinidb;
Query OK, 0 rows affected (1.38 sec)

mysql> create table tbl2(id int, value int, t datetime) engine=infinidb;
Query OK, 0 rows affected (0.64 sec)

mysql> select * from tbl1 where t > (select ifnull(max(t), '2012-01-01') from tbl2);
ERROR 2013 (HY000): Lost connection to MySQL server during query

# もう一度チャレンジしてみる
mysql> select * from tbl1 where t > (select ifnull(max(t), '2012-01-01') from tbl2);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test

ERROR 2013 (HY000): Lost connection to MySQL server during query # ダメでした

Infinidb は Infobright より制約がゆるくて良さ気みたいな情報があふれているけど実際に使用してみると大事なところに制約があったり意味不明な仕様やエラーがあったりと結構クセがあるという印象。誰か正しい使い方を教えてくれたらとても嬉しい。

0 件のコメント:

コメントを投稿