可用版本:Dev (3.21) | 最新版本 (3.20) | 3.19 | 3.18

连续聚合

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

处理此事件的 SPI 方法是 consecutiveAggregation()

多个连续的聚合查询(相似的 FROM 子句),但每个查询使用不同的聚合函数和不同的WHERE 子句,可能会被统一成一个查询,一次性聚合所有内容。

为什么这不好?

与其运行 N 个查询,不如只运行 1 个查询。

这里给出了一个例子

// A custom DiagnosticsListener SPI implementation
class ConsecutiveAggregation implements DiagnosticsListener {
    @Override
    public void consecutiveAggregation(DiagnosticsContext ctx) {

        // The statement that is being executed and which has similar aggregate queries.
        System.out.println("Actual statement: " + ctx.actualStatement());

        // A normalised version of the actual statement, which is shared by all duplicates
        // This statement has its SELECT and WHERE clause removed.
        System.out.println("Normalised statement: " + ctx.normalisedStatement());

        // All the duplicate actual statements that have produced the same normalised
        // statement in the recent past.
        System.out.println("Repeated statements: " + ctx.repeatedStatements());
    }
}

然后

// Configuration is configured with the target DataSource, SQLDialect, etc. for instance Oracle.
try (
    Connection c = DSL.using(configuration.derive(new ConsecutiveAggregation()))
                      .diagnosticsConnection();
    Statement s = c.createStatement()
) {
    try (ResultSet a = s.executeQuery("SELECT count(*) FROM author")) {
        while (a.next())
            println(a.getInt(1));
    }

    // This query could be merged into the previous one e.g.:
    // SELECT count(*), count(*) FILTER (WHERE last_name LIKE 'A%') FROM author
    try (ResultSet a = s.executeQuery("SELECT count(*) FROM author WHERE last_name LIKE 'A%'")) {
        while (a.next())
            println(a.getInt(1));
    }
}

与检测重复语句不同,重复语句统计信息仅在本地执行,针对单个 JDBC 连接,或者如果可能,针对一个事务。不同事务中的重复语句通常不是问题的迹象。

引用此页

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo