Эквивалентны ли эти SQL запросов? А что лучше или есть вариант лучше? - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над веб-приложением Spring, которое использует спящий режим для подключения к базе данных DB2. Я пытаюсь оптимизировать метод обслуживания, который вызывается несколько раз во время вызова службы wed, путем уменьшения количества запросов к БД. эквивалентен / лучше, чем этот запрос

SELECT * FROM TABLE_A a 
WHERE  a.ID IN 
(
    SELECT b.FK_ID FROM  TABLE_B b 
    WHERE b.REQUEST_ID = 1234 AND eb.TYPE = 'TYPE_A' 
)
OR a.ID IN 
(
    SELECT c.FK_ID FROM TABLE_C 
    WHERE ( c.REQUEST_ID = 1234 AND c.TYPE = 'TYPE_A' )
    OR 
        (
            c.TYPE = 'TYPE_B' AND c.REQUEST_ID IN 
                (
                    SELECT d.ID FROM TABLE_D d 
                    WHERE d.REQUEST_ID = 1234 AND v.TYPE = 'TYPE_A'
                )
        )
)

или есть лучший вариант?

Кажется, что оба запроса выполняются примерно в одно и то же время (<50 мс), но это может зависеть от полученных данных . Мне нужно было бы протестировать больше, чтобы знать наверняка. </p>

Смысл этих двух запросов состоит в том, чтобы один из них заменил три других запроса, где их результирующие данные обрабатываются в Java для получения требуемых данных.

Мне также нужно будет преобразовать запрос SQL в HQL. Я изо всех сил пытался преобразовать первый запрос.

У меня такое чувство, что я, возможно, зря трачу время, поскольку объекты java для таблиц B и C являются отношениями один-ко-многим в объекте для таблица A, и они все равно загружаются спящим режимом. Это означает, что в долгосрочной перспективе я не буду экономить в любое время. Правильно ли я здесь думаю?

Спасибо!

1 Ответ

1 голос
/ 19 июня 2020

Если я правильно понимаю, exists было бы лучшим решением:

SELECT a.*
FROM TABLE_A a
WHERE EXISTS (SELECT 1
              FROM TABLE_B b 
              WHERE a.ID = b.FK_ID AND b.REQUEST_ID = 1234 AND b.TYPE = 'TYPE_A'
             ) OR
      EXISTS (SELECT 1
              FROM TABLE_C c JOIN
                   TABLE_D d
                   ON c.DATA_RQST_ID = d.ID
              WHERE a.ID = c.FK_ID AND
                    c.REQUEST_ID = 1234 AND
                    (c.TYPE IN ('TYPE_A', 'TYPE_B'))
             );

Одно большое преимущество заключается в том, чтобы просто удалить select distinct.

Тогда для производительности вы хотите индексы на table_b(fk_id, request_id, type_id) и table_c(fk_id, request_id, type, DATA_RQST_ID) и table_d(id).

...