2011-11-22 54 views
1

我使用Grails 1.3.7和MSSQL Server 2008的 通过两个动态查找器或标准,这样做简单的查询:的Grails产生怀疑分页查询为MSSQL

Invoice.findAllByClient(client, [max: 25, offset: 100000, sort: 'title']) 

Invoice.createCriteria().list(max: 25, offset: 100000) { 
    eq('client', client) 
    order('title') 
} 

并观看投向MSSQL服务器的实际查询:

select top 100000 etc

该查询明显效率低下。对于Grails来说,这是一个令人痛苦的事实,它无法为MSSQL生成有效的查询,或者我错过了一些东西?

请帮忙!

回答

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 
} 
+0

非常感谢!它非常有意义。但是,Grails 1.3.7中包含的hibernate bundle中不存在SQLServer2008Dialect类。我想升级到最新的hibernate必须完成。我对吗? –

+0

@ Andrey.Kozyrev:你知道,我忽略了检查与Grails捆绑在一起的可用方言。不幸的是,我强烈怀疑升级Hibernate的版本可能会破坏GORM。我认为你最好打赌是创建一个自定义方言类,它复制[最新版本的方言]的实现(https://github.com/hibernate/hibernate-core/blob/master/hibernate-core /src/main/java/org/hibernate/dialect/SQLServer2005Dialect.java),或者迁移到使用Hibernate 3.5的Grails 2.0。 – ig0774