gpt4 book ai didi

sql-server-2008 - Grails为MSSQL生成可疑的分页查询

转载 作者:行者123 更新时间:2023-12-02 14:46:45 27 4
gpt4 key购买 nike

我正在使用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生成有效查询的痛苦事实,还是我错过了一些东西?

请帮忙!

最佳答案

不,并不是说Grails(或更确切地说是底层数据库技术Hibernate)不能生成效率更高的查询。这不是由于SQL Server 2000的限制,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
}

关于sql-server-2008 - Grails为MSSQL生成可疑的分页查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8221465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com