|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Приветствую. Прошу помощи в оптимизации SQL-запроса. Имеется таблица со студентами Students. Студенты в ней уникальные, не повторяются. Имеется таблица Archive, в которой студенты могут многократно повторятся. Таблица Student соединяется по первичному ключу id (кластерный индекс) с таблицей Archive по полю id_student (не кластерный индекс). У таблицы Arhive есть отчетный период, поле hdr_id. Задача: необходимо найти в таблице Students тех студентов, которые в заданном отчётном периоде нет в таблице Archive. Запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Запрос выполняет то, что требуется, но выполняется очень долго. План говорит, что сначала выполняется это условие из LEFT JOIN: Код: sql 1.
, – и только потом всё остальное. Соединяется больше миллиарда записей. Как заставить план в LEFT JOIN выполнять сначала это условие: Код: sql 1.
? Останется около 1000 записей и их в миллион раз легче будет джойнить, чем миллиард. В инструкции прочёл, что можно явно указывать PLAN и последовательность выполнения запроса. Но моему уму не поддаётся инструкция.. Правильно ли я понял, что NATURAL в плане это аналог SCAN в ms sql (пробегается по всем записям)? Как называется аналог Seek? Можете доработать запрос, отталкиваясь от максимального быстродействия, используя PLAN / JOIN PLAN (мб вообще без плана есть способ для ускорения оО)? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 15:38 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion, какой план, какие индексы есть? www.youtube.com/watch?v=0KITHwMNDtw Вообще при a left join b ПРИНЦИПИАЛЬНО таблица A берется целиком, если по ней нет условий отбора. У вас, видимо, индекса по a.hdr_id нет. Ну и ... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 15:42 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
JOIN выкинуть переписать на WHERE NOT EXISTS() ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 15:54 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Какие-то дешёвые курсовики пошли. В прошлом годе позабористей были. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 18:18 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Это, наверное, не курсовик, а лабы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 18:38 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, "Соединяется больше миллиарда записей." миллиард студентов? Китайская лаба? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 19:13 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Это граничные условия, наверное. В реале там и миллиона нет, наверняка. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 22:11 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
kdv Explosion, какой план, какие индексы есть? По индексам ведь писал: - id (кластерный индекс) из таблицы Student; - id_student (не кластерный индекс) из таблицы Archive; - Также добавлю, что фио+др составной некластерный индекс. МимопроходящийJOIN выкинуть переписать на WHERE NOT EXISTS() Поменял на: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Также пробовал при помощи CTE: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Not Exists отработал быстрее. Подскажите есть ли в Firebird возможность разбивать базу на файловые группы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 07:05 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion, 1. В Firebird нет кластерных индесов 2. Файловых групп тоже нет ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 08:26 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion Подскажите есть ли в Firebird возможность разбивать базу на файловые группы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 08:27 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам Это граничные условия, наверное. В реале там и миллиона нет, наверняка. В реале там тыщ 10. Студентов. Миллиард в архиве событий. У нас в институте стипендию давали 23-го числа. Таки локальный ЛЭТИшный анек "Дневник студента": 20 число - кушать хочется. 21 число - кушать хочется. 22 число - кушать хочется. 23 число - не помню. 24 число - не помню. 25 число - кушать хочется. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 11:32 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion По индексам ведь писал: - id (кластерный индекс) из таблицы Student; - id_student (не кластерный индекс) из таблицы Archive; - Также добавлю, что фио+др составной некластерный индекс. По части кластерности - трудно найти чёрную кошку в тёмной комнате, особенно если её там нет. По части фио+др вопрос имею - какое отношение этот индекс имеет к присоединению архива по двум id? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 11:36 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
забористо ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 11:40 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Симонов Денис Explosion, 1. В Firebird нет кластерных индесов Спасибо за подсказку, Денис. Думал как в ms sql, если сделать первичный ключ через интерфейс management studio, автоматически навешается кластерный индекс. Старый плюшевый мишкаПо части фио+др вопрос имею - какое отношение этот индекс имеет к присоединению архива по двум id? К присоединению никакого отношения не имеет. В предыдущем вопросе спрашивалось какие индексы имеются, перечислил все. Скажите, вариант работы через таблицу из пункта WITH медленнее NOT EXISTS потому что табличка из CTE не использует индексы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 12:09 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion, нет. Потому что NOT EXISTS моментально прекращает поиск если найдена хоть одна запись и выдаёт false, в то время как left join сначала всё присоединит что найдёт, а только потом начнёт проверять что записей нет (a.id_student is null). Хотя это не всегда так. Всё зависит от того чего больше найденных записей или нет И да попробуй вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 12:28 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion К присоединению никакого отношения не имеет. В предыдущем вопросе спрашивалось какие индексы имеются, перечислил все. Скажите, вариант работы через таблицу из пункта WITH медленнее NOT EXISTS потому что табличка из CTE не использует индексы? Да как же ей использовать индексы, если нужных для этого запроса нет? Чтобы это работало нужен однозначно индекс по id_student на архиве. Нужен ли по hdr_id - надо смотреть на его селективность. Если там в этом миллиарде три значения hdr_id - не только не нужен, но и вреден. Тогда, возможно, будет полезен композит student_id, hdr_id, а не просто student_id. И да, если на архиве есть FK на студентов и на хыдыры, то это значит, что индексы таки есть. Тогда для начала надо вместо беллетристики показать DDL этих таблиц и планы, которые строит оптимизатор. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 14:32 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка Да как же ей использовать индексы, если нужных для этого запроса нет? Чтобы это работало нужен однозначно индекс по id_student на архиве. В первом и шестом сообщение писал, что индекс стоит. Старый плюшевый мишка Нужен ли по hdr_id - надо смотреть на его селективность. Про этот индекс не писал, он есть. Статистика уникальности индекса примерно 0,014, поэтому решил поставить. Старый плюшевый мишка Тогда для начала надо вместо беллетристики показать DDL этих таблиц и планы, которые строит оптимизатор. Подскажите как вывести план? Есть команда для вывода плана без запроса "set planonly". Правильно ли всё понял, в IB Expert открываю New SQL Editor, пишу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
На команду planonly ругается. Firebird 2.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 08:03 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion, Это команда isql. В эксперт план и без неё выводится рядом со статистикой выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 08:30 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
ExplosionПравильно ли всё понял, в IB Expert открываю New SQL Editor, пишу: у ибэксперта в sql editor жмем кнопку Prepare {}, смотрим план и explained (в 3 и выше). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:50 |
|
Просьба помочь в оптимизации SQL-запроса
|
|||
---|---|---|---|
#18+
Explosion В первом и шестом сообщение писал, что индекс стоит. Ваша правда, затупил, не перечитал первый пост. Издержки эпизодического заглядывания сюда, извиняюсь. Тогда, по идее, оптимизатору просто деваться некуда, запрос простой как мычание. Если объёмы действительно огромные, есть смысл подумать об эффектах второго порядка - распределении значений hdr в индексе на архиве, например. Если это 434 - 90%, а остальные по крошке, то при общей хорошей селективности именно на нём будут тормоза. Ну и размер страницы для баз с малым количеством таблиц, но содержащих огромные объёмы данных, надо увеличивать, возможно, до упора. Ну и к слову - в Эксперте в редакторе таблиц есть закладка DDL. Чем рассказывать что там да как, гораздо эффективней скопипастить всё оттуда. Не относящиеся к делу неиндексированные атрибуты, если их много, лучше отрезать, чтоб глаза не застили, триггера при обсуждении селектов тоже. В этой теме нужны, собственно, констрейнты, индексы и поля, на которых они живут. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 13:04 |
|
|
start [/forum/topic.php?fid=40&tid=1559810]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
369ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 742ms |
0 / 0 |