简体   繁体   English

我可以使用 JOOQ 对查询运行“解释分析”吗?

[英]Can I run an "explain analyze" on a query using JOOQ?

Can I run explain analyze on a query in JOOQ?我可以在 JOOQ 中对查询运行explain analyze吗? like:喜欢:

explain analyse select some, columns from some_table

but do it using JOOQ on PostgreSQL database?但是在 PostgreSQL 数据库上使用 JOOQ 吗?

I have found an interface org.jooq.Explain , with a method DSLContext.explain(Query query) - but it seems just to use EXPLAIN on a query:我找到了一个接口org.jooq.Explain ,方法是DSLContext.explain(Query query) - 但它似乎只是在查询中使用EXPLAIN

@Support({AURORA_MYSQL,AURORA_POSTGRES,H2,HSQLDB,MARIADB,MEMSQL,MYSQL,ORACLE,POSTGRES,SQLITE}) 
Explain explain​(Query query)
Run an EXPLAIN statement in the database to estimate the cardinality of the query.

Is there any sensible way to run an EXPLAIN ANALYZE on the database from the code side?有什么明智的方法可以从代码端对数据库运行EXPLAIN ANALYZE吗?

Yes you can run explain.是的,你可以运行解释。 Example例子

SelectWhereStep<ModuldefRecord> where = dsl.selectFrom(MODULDEF);
Explain explain = dsl().explain(where);

System.out.println(explain);

The output look like this (for Oracle) output 看起来像这样(对于 Oracle)

+------------------------------------------------------------------------------+
|PLAN_TABLE_OUTPUT                                                             |
+------------------------------------------------------------------------------+
|Plan hash value: 3871168833                                                   |
|                                                                              |
|------------------------------------------------------------------------------|
|| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     ||
|------------------------------------------------------------------------------|
||   0 | SELECT STATEMENT  |          | 61303 |    30M|  1305   (1)| 00:00:01 ||
||   1 |  TABLE ACCESS FULL| MODULDEF | 61303 |    30M|  1305   (1)| 00:00:01 ||
|------------------------------------------------------------------------------|
+------------------------------------------------------------------------------+

Explain also contains rows and cost解释还包含行和成本

    /**
     * The number of rows (cardinality) that is estimated to be returned by the query.
     * <p>
     * This returns {@link Double#NaN} if rows could not be estimated.
     */
    double rows();

    /**
     * The cost the database associated with the execution of the query.
     * <p>
     * This returns {@link Double#NaN} if cost could not be retrieved.
     */
    double cost();

It's not supported yet: https://github.com/jOOQ/jOOQ/issues/10424 .尚不支持: https://github.com/jOOQ/jOOQ/issues/10424 Use plain SQL templating , instead:使用普通的 SQL 模板,而不是:

ctx.fetch("explain analyze {0}", select);

For mariadb I needed to do:对于 mariadb,我需要这样做:

SelectConditionStep<TableNameRecord> select =
    context.selectFrom(Tables.TABLE_NAME)
    .where(filter);
System.out.println(context.fetch("analyze " + select.getSQL(ParamType.INLINED)));

which produced the output:产生了 output:

+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+-------+--------+----------+------------------------+
|  id|select_type|table     |type |possible_keys    |key              |key_len|ref   |rows|r_rows |filtered|r_filtered|Extra                   |
+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+-------+--------+----------+------------------------+
|   1|SIMPLE     |table_name|range|table_column_name|table_column_name|20     |{null}|1000|1000.00|   100.0|     100.0|Using where; Using index|
+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+-------+--------+----------+------------------------+

If you use context.explain(select) as proposed by another answer you lose a few columns:如果您按照另一个答案的建议使用context.explain(select) ,则会丢失几列:

+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+------------------------+
|  id|select_type|table     |type |possible_keys    |key              |key_len|ref   |rows|Extra                   |
+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+------------------------+
|   1|SIMPLE     |table_name|range|table_column_name|table_column_name|20     |{null}|1000|Using where; Using index|
+----+-----------+----------+-----+-----------------+-----------------+-------+------+----+------------------------+

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM