Java Hibernate QueryTranslatorImpl HQL AST解析性能

Java Hibernate QueryTranslatorImpl HQL AST解析性能,java,performance,hibernate,jpa,hql,Java,Performance,Hibernate,Jpa,Hql,使用@NamedEntityGraph 当我检查日志时,我看到以下语句: 2016-10-26 09:46:25,681 DEBUG [http-nio-8080-exec-1] CriteriaQueryImpl: Rendered criteria query -> select generatedAlias0 from Patient as generatedAlias0 order by generatedAlias0.id asc 2016-10-26 09:46:25,681

使用
@NamedEntityGraph

当我检查日志时,我看到以下语句:

2016-10-26 09:46:25,681 DEBUG [http-nio-8080-exec-1] CriteriaQueryImpl: Rendered criteria query -> select generatedAlias0 from Patient as generatedAlias0 order by generatedAlias0.id asc
2016-10-26 09:46:25,681 DEBUG [http-nio-8080-exec-1] CriteriaQueryImpl: Rendered criteria query -> select count(generatedAlias0) from Patient as generatedAlias0
2016-10-26 09:46:25,681 DEBUG [http-nio-8080-exec-1] SQL: select count(patient0_.id) as col_0_0_ from patient patient0_
2016-10-26 09:46:25,682 DEBUG [http-nio-8080-exec-1] Loader: Result row: 
2016-10-26 09:46:25,682 DEBUG [http-nio-8080-exec-1] ConcurrentStatisticsImpl: HHH000117: HQL: select count(generatedAlias0) from Patient as generatedAlias0, time: 0ms, rows: 1
2016-10-26 09:46:25,682 DEBUG [http-nio-8080-exec-1] QueryTranslatorImpl: parse() - HQL: select generatedAlias0 from com.fluidda.broncholab.domain.Patient as generatedAlias0 order by generatedAlias0.id asc
2016-10-26 09:46:27,340 DEBUG [http-nio-8080-exec-1] QueryTranslatorImpl: --- HQL AST ---
 \-[QUERY] Node: 'query'
    +-[SELECT_FROM] Node: 'SELECT_FROM'
    |  +-[FROM] Node: 'from'
    |  |  \-[RANGE] Node: 'RANGE'
    |  |     +-[DOT] Node: '.'
    |  |     |  +-[DOT] Node: '.'
    |  |     |  |  +-[DOT] Node: '.'
    |  |     |  |  |  +-[DOT] Node: '.'
    |  |     |  |  |  |  +-[IDENT] Node: 'com'
    |  |     |  |  |  |  \-[IDENT] Node: 'fluidda'
    |  |     |  |  |  \-[IDENT] Node: 'broncholab'
    |  |     |  |  \-[IDENT] Node: 'domain'
    |  |     |  \-[IDENT] Node: 'Patient'
    |  |     \-[ALIAS] Node: 'generatedAlias0'
    |  \-[SELECT] Node: 'select'
    |     \-[IDENT] Node: 'generatedAlias0'
    \-[ORDER] Node: 'order'
       +-[DOT] Node: '.'
       |  +-[IDENT] Node: 'generatedAlias0'
       |  \-[IDENT] Node: 'id'
       \-[ASCENDING] Node: 'asc'

2016-10-26 09:46:27,340 DEBUG [http-nio-8080-exec-1] ErrorCounter: throwQueryException() : no errors
2016-10-26 09:46:27,340 DEBUG [http-nio-8080-exec-1] HqlSqlBaseWalker: select << begin [level=1, statement=select]
2016-10-26 09:46:27,341 DEBUG [http-nio-8080-exec-1] FromElement: FromClause{level=1} : com.fluidda.broncholab.domain.Patient (generatedAlias0) -> patient0_
这里有什么问题?这是一个非常基本的HQL,为什么需要这么长时间


是否可以缓存这些HQL AST解析?

出于性能考虑,HQL查询计划将被缓存。您可以使用以下两个配置属性控制查询计划缓存:

  • hibernate.query.plan\u cache\u max\u size
    =2048(默认值)
  • hibernate.query.plan\u参数\u元数据\u最大大小
    =128(默认值)

尝试将该值增加到适合您的数据访问模式的值。

出于性能考虑,HQL查询计划将被缓存。您可以使用以下两个配置属性控制查询计划缓存:

  • hibernate.query.plan\u cache\u max\u size
    =2048(默认值)
  • hibernate.query.plan\u参数\u元数据\u最大大小
    =128(默认值)

尝试将该值增加到适合您的数据访问模式的值。

谢谢Vlad。这是否意味着第一次执行HQL查询时总是很慢?这与任何数据库查询都是一样的。当您第一次执行查询时,数据库必须生成一个执行计划。某些数据库可能会缓存该计划(例如Oracle、SQL Server),因此第一次执行速度较慢。HQL查询也是如此。第一次执行时,速度会变慢。但是如果正确缓存HQL计划,那么所有其他执行都会很快。我之前没有提到过,但我没有看到HQL解析时间一直是2秒。大多数情况下,解析HQL只需要大约30毫秒(当然,对于同一个查询)。知道解析时间不一致的原因吗?只有当缓存已满且旧条目被逐出时才会发生这种情况。当前解析器还存在一些固有的性能问题。这是我们第一次进入Antlr,我们在某些领域做出了一些错误的决定(回顾过去)。这就是说,我们正在从头开始为6.0重新编写查询解析-保持调优Hanks Vlad。这是否意味着第一次执行HQL查询时总是很慢?这与任何数据库查询都是一样的。当您第一次执行查询时,数据库必须生成一个执行计划。某些数据库可能会缓存该计划(例如Oracle、SQL Server),因此第一次执行速度较慢。HQL查询也是如此。第一次执行时,速度会变慢。但是如果正确缓存HQL计划,那么所有其他执行都会很快。我之前没有提到过,但我没有看到HQL解析时间一直是2秒。大多数情况下,解析HQL只需要大约30毫秒(当然,对于同一个查询)。知道解析时间不一致的原因吗?只有当缓存已满且旧条目被逐出时才会发生这种情况。当前解析器还存在一些固有的性能问题。这是我们第一次进入Antlr,我们在某些领域做出了一些错误的决定(回顾过去)。也就是说,我们正在从头开始为6.0重写查询解析-请继续关注
private HqlParser parse(boolean filter) throws TokenStreamException, RecognitionException {
    // Parse the query string into an HQL AST.
    final HqlParser parser = HqlParser.getInstance( hql );
    parser.setFilter( filter );

    LOG.debugf( "parse() - HQL: %s", hql );
    parser.statement();

    final AST hqlAst = parser.getAST();

    final NodeTraverser walker = new NodeTraverser( new JavaConstantConverter() );
    walker.traverseDepthFirst( hqlAst );

    showHqlAst( hqlAst );

    parser.getParseErrorHandler().throwQueryException();
    return parser;
}