Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
Добрый день, хочу поделиться с вами задачей, которую уже решил, но хотел бы оптимизировать просто ради спортивного интереса:
Итак, есть табличка tbl_num_np_order (id_order, base_num) - ид. заказа и сквозной номер издания, в котором этот заказ выходит. И есть табличка tbl_num_np_issue (base_num, num_newspaper) сквозной номер издания и годовой номер издания Сквозной номер это номер, который идёт начиная с первого выхода газеты, годовой номер это номер в пределах одного года, то есть к примеру может быть такое, что сквозной номер 1000, а годовой 1. Необходимо извлечь следующие данные: идентификатор заказа, его ГОДОВОЙ номер, и ГОДОВОЙ номер, соответствующий максимальному сквозному номеру, в котором этот заказ выходит то есть к примеру заказ выходит в сквозных номерах 999(годовой 999), 1000 (годовой 1), 1001 (годовой 2) нужно показать следующую выборку 1 999 2 1 1 2 1 2 2 Для тренировки предлагаю следующие данные:
Ну и мой вариант решения:
Мой запрос на большой базе отрабатывает за 8,7 сек., коллега проникся задачей и сумел нарисовать запрос, который на моей же базе отрабатывает за 7,8 сек. PS - слегка исправил свой запрос, теперь его можно запускать на фоксе. Исправлено 1 раз(а). Последнее : Extortioner, 03.10.11 13:27 |
Re: Запрос - спортивный интерес | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Твой же по сути запрос записывается несколько проще
------------------ WBR, Igor |
Re: Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
tbl_num_np_order ~ 223 000 записей
Далее идут описания в терминах FireBird id_order - integer (32 бита) base_num - smallint (16 бит) num_newspaper - smallint (16 бит) среднее количество выходов одного заказа - 2 (там есть, конечно разница между видами заказов, например, если брать табличные объявления, то они в принципе выходят только один раз, ну а обычные объявления или модульная реклама могут выходить очень много раз максимум, который сейчас есть в таблице - 115 раз) Ваш запрос отработал за 9,4 сек. |
Re: Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
На моей же базе отрабатывает за 6,532 сек. Мне кажется это предел. |
Re: Запрос - спортивный интерес | |
---|---|
medstrax Забанен Сообщений: 5964 Дата регистрации: 23.03.2007 |
Ты выложи всю БД, а мы потренируемся Иначе на чем тестить?
|
Re: Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
Да пожалуйста!
Только файл получился 361Кб - к теме не прикрепится - выложу на файлообменник. ifolder.ru В архиве 2 файла: t0 - создаёт таблицы и индексы t1 - производит вставку данных Ну и раз уж выложил все данные то придётся небольшое описание сделать.
Исправлено 1 раз(а). Последнее : Extortioner, 04.10.11 07:51 |
Re: Запрос - спортивный интерес | |
---|---|
medstrax Забанен Сообщений: 5964 Дата регистрации: 23.03.2007 |
Эх, все равно померяться письками не получится. На каком железе сравнивать скорость запросов? Можно ведь всю БД кинуть в рам-диск например...
|
Re: Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
Вовсе не обязательно мериться письками на одном и том же железе - выполните мой первоначальный запрос на моей базе - вы получите какое-то число секунд, мой результат вы знаете, выполнив ещё пару запросов вы сможете определить на сколько ваше железо производительнее моего. |
Re: Запрос - спортивный интерес | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если результат зависит от порядка следования таблиц в запросе, при том без всяких хинтов, это лишь говорит о том что оптимизатор в твоей СУБД крайне убогий. Даже в фоксе как правило (можно судить по косвенным признакам) порядок следования таблиц/подзапросов не сильно влияет на результат - ну, конечно, если не использовать хинт FORCE.
Кстати, при переводе на фокс (все числовые поля в обычный 32-битный Integer) приведенные запросы с твоими данными отрабатывают у меня быстрее чем за 1.5 секунды. БОльшая DBF занимает всего то чуть более 4.5Мб. На оракле (да, не спорю, сервер достаточно мощный) ВСЕ 3 приведенных стандартных запроса (кроме использующего аналитическую функцию) выполняются (и выдают результат - что для данного запроса есть существенная часть времени) за абсолютно одинаковое время (примерно 1 секунду) - при том оптимизатор (что вполне логично) строит для них абсолютно идентичные планы исполнения. Запрос с аналитической функцией выполняется несколько быстрее, он более оптимален с точки зрения доступа к данным (всего 2 полных сканирования обоих таблиц, против 4-х сканирований для остальных запросов), однако несколько тяжелее по затратам CPU и памяти. Для некоторой оптимизации можно предложить индекс по TBL_NUM_NP_ORDER(ID_ORDER, BASE_NUM) - он позволит немного улучшить как стандартный запрос, так и запрос с аналитикой (т.к. по сути только эти 2 поля из таблицы и нужны в запросе) - ну и практически нулевая польза от индекса по TBL_NUM_NP_ISSUE(BASE_NUM, NUM_NEWSPAPER) - просто потому что сама таблица очень маленькая. Однако, ситуация может существеннейшим образом изменится (и скорость работы, и планы исполнения тоже кардинально поменяются), если в запрос будет добавлено условие - например WHERE tbno.id_order < 100. По логике задачи, я думаю, запрос с ограничением того или иного рода более логичен, чем запрос всего-всего-всего ------------------ WBR, Igor |
Re: Запрос - спортивный интерес | |
---|---|
Extortioner Автор Сообщений: 854 Откуда: Новосибирск Дата регистрации: 06.10.2005 |
Да, Игорь, появление индекса TBL_NUM_NP_ORDER(ID_ORDER, BASE_NUM) позволило отыграть некоторое количество времени.
Ну а по поводу появления Where - естественно, это же ведь только небольшая часть большого запроса, в котором происходит объединение 7ми таблиц Просто одним из факторов тормозящих выполнение этого большого запроса был этот запрос. Теперь благодаря этому обсуждению и вам в частности запрос стал работать быстрее. Спасибо за подробный анализ задачи. Ну а по поводу оптимизатора FireBird - думаю, что я просто не умею его готовить Исправлено 1 раз(а). Последнее : Extortioner, 04.10.11 20:10 |
© 2000-2024 Fox Club  |