第六章
Debug 之前,需要写一段简单代码,用以驱动调试过程。
PhoenixConnection connection = (PhoenixConnection)DriverManager.getConnection(
"jdbc:phoenix:local:2181",
"test",
"test");
PhoenixStatement statement = (PhoenixStatement)connection.createStatement();
String sql = "select /*+ INDEX(test idx_test_email) */ * from test where email='test@test.com'";
PhoenixResultSet explainRes = (PhoenixResultSet)statement.executeQuery("explain "+sql);
while (explainRes.next()){
logger.info("explain: {}",explainRes.getString(1));
}
PhoenixResultSet resultSet = (PhoenixResultSet)statement.executeQuery(sql);
while (resultSet.next()){
logger.info("id: {},name: {},email: {}",
resultSet.getString("id"),
resultSet.getString("name"),
resultSet.getString("email"));
}
explainRes.close();
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
请注意上面的代码中:
connection/statement/resultSet 等类型已经被强制转换成了 Phoenix 对应的类型,这样方便IDEA直接跳转到具体的实现,否则就会跳转到 java 的 interface 中。这也算一个小技巧吧,调试其他源码的时候,最好转换成具体实现的类。
CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER TEST
SKIP-SCAN-JOIN TABLE 0
CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER IDX_TEST_EMAIL ['test@test.com']
SERVER FILTER BY FIRST KEY ONLY
DYNAMIC SERVER FILTER BY "TEST.ID" IN ($2.$4)
上面是 explain 得到的 SQL 执行计划,很明显 Phoenix 使用了 idx_test_email 这个索引。
根据之前文章的分析,我们可以在 executeQuery 内部设置一个断点,看一下解析后的 statement 的数据。