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查询计划将被缓存。您可以使用以下两个配置属性控制查询计划缓存:
=2048(默认值)hibernate.query.plan\u cache\u max\u size
=128(默认值)hibernate.query.plan\u参数\u元数据\u最大大小
尝试将该值增加到适合您的数据访问模式的值。出于性能考虑,HQL查询计划将被缓存。您可以使用以下两个配置属性控制查询计划缓存:
=2048(默认值)hibernate.query.plan\u cache\u max\u size
=128(默认值)hibernate.query.plan\u参数\u元数据\u最大大小
尝试将该值增加到适合您的数据访问模式的值。谢谢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;
}