2007/11/28

DBのはまりどころ

よく実行するSQLのパフォーマンスを向上させるために
javaのpreparedstatementにてSQLを実行する。

昨今のフレームワークもSQLはプリコンパイルした形で実行することが多い。
SQLインジェクション対策にもなっている。

これは一見、よさそうに見える。
但し、以下の点に注意
パラメータ数が多いもの。
この場合、SQLをプリコンパイルするのにかなりの時間を要するので逆に
パフォーマンス低下を発生させかねない。
簡単な確認しか行っていないがPostgres8.2.5ではだいたい100以上のパラメータ
をつけると急激にパフォーマンス低下が発生した。
みなさんどうですか?

2007/11/07

全文検索時に利用できるパラメータトークンロジック

Pattern pattern = Pattern.compile("(((?<=\\s| |\\A)\".+?\"(?=\\s| |\\Z))|((?<=\\s| |\\A)[^\\s| ]+?(?=\\s| |\\Z)))");
Matcher matcher = pattern.matcher("\"aaaa  \" bbbb  \" cccc\" dddd");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {

System.out.println("発見0:[" + matcher.group(0) + "]");

}
matcher.appendTail(sb);
System.out.println(sb.toString());

または

// Pattern pattern = Pattern.compile("(((?<=\\s| |\t|\\A)\".+?\"(?=\\s| |\t|\\Z))|((\\s|\t| )+))");
// Pattern pattern2 = Pattern.compile("((?<=\\s| |\t|\\A)\".+?\"(?=\\s| |\t|\\Z))");
// Matcher matcher = pattern.matcher("\"aaaa  \" bbbb   \" cccc\" dddd");
// Matcher matcher2;
// StringBuffer sb = new StringBuffer();
// while (matcher.find()) {
//
// System.out.print("発見:[" + matcher.group(0) + "]");
// matcher2 = pattern2.matcher(matcher.group(0).toString());
// // 「"」でかこまれた文字列
// if (matcher2.find()) {
// System.out.println("0:[" + matcher.group(0) + "]");
// matcher.appendReplacement(sb, " +" + matcher.group(0));
// }
// // 単純な空白文字列
// else {
// System.out.println("1:[" + matcher.group(0) + "]");
// matcher.appendReplacement(sb, " +");
// }
// }
// matcher.appendTail(sb);
// System.out.println(sb.toString());