Oracle с оптимизацией предложения - PullRequest
0 голосов
/ 14 января 2020

Мне нужна помощь для оптимизации запроса. И предложите, если есть какой-либо другой способ выполнить то же самое sh, используя любой другой запрос.

WITH 
q1 as 
(select eid, data_used||'-'||status as value1 
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions>),
q2 as
(select eid, data_used||'-'||status as value2 
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions different from q1 >),
q3 as
(select eid, data_used||'-'||status as value3  
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions different from q2>)
select q1.eid, q1.value1, q2.value2, q3.value3 
from q1, q2, q3 
where q1.eid = q2.eid 
and q2.eid=q3.eid;

Запрос выдаст следующий результат:

enter image description here

Я имел в виду, что значение1, значение 2, значение 3 могут быть разными для одного и того же идентификатора в соответствии с условиями в q1, q2 и q3.

Обе таблицы T1 и T2 являются таблицами аудита, поэтому eid повторяется в обоих случаях несколько раз.

Я действительно устал от оптимизации и сокращения этого запроса. Я новичок в этом. Поэтому я хотел бы знать, есть ли другой способ сделать это. Я создал индексы для этих таблиц, и все же он возвращает данные за 77 секунд. Мне нужно сократить время как минимум на 10 - 15 секунд. Текущий объем данных составляет 100 000 записей, и он будет расти как миллиарды.

1 Ответ

1 голос
/ 14 января 2020

Если я правильно понимаю ваш запрос, вы просто слишком усложнили запрос «и». Таким образом, ваш запрос может быть получен просто:

select
  eid || status as value1,
  eid || status as value2,
  eid || status as value3
from
  T1
  join T2 on t1.eid = td.eid
where
  <Q1 conditions> and
  <Q2 conditions> and
  <Q3 conditions>

Я мог бы добавить, что "EID" отсутствует в ваших подзапросах. Я не думаю, что ваш пример будет скомпилирован как есть.

И я понимаю, что в этом нет особого смысла - перечислять одинаковые значения в трех столбцах, но я полагаю , что именно ваш запрос делает из-за внутренних объединений, следующих за всеми CTE (при условии, что вы добавляете EID к выводу).

Я полностью размышляю, но я думаю, что это может быть именно тем, что вы пытались сделать:

select
  case when <Q1 conditions> then eid || status end as value1,
  case when <Q2 conditions> then eid || status end as value2,
  case when <Q3 conditions> then eid || status end as value3
from
  T1
  join T2 on t1.eid = td.eid
where
  <Q1 conditions> or
  <Q2 conditions> or
  <Q3 conditions>

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

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

...