Проблема со сложным запросом с использованием Hibernate - PullRequest
1 голос
/ 12 января 2012

У меня есть 7 сводных таблиц по одной на каждый день недели. txn_summary_monday ... txn_summary_tuesday и так далее ...

Транзакция хранилища таблиц рассчитывается для каждой даты (каждый понедельник, каждый вторник ... и т. Д.), Местоположения, пользователя, ресурса и т. Д.

вот пример домена для таблицы

class TxnSummFri {
    Long id 
    Transaction trans
    Users guser
    Resources gresource
    Integer txnCount
    Date currentdate 
    String accountid

    }

Мне нужно получить общее количество по местоположению в диапазоне дат ... (таким образом, это будет сумма всех отдельных подсчетов в таблицах по местоположению в каждой таблице и затем снова сумма по этому подсчету по местоположению для всех таблиц).

Еще одна вещь - мне нужно будет выполнить левое соединение вместо внутренних объединений в сводных таблицах, так как я хочу, чтобы все возможные местоположения в 7 таблицах в окончательном списке. (в некоторых таблицах могут отсутствовать некоторые местоположения).

Как мне написать приведенный выше запрос в спящем режиме ... У меня есть сводные таблицы в качестве объектов домена в моем приложении. Приложение основано на Grails / Groovy.

Вот то, что я написал до сих пор ... получаю подсчеты по местоположениям для каждой таблицы, чтобы теперь суммировать их по местоположениям ..

def SummTblList  = ['TxnSummMon','TxnSummTue','TxnSummWed','TxnSummThu','TxnSummFri','TxnSummSat','TxnSummSun']
def res_row
def resourceInstance=Resources.get(Long.parseLong(res_id))
         SummTblList.each{
         res_row=it.createCriteria().get {   

            eq('resource',resourceInstance)
            between('date', new Date()-31, new Date())        

            projections {  
            sum('actioncount')
            groupProperty 'location'         
                }                  
            }    

Что-то о требованиях к нашей схеме (не относится к вышеупомянутому): В основном у меня есть все виды запросов к таблице пользовательских транзакций ... для агрегирования по транзакциям, пользователям, ресурсам, по датам, по пользователям, по ресурсам, местоположению. Я делаю эти запросы для запуска диаграмм, используя fusioncharts - инструмент на основе flash, запускаю отчеты с использованием отчетов jasper и общего поиска в пользовательском интерфейсе.

Ранее мы использовали одну таблицу, но для создания отчетов об активности пользователей за последние 7 дней для 4 из 4 ресурсов требуется 60 секунд ... Я просто хочу сделать ее как минимум в 20 раз быстрее.

Заранее спасибо,

Priyank

1 Ответ

0 голосов
/ 12 января 2012

Я бы изменил базу данных, чтобы иметь одну таблицу транзакций вместо таблиц для каждого дня недели. Это значительно упростит запрос.

Если бы у меня не было возможности изменить базу данных, я бы представил убедительный аргумент администратору базы данных о том, почему мы должны изменить базу данных, чтобы иметь одну таблицу транзакций.

Если бы мой убедительный аргумент был отклонен, я бы сделал что-то радикальное (не обязательно в таком порядке):

  • посмотрим, сможете ли вы создать представление, которое каким-то образом объединит все таблицы, и GORM отобразит представление
  • посмотрите, позволит ли использование расширенных функций GORM / Hibernate, таких как базовый класс, упростить ваш запрос
  • сломайте и попробуйте создать HQL-запрос, чтобы выбрать эти значения из каждой таблицы
  • если создание запроса HQL вызывает проблемы, посмотрите, будет ли собственный запрос проще
  • крик
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...