我正在使用Grails 1.3.7和MSSQL Server 2008。 通过动态查找器或类似标准进行简单查询:
Invoice.findAllByClient(client, [max: 25, offset: 100000, sort: 'title'])
或
Invoice.createCriteria().list(max: 25, offset: 100000) {
eq('client', client)
order('title')
}
并观察抛出到MSSQL Server的实际查询:
选择前100000等
查询显然效率低下。这是Grails的一个痛苦的事实,它不能为MSSQL生成有效的查询,或者我错过了什么?
请帮忙!
答案 0 :(得分:1)
不,Grails(或者更确切地说Hibernate,底层数据库技术)不能生成更高效的查询。它不是由于SQL Server 2000的限制,它不支持更有效的分页查询通用语法(参见e.g.)。
如果您没有为数据源指定dialect,则Hibernate将默认使用基础SQLServerDialect,generates the inefficient queries you are seeing。切换到数据源中的SQLServer2008Dialect generate somewhat more efficient queries using common table expressions,例如(取自Javadoc),
WITH query AS (
SELECT ROW_NUMBER() OVER (ORDER BY orderby) as __hibernate_row_nr__,
original_query_without_orderby
)
SELECT * FROM query WHERE __hibernate_row_nr__ BETWEEN offset AND offset + last
要在Grails中执行此操作,只需将dialect
中的conf/Datasource.groovy
属性设置为documented here,例如
dataSource {
// configuration you already have
dialect = org.hibernate.dialect.SQLServer2008Dialect
}