【问题标题】:JOOQ slow code generationJOOQ 慢代码生成
【发布时间】:2017-08-13 05:06:54
【问题描述】:

是否有任何参数可以在jooq代码生成期间打开/关闭下一个查询的执行?

SELECT "SYS"."ALL_OBJECTS"."OWNER",
     "SYS"."ALL_OBJECTS"."OBJECT_NAME",
     "SYS"."ALL_OBJECTS"."OBJECT_ID",
     "SYS"."ALL_PROCEDURES"."AGGREGATE"
FROM "SYS"."ALL_OBJECTS"
     LEFT OUTER JOIN "SYS"."ALL_PROCEDURES"
        ON (    "SYS"."ALL_OBJECTS"."OWNER" =
                   "SYS"."ALL_PROCEDURES"."OWNER"
            AND "SYS"."ALL_OBJECTS"."OBJECT_NAME" =
                   "SYS"."ALL_PROCEDURES"."OBJECT_NAME")
WHERE (    UPPER ("SYS"."ALL_OBJECTS"."OWNER") IN ( 'MYSCHEMA')
      AND "SYS"."ALL_OBJECTS"."OBJECT_TYPE" IN ( 'FUNCTION', 'PROCEDURE'))
ORDER BY "SYS"."ALL_OBJECTS"."OWNER" ASC,
     "SYS"."ALL_OBJECTS"."OBJECT_NAME" ASC,
     "SYS"."ALL_OBJECTS"."OBJECT_ID" ASC

在具有大量模式和对象的数据库上执行大约需要一个小时

【问题讨论】:

  • 嗯,好的,那里的UPPER(OWNER) 表达式可能会阻止在列上使用有用的索引...我们将对其进行研究。您使用的是什么 Oracle 数据库版本,以及什么 jOOQ 版本?对于此特定查询,您可以关闭 <database/> 配置中的 <includeRoutines/><includePackages/> 标志:jooq.org/doc/latest/manual/code-generation/codegen-advanced/…
  • Oracle 11.2.0.4,JOOQ 3.7.2。您提到的标志似乎适用于 JOOQ 3.9?
  • 嗯,这些标志是在 jOOQ 3.8 中添加的,但文档目前没有反映这一点。一种解决方法是将JavaGenerator 及其generatePackages()generateRoutines() 方法重写为空。我会尽快提供有关此信息的答案
  • 还有一个问题(如果您被允许发布此信息):此查询对您有什么好处(否则,PM 也会这样做)? SELECT object_type, count(*) FROM all_objects GROUP BY object_type ORDER BY object_type;

标签: java sql jooq


【解决方案1】:

jOOQ 运行的查询的一个主要问题是UPPER(OWNER) 表达式。这是在 jOOQ 2.4 (#1418) 中引入的,以防止用户意外使用小写模式名称的错误配置。该功能基于一个错误的假设,即不可能区分大小写的用户。它们当然是可能的(即使很少见),所以#1418 是错误的。我为这个问题创建了两个问题:

  • #5989:通过避免OWNER 列上的函数来修复性能问题
  • #5990:重新制定区分大小写的架构名称

与此同时,您有一些可能的解决方法:

Pre jOOQ 3.8

您始终可以从 jooq-codegen 覆盖 JavaGenerator 并重新实现一些方法,包括 generatePackages()generateRoutines() 为空。这样一来,相关的代码就完全不会被执行了。

当然,这意味着您不会得到任何生成的包和例程。

发布 jOOQ 3.8

有一个新的配置选项,您可以在其中以配置方式执行与上述相同的操作:

<configuration>
  <generator>
    <database>
      <includeRoutines>false</includeRoutines>
      <includePackages>false</includePackages>
      ...

另请参阅: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-include-object-types

【讨论】:

  • 谢谢你,卢卡斯!现在整代需要 11 分钟。但似乎还有另一个使用 UPPER 作为模式名称的查询
  • @DmitryAgibov:是的,确实 #5989 将为 jOOQ 3.9.2 和 3.8.8 修复此问题,而 #5990 将为 3.10 修复此问题。一些进一步的解决方法可能包括为 jOOQ 代码生成器提供自定义 JDBC 连接,它在 jooq-meta 查询中将所有UPPER\((.*?)\) 表达式替换为$1。我不确定这对你是否可行?否则,请随意报告其他慢查询,我将分别查看。也许有一个低垂的果实......
猜你喜欢
  • 2014-09-09
  • 2017-12-03
  • 2020-01-23
  • 2014-03-06
  • 2016-06-12
  • 2020-12-23
  • 2016-11-22
  • 2020-07-26
  • 2015-12-13
相关资源
最近更新 更多