我正在使用 JDBC PreparedStatement 从 Web 服务中查询 Teradata 数据库。我的表有一个 PHONE_NUMBER 列,存储为 VARCHAR(10)。我一直习惯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);
它返回正确的结果,但我注意到用于此查询的 CPU Teradata 相当高。根据 EXPLAIN 计划,Teradata 似乎将myPhoneNumber
参数解释为 FLOAT,而不是 VARCHAR,因此它必须进行数据转换才能将其与 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 参数吗?
谢谢!