Оптимизация запроса выбора с несколькими одинаковыми внутренними запросами - PullRequest
0 голосов
/ 09 июня 2019

Я пишу запрос для большой таблицы. Я совсем не в базы данных. Запрос выглядит очень большим, и я чувствую, что он может быть сокращен, но, похоже, не нашел пути. Я попытался использовать предложение WITH, которое сделало бы запрос проще. Однако я не могу это использовать.

Следующий запрос:

 SELECT id, 
       name, 
       Count(name), 
       SUM(event.time_spent_millis), 
       flag, 
       template 
FROM   event 
WHERE  event.host = 'mantis' 
       AND event .` input ` NOT LIKE '%random%' 
       AND id IN (SELECT event1.id 
                  FROM   event AS event1 
                  WHERE  ( event1.host = 'mantis' 
                           AND timestamp BETWEEN 1559337058633 AND 1559683282607 
                           AND template IN ( 'wrap' ) 
                           AND event1.flag = '22' 
                           AND event1.name = 'jack' )) 
        OR id IN (SELECT a.id 
                  FROM   event AS a 
                  WHERE  a .` input ` LIKE '%random%' 
                         AND a.name = 'jack' 
                         AND a.host = 'mantis' 
                         AND template IN ( 'wrap' ) 
                         AND timestamp BETWEEN 1559337058633 AND 1559683282607 
                         AND a.flag IN ( '0', '1' ) 
                         AND a.id NOT IN (SELECT b.id 
                                          FROM   event AS b 
                                          WHERE  b.flag = '22' 
                                                 AND b.host = 'mantis' 
                                                 AND b.timestamp BETWEEN 
                                                     1559337058633 AND 
                                                     1559683282607 
                                                 AND b.name = 'jack')) 
GROUP  BY id, 
          name 

Пример данных:

id  name    time    flag    template
aaa123  jack    6561    22  wrap
aaa123  matt    18  NULL    NULL
aaa123  matt1   1126    0   NULL
baa123  jack    6561    22  wrap
baa123  matt    18  NULL    NULL
baa123  matt1   1126    0   NULL

Подводя итог, что я хочу в результате:

Для данного ввода я хочу, чтобы все имя, связанное с флагом, и имена, связанные с этим именем.

В приведенных данных выходной сигнал будет идентифицирован для флага 22 * ​​1014 *, jack имеет 2 count и others имеет 4 количество и время - это сумма всех (включая джек и др.).

Запрос не дает желаемого результата, потому что он становился все более сложным.

1 Ответ

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

Я думаю, следующий код является оптимизированной версией вашего SQL с использованием подзапроса

SELECT id, 
       name, 
       Count(name), 
       SUM(event.time_spent_millis), 
       flag, 
       template 
FROM   event e
WHERE  e.host = 'mantis' 
       e.timestamp BETWEEN 1559337058633 AND 1559683282607 
       AND e.template = 'wrap' 
       AND e.flag = '22' 
       AND e.name = 'jack'
       AND (
         (e .` input ` NOT LIKE '%random%' AND e.flag = '22')
         OR
         (e .` input ` LIKE '%random%' AND e.flag IN ( '0', '1' ))
       )
GROUP  BY e.id, 
          e.name 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...