0

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);

だから私の質問は、なぜこれが必要なのですか? setStringJDBC に、Teradata に String/VARCHAR パラメータを期待するように指示するべきではありませんか?

ありがとう!

4

1 に答える 1