巨大なSQLliteのDBをいくつかのDBに分けた場合のパフォーマンスに関するメモ。
結論:2つ以上のDBに交互にSELECT文を発行すると、そうでない場合に比べて10〜100倍くらい遅くなった。
最初に複数のDBコネクションを配列に入れる。
my @dbhs = qw(); for(my $take=$TAKE_MIN; $take<=$TAKE_MAX; $take++){ my $path = sprintf($DB_PATH2, $take); my $data_source2 = "dbi:SQLite:dbname=$path"; my $dbh2 = DBI->connect($data_source2); push(@dbhs, $dbh2); }
で、SELECT文を各DBに交互に発行。
my $sql2 = "SELECT * FROM tb WHERE uid=? LIMIT 1"; for(my $take=$TAKE_MIN; $take<=$TAKE_MAX; $take++){ my $rows2 = $dbhs[$take-1]->selectall_arrayref($sql2, { Slice => {} }, $uid); for my $row2 (@$rows2){ my $uid2 = $row2->{uid}; } }
1つのDBだけに比べて2つ以上の場合は、HDDのガリガリ音も激しく、またdstatでdiskのread/write両方ほとんど数値がでていなかったので、HDDのヘッドが激しく動きまくってそこがボトルネックになっているのではないかと予想。