Оптимизация запросов за меньшее время - PullRequest
0 голосов
/ 28 мая 2018

У меня есть таблица emp, имеющая 2 миллиона записей.Столбец «Статус» имеет три значения: «Постоянный», «Контракт», «Стажер».Это занимает много времени, чтобы выполнить.Есть ли способ оптимизировать этот запрос, чтобы он занимал меньше времени.Ниже приведен запрос:

SELECT dtls_info, 
       status,max(emp_id) -- COUNT(DISTINCT emp_id) 
FROM (
  SELECT status, dtls_info, emp_id 
  FROM (
    SELECT status, dtls_info, emp_id, modif_date, MAX(emp_id) OVER() AS max_emp_id 
    FROM emp
  ) 
  WHERE emp_id >= max_emp_id - 200000 
    and modif_date > sysdate - 1 / 24
)
where emp_id >= (select min(emp_id) from emp) 
GROUP BY status, dtls_info;

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Хммм.Ваш запрос выглядит следующим образом:

SELECT dtls_info, 
       status,max(emp_id) -- COUNT(DISTINCT emp_id) 
FROM (SELECT status, dtls_info, emp_id 
      FROM (SELECT e.*, MAX(emp_id) OVER () AS max_emp_id 
            FROM emp e
           ) e
      WHERE emp_id >= max_emp_id - 200000 AND
            modif_date > sysdate - 1 / 24
     ) e
WHERE emp_id >= (select min(emp_id) from emp) 
GROUP BY status, dtls_info;

Внешний where является несущественным (если emp_id не может быть NULL. Это упрощает запрос до:

SELECT dtls_info, status, max(emp_id) -- COUNT(DISTINCT emp_id) 
FROM (SELECT e.*, MAX(e.emp_id) OVER () AS max_emp_id 
      FROM emp e
     ) e
WHERE emp_id >= max_emp_id - 200000 AND
      modif_date > sysdate - 1 / 24
GROUP BY status, dtls_info;

Условие наmax_emp_id очень любопытно. Но для этой версии начните с индекса на emp(emp_id, modif_date). Я склонен согласиться с APC, что условия на emp_id, вероятно, не являются необходимыми, и это решение, вероятно, то, что вам действительно нужно.

0 голосов
/ 28 мая 2018

Самый простой запрос, который может показаться следующим:

SELECT dtls_info, 
       status,
       COUNT(DISTINCT emp_id) -- max(emp_id) 
FROM emp
WHERE modif_date > sysdate - 1 / 24
and emp_id is not null  
GROUP BY status, dtls_info; 

Это должно работать достаточно хорошо, если на modif_date есть индекс, потому что вы можете получить операцию сканирования диапазона индекса.Даже если он не проиндексирован, удаление ненужного подзапроса в той же таблице сократит общее затраченное время (поскольку запрос выполняет меньше работы).

Речь идет о том, что вам, кажется, нужен тест на совокупность того, что кажется столбцом первичного ключа.Если у вас действительно есть нулевые значения в emp_id, это может быть ошибкой в ​​приложении, к которому вам нужно обратиться.

Я проигнорировал тест на max_emp_id, поскольку это похоже на то, что было добавлено в попытке ускоритьвещи, а не действующее бизнес-правило.

...