Quantcast
Channel: InfoQ - 促进软件开发领域知识与创新的传播
Viewing all articles
Browse latest Browse all 1638

以调试形式,深入理解凤凰全局索引

$
0
0

第六章

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 的数据。


Viewing all articles
Browse latest Browse all 1638