[英]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.