Спящий режим автоматически предотвращает перекрестные объединения без переписывания большого запроса? - PullRequest
0 голосов
/ 23 октября 2019

Предположим, у меня есть большой запрос, сгенерированный Hibernate, с CROSS JOIN, который влияет на производительность:

SELECT studyt0_.abbreviation                                AS col_0_0_,
       userst2_.user_name                                   AS col_1_0_,
       recallst3_.id                                        AS col_2_0_,
       recallst3_.recall_date                               AS col_3_0_,
       recallst3_.created_date                              AS col_4_0_,
       (SELECT lookupt8_.description
        FROM   PUBLIC.answers_t answerst5_
               CROSS JOIN PUBLIC.activity_questions_t activityqu6_
               CROSS JOIN PUBLIC.activities_t activities7_
               CROSS JOIN PUBLIC.lookup_t lookupt8_
        WHERE  lookupt8_.id = activities7_.activity_category_id
               AND activities7_.id = activityqu6_.activity_id
               AND activityqu6_.id = answerst5_.activity_question_id
               AND activityqu6_.question_id = 1
               AND answerst5_.event_id = eventst4_.id)      AS col_5_0_,
       (SELECT activities11_.activity_title
        FROM   PUBLIC.answers_t answerst9_
               CROSS JOIN PUBLIC.activity_questions_t activityqu10_
               CROSS JOIN PUBLIC.activities_t activities11_
        etc

Это связано с неявными объединениями , которые есть в нашем HQL,насколько я понимаю.

(select l.description from AnswersT ans, ActivityQuestionsT aq, ActivitiesT a, LookupT l " + 
            "where l.id=a.lookupT.id and a.id=aq.activitiesT.id and aq.id=ans.activityQuestionsT.id and aq.questionsT.id=1 and ans.eventsT.id=e.id) as category, " + 

Вопрос: Есть ли способ быстро избавиться от соединений CROSS и заменить их на INNER JOIN, не переписывая весь запрос, который очень велик? Есть ли какое-нибудь решение для конфигурации?

1 Ответ

0 голосов
/ 24 октября 2019

Я вижу здесь 2 вещи, которые можно оптимизировать.

1) Подход (select A from ...) as nameA, (select B from ...) as nameB, ... приводит к огромному перекрестному соединению: каждое значение в 1-м столбце будет объединено с каждым значением во 2-м столбце и т. Д. Для меня это выглядит как ошибка. Обычно должно быть только одно предложение из , что-то вроде select A as nameA, select B as nameB, ... from ....

2) Независимо от этого проверьте ваше предложение где . Текущее состояние

where l.id=a.lookupT.id and a.id=aq.activitiesT.id and aq.id=ans.activityQuestionsT.id
  and aq.questionsT.id=1 and ans.eventsT.id=e.id

можно заменить на более простое:

where ans.activityQuestionsT.questionsT.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...