Grails генерирует сомнительные пагинационные запросы для MSSQL - PullRequest
1 голос
/ 22 ноября 2011

Я использую 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:

выберите топ 100000 и т. Д.

Запрос явно неэффективен. Это горькая правда с Grails, который не может создать эффективный запрос для MSSQL, или я что-то упустил?

Пожалуйста, помогите!

1 Ответ

1 голос
/ 22 ноября 2011

Нет, дело не в том, что Grails (точнее Hibernate , базовая технология баз данных) не может генерировать несколько более эффективные запросы.Это не связано с ограничениями SQL Server 2000, который не поддерживает более эффективный общий синтаксис для разбивки на страницы (см. например ).

Если вы не укажете dialect для вашего источника данных, Hibernate по умолчанию будет использовать базовый SQLServerDialect , который генерирует неэффективные запросы, которые вы видите .Переключение на SQLServer2008Dialect в вашем источнике данных должно генерировать несколько более эффективные запросы с использованием общих табличных выражений , например (взято из 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

To toэто в Grails, просто установите свойство dialect в conf/Datasource.groovy как , задокументированное здесь , например

dataSource {
   // configuration you already have
   dialect = org.hibernate.dialect.SQLServer2008Dialect
}
...