Grails为MSSQL生成可疑的分页查询

时间:2011-11-22 03:03:37

标签: sql-server-2008 grails pagination gorm

我正在使用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生成有效的查询,或者我错过了什么?

请帮忙!

1 个答案:

答案 0 :(得分:1)

不,Grails(或者更确切地说Hibernate,底层数据库技术)不能生成更高效的查询。它不是由于SQL Server 2000的限制,它不支持更有效的分页查询通用语法(参见e.g.)。

如果您没有为数据源指定dialect,则Hibernate将默认使用基础SQLServerDialectgenerates 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
}
相关问题