Оптимизация запросов оракула - PullRequest
0 голосов
/ 11 октября 2018

У меня мало знаний по оптимизации запросов, мне нужна помощь здесь.Вот пример кода нашего проекта, его длительный запрос Oracle для извлечения данных из 2 разных таблиц (student, student_info).

Есть ли возможность оптимизировать это?Как здесь работают where условие 'и'?

Поддерживает ли он какой-либо порядок при выполнении предложения AND?Как приведенный ниже запрос делает различия до и после, удалив код строки b.student_id in ('a123','b123','c123').

У нас нет прав для добавления индексов в столбцы этой таблицы.

Как повысить производительность без создания индексов.

select a.student_id
       max(decode(a.marks_limit, 99.99,100,null )) as max_marks,
       b.student_city_code "NYC",
from student a, 
     student_info b
where a.student_id=b.student_id
  and a.student_id in ('a123','b123','c123')
  and b.student_id in ('a123','b123','c123')
  and  b.adress_modified > TO_TIMESTAMP('2003/12/13 10:13:18', 'YYYY/MM/DD HH:MI:SS')
  group by a.student_id, b.student_city_code;

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Сначала напишите запрос, используя правильный, явный, правильный JOIN синтаксис с разумными псевдонимами таблиц и case выражениями.

После исправления я ожидал что-то вродеэто:

select s.student_id
       max(s.marks_limit) as max_marks,  -- I have no idea what the decode() is supposed to be doing
       si.student_city_code
from student s join
     student_info si
     on s.student_id = si.student_id
where s.student_id in ('a123', 'b123', 'c123')
 and   si.adress_modified > TIMESTAMP '2003-12-13T10:13:18'HH:MI:SS')
group by s.student_id, si.student_city_code;

Я бы начал с индексов на student(student_id) и student_info(student_id address_modified, student_city_code).

0 голосов
/ 11 октября 2018

Только несколько предложений.

У Юо уже есть a.student_id = b.student_id, поэтому условие b.student_id в ('a123,' b123 ',' c123 ') - это просто полезное повторение.с использованием нотации явного соединения, а не старой нотации на основе выражения where

   select a.student_id
    max(decode(a.marks_limit, 99.99,100,null )) as max_marks,
    b.student_city_code "NYC",
    from student a
    INNER JOIN  student_info b ON a.student_id= b.student_id
    WHERE 
    and a.student_id in ('a123','b123','c123')
    and  b.adress_modified > TO_TIMESTAMP('2003/12/13 10:13:18', 'YYYY/MM/DD HH:MI:SS')
    group by a.student_id, b.student_city_code

, а для повышения производительности следует проверить составной индекс для таблицы

 student_info ( adress_modified, student_id )

или

student_info ( adress_modified, student_id, student_city_code )
0 голосов
/ 11 октября 2018

Вы можете:

select a.student_id
    max(decode(a.marks_limit, 99.99,100,null )) as max_marks,
    b.student_city_code "NYC",
from student a
join student_info b
  on a.student_id=b.student_id     -- explicit join
where a.student_id in ('a123','b123','c123') -- removing duplicate condition
  and b.adress_modified>TO_TIMESTAMP('2003/12/13 10:13:18','YYYY/MM/DD HH:MI:SS')
group by a.student_id, b.student_city_code;

И добавить индексы:

CREATE INDEX id1 ON student(student_id);
CREATE INDEX id2 ON student_info(student_id);
CREATE INDEX id3 ON student_info(adress_modified);
...