Как заставить Oracle использовать индекс, а затем объединять вместо полного сканирования таблицы, когда HQL-запрос использует условие «ИЛИ»? - PullRequest
0 голосов
/ 17 апреля 2019

Ребята:

У меня есть запрос, написанный на HQL, в котором используется условие 2 ИЛИ для слияния результата в части предложения where.Hibernate Framework получает результат очень медленно, потому что он сделал полное сканирование таблицы на DboX таблицы, которая имеет огромное количество строк.Я хочу улучшить производительность запросов HQL.

Я проверил запрос в аналогичном sql на Toad и обнаружил, что это будет гораздо быстрее, если я использую объединение с 3 подзапросами вместо условия «ИЛИ».

    TypedQuery<DboX> query = this.getTypedQuery(
            "from DboX where ( segId in ( "
                    + "select segId from DboY "
                    + "where fpId.controlNumber = :fpIdControlNumber "
                    + "and fpId.amendmentNumber = :fpIdAmendmentNumber "
                    + " ) or segId in (  "
                    + "select id from DboZ "
                    + "where fpId.controlNumber = :fpIdControlNumber "
                    + "and fpId.amendmentNumber = :fpIdAmendmentNumber "
                    + " ) or mfUuid in (  "
                    + " select uuid from DboU "
                    + "where uSegId in ( "
                    + "select segId from DboY "
                    + "where fpId.controlNumber = :fpIdControlNumber "
                    + "and fpId.amendmentNumber = :fpIdAmendmentNumber "
                    + " ) ) ) and dataSourceName = 'aaaa' and  oId is not null"
                    + " order by oId");


    query.setParameter("fpControlNumber", id.getControlNumber());
    query.setParameter("fpIdAmendmentNumber", id.getAmendmentNumber());

    return super.search(query); 

Однако HQL не поддерживает объединение, и мне не разрешено обновлять Java-код, чтобы объединить результат с 3 методами с HQL, так как наш код заморожен.Мой менеджер предпочитает получать изменения в экземпляре базы данных Oracle, а не в коде Java.У кого-нибудь есть предложения по этому поводу?

1 Ответ

0 голосов
/ 17 апреля 2019

Прежде всего убедитесь, что база данных Oracle обновила статистику!Если вам повезло, статистика устарела, и существующий запрос неожиданно выберет лучший план при обновлении.

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

Если вам хотя бы разрешено изменять HQL (это также код в моей книге), вы можетеДобавьте подсказки и проинструктируйте Oracle использовать нужные вам индексы.В общем, я не люблю подсказки, но у них есть свои места.Возможно, это один из них.

Наконец, если вы действительно не можете прикоснуться к приложению, вы можете попытаться использовать профиль SQL в Oracle для реализации желаемого плана. Ручное создание профиля SQL объясняет, как создать его вручную, если Enterprise Manager не может выполнить то, что вы хотите.Независимо от того, что вам нужно обсудить с вашим администратором базы данных.Требуется Enterprise Edition плюс «Tuning Pack».

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