Можно ли оптимизировать этот SQL-запрос для базы данных Oracle? - PullRequest
0 голосов
/ 10 июня 2019

Таблица сообщений

|-----|-------------|-----------------|--------|--------------|
|  id | message_id  | msg_connect_id  |  body  |  created_ts  |  
|-----|-------------|-----------------|--------|--------------|
|  1  | 12345       | 1234            |  body1 |  timestamp1  |
|  2  | 12346       | 1234            |  body2 |  timestamp2  |
|  3  | 12347       | 1234            |  body3 |  timestamp3  |
|  4  | 12348       | 5678            |  body4 |  timestamp4  |
|  5  | 12349       | 1234            |  body5 |  timestamp5  |
|-----|-------------|-----------------|--------|--------------|

При условии, что message_id является параметром запроса, может ли этот запрос быть оптимизирован?

SELECT id,message_id ,body,created_ts FROM message
where msg_connect_id = (select msg_connect_id from message where message_id ='12346')
and id <=  (select id from message where message_id ='12346') order by created_ts desc

Я ожидаю, что строка, соответствующая параметру message_id, вместе со всеми строками под ней с одинаковым msg_connect_id. Так, например если параметр message_id равен 12346, то ожидаемые строки - это строки с id 2, 3 и 5.

1 Ответ

0 голосов
/ 10 июня 2019

Вы можете переместить подзапрос в предложение from и использовать индексы:

select m.id, m.message_id, m.body, m.created_ts 
from message m cross join
     (select m2.*
      from message m2
      where message_id = 12346  -- it looks like a number, so I assume it is
     ) mm
where m.msg_connect_id = mm.msg_connect_id and
      m.id <= mm.id
order by m.created_ts desc;

Для этого вам нужны индексы (message_id) и (msg_connect_id, id).

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