Как оптимизировать запрос jpa

0

У меня есть запрос, который занимает немного больше времени для извлечения данных из mysql db. В базе данных всего несколько записей

@Query("    SELECT  COUNT(*)
    FROM  Message n
    WHERE  n.deleted = false
      AND  n.sent = true
      AND  n.senderEnvelope.user = ?1
      AND  n.replyToMessage IN (
        SELECT  DISTINCT m.replyToMessage
            FROM  Message m , Relationship r
            WHERE  m.deleted = false
              AND  m.sent = true
              AND  m.senderEnvelope.user = ?1
              AND  ?2 MEMBER OF r.categories 
                          )
       ")
Long countUniqueRepliesSentByUser(User currentUser ,
            RecommendationCategory recommendationCategory);

Есть ли способ, с помощью которого я могу оптимизировать этот запрос или изменить его по-другому. Пожалуйста помоги. заранее спасибо

  • 0
    Вы можете выполнить соответствующий оператор SQL в базе данных и проверить, работает ли он хорошо или нет, а во-вторых, проверить, нормально ли подключение к базе данных или нет?
  • 0
    Нет, это также не очень хорошо работает на базе данных. Да, подключение к базе данных в порядке.
Показать ещё 2 комментария
Теги:
performance
jpa

1 ответ

0

Самая большая проблема заключается в том, что для этих двух таблиц нет отношения:

FROM  Message m , Relationship r

Это приводит к дорогостоящему "перекрестному соединению".

Это похоже на синтаксическую ошибку; что это должно было означать?:

AND  ?2 MEMBER OF r.categories

После того, как они будут исправлены, обратитесь к IN. IN ( SELECT DISTINCT... ) плохо оптимизирован. Кроме того, DISTINCT, как некоторый уровень, избыточен. Подумайте об изменении его на

EXISTS ( SELECT 1 FROM ...
          AND n.replyToMessage = m.replyToMessage )

Предоставьте EXPLAIN SELECT... для любого запроса, о котором вы спрашиваете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню