JDBC PreparedStatement を使用して、Web サービスから Teradata データベースにクエリを実行しています。私のテーブルには、VARCHAR(10) として格納されている PHONE_NUMBER 列があります。以下のように、常にPreparedStatement setString()
この列のパラメーターを指定していました。
String myPhoneNumber = "5551234567";
String sql = "SELECT * FROM MYTABLE " +
"WHERE PHONE_NUMBER = ? ";
PreparedStatement p_stmt = db.getPreparedStatement(sql);
p_stmt.setString(1, myPhoneNumber);
ResultSet rs = db.executeQuery(p_stmt);
正しい結果が返されますが、Teradata がこのクエリに使用している CPU が非常に高いことに気付きました。EXPLAIN プランによると、Teradata はmyPhoneNumber
パラメーターを VARCHAR ではなく FLOAT として解釈しているように見えるため、VARCHAR 列と比較するためにデータ変換を行う必要がありますPHONE_NUMBER
。EXPLAIN プランの抜粋を次に示します。
...
MYDATABASE.MYTABLE.PHONE_NUMBER (FLOAT, FORMAT
'-9.99999999999999E-999'))= 5.55123456700000E 009)
そこで、CPU 使用率の大幅な改善 (99.86% の改善) を示す以下の結果を思いつきました。
String myPhoneNumber = "5551234567";
String sql = "SELECT * FROM MYTABLE " +
"WHERE PHONE_NUMBER = ''||?||'' ";
PreparedStatement p_stmt = db.getPreparedStatement(sql);
p_stmt.setString(1, myPhoneNumber);
ResultSet rs = db.executeQuery(p_stmt);
だから私の質問は、なぜこれが必要なのですか? setString
JDBC に、Teradata に String/VARCHAR パラメータを期待するように指示するべきではありませんか?
ありがとう!