|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Есть учебная база, в которой есть табличка со справочником преподавателей PREPODS и табличка со справочником студентов STUDENTS. Между ними связь многие-ко-многим, т.е. есть табличка для связки PREP_STUD, в которой внешний ключ PREP_ID на PREPODS и STUD_ID - на STUDENTS, ну а первичный ключ составной PREP_ID,STUD_ID. На внешние ключи созданы индексы IND_PREP_STUD__PREP_ID и IND_PREP_STUD__STUD_ID Требуется написать запрос: Получить список всех преподавателей, которые не обучают ни одного студента. Первое что приходит в голову - это написать такой запрос: Код: plsql 1. 2. 3.
Но в плане будет TABLE ACCESS FULL таблицы преподавателей: Код: plsql 1. 2. 3. 4. 5.
Как в данном случае написать более оптимальный запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 00:38 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Была идея создать такую функцию: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
затем сделать индекс по этой функции в таблице преподавателей: Код: plsql 1.
ну а затем в запросе использовать эту функцию: Код: plsql 1. 2. 3.
Но индекс по такой функции не удаётся создать, потому что она не детерминистская, т.е. для одних и тех же значений параметра может выдавать разный результат, поэтому такой индекс нельзя создать пишет нам оракл. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 01:11 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Тут дело не в запросе, а в статистике. Запрос нормальный, разве что я бы not in заменил на not exists. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 09:18 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
verter Но в плане будет TABLE ACCESS FULL таблицы преподавателей: что ужасного в TABLE ACCESS FULL? ps другие варианты not exists (...) внешнее соединение зы для древних версий статейка была (not) in и (not) exists ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 09:25 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Stax для древних версий статейка была (not) in и (not) exists https://asktom.oracle.com/pls/apex/f?p=100:11:0::no::p11_question_id:442029737684 https://mir-oracle.com.ua/oracle-tech-info/13-otkryitooboracle/22--sql-.html ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 09:37 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Ну да, с not exists тоже альтернативный вариант, просто план у него такой же. А вот если нужен вот такой запрос: Получить список всех преподавателей, у которых 5 и более студентов, с указанием количества студентов сверх 5. На ум приходит такой вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
План такой: Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 09:54 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
verter, при определенных условиях таблица преподователей не нужна. Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 10:15 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
verter А вот если нужен вот такой запрос: Получить список всех преподавателей, у которых 5 и более студентов, с указанием количества студентов сверх 5. На ум приходит такой вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
зачем изобретать велосипеды? - для включения индексов базовый подход: Код: plsql 1. 2. 3. 4. 5.
PS: мимо проходил ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 10:27 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
Fogel зачем изобретать велосипеды? - для включения индексов базовый подход: Код: plsql 1. 2. 3. 4. 5.
PS: мимо проходил Да, так план становится намного лучше: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А почему в вашем случае идёт по индексам, а в моём нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 11:26 |
|
Оптимальный план запроса
|
|||
---|---|---|---|
#18+
verter Fogel зачем изобретать велосипеды? - для включения индексов базовый подход: Код: plsql 1. 2. 3. 4. 5.
PS: мимо проходил Да, так план становится намного лучше: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А почему в вашем случае идёт по индексам, а в моём нет? в твоем случае он не может до джоина узнать сколько студентов у препода и поэтому вынужден перебирать ВСЕХ преподов. А перебирать всех по индексу медленнее чем фулсканом. А так мы можем ДО джоина выбрать нужных преподов только на базе PREP_STUD, и если окажется что их сильно меньше чем всех преподов - то нестед луп с индексным поиском будет быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 11:58 |
|
|
start [/forum/topic.php?fid=52&fpage=16&tid=1880086]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 146ms |
0 / 0 |