| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Firebird, Interbase > Вопрос по оптимизатору запросов |
| Автор: Frees 26.7.2010, 08:50 |
| Есть 2 Базы с одинаковыми метаданными, отличаются только данными. Одна из Баз стала сильно тормозить, выяснилось что в сохраненке у 1 запроса изменился план, из за чего и появились тормоза. По какой причине запрос мог изменить свой план? баг или фича оптимизатора запросов? зы Бекап/ресторе базы вернул изначальный план. firebird 2.0.3 |
| Автор: Deniz 26.7.2010, 10:08 |
| Нужно было сделать пересчет статистики индексов. |
| Автор: Frees 26.7.2010, 10:12 |
| Deniz, поясни, зачем пересчет? |
| Автор: Deniz 26.7.2010, 10:16 |
| Со временем индексы "устаревают" и оптимизатор может перестать использовать индекс. Если осталась старая БД с тормозами, проверь поможет ли пересчет индексов. |
| Автор: Frees 26.7.2010, 10:57 |
| К сожалению я ее восстановил рестором. как понять что в базе есть устаревшие индексы, из за чего они "стареют"? Добавлено через 2 минуты и 8 секунд еще такой момент если я явно дописывал "сломавшемуся" запросу plan, то он начинал правильно работать. |
| Автор: Frees 26.7.2010, 11:38 |
получается изменения плана запроса это все таки фича... актуальность статьи 93 год,она все еще верна? все еще проблема решается только принудительным обновление статистики индекса? как с этим в последних версиях firebird? |
| Автор: Deniz 26.7.2010, 12:52 |
| про сильно последние версии сказать не могу, но в 1.5 периодически статистику собираю. |
| Автор: Akella 26.7.2010, 13:50 | ||||
да, к сожалению, программист сам должен периодически обновлять статистику индексов. Я в своих приложениях даже такую команду вставляю. дельфи + FibPlus
|
| Автор: Frees 26.7.2010, 13:56 |
и когда эту акцию выполняешь, или это кнопка для пользователя (типо "нажми если тормозит")? а время выполнения этого кода на много быстрее чем бекап - ресторе? подумаваю о кнопке "бекап - рестор" |
| Автор: Deniz 26.7.2010, 14:52 | ||||||
Цитата из IBAnalyst
Добавлено через 2 минуты и 51 секунду
Далее в автомате настроить такой запрос по ночам, хоть каждый день. это нужно с умом делать. |
| Автор: Akella 26.7.2010, 18:20 | ||||
кнопка для пользователя, но всё хочу реализовать в базе какую-то таблицу, где хранить кол-во добавленных, отредактированных, удалённых записей (можно на триггеры повесить), и через каждые, например, 100 записей в фоне выполнять пересчёт индексов.
конечно, если небольшая база, то ваще секунду, и пользователей не нужно отключать |
| Автор: Frees 26.7.2010, 18:29 |
| меня бы больше устроило что бы оптимизатор не менял планов. если забить таблицу со статистико нулями, оптимизатор должен будет действовать всегда одинаково. или это тупиковая идея? |
| Автор: Deniz 27.7.2010, 05:31 | ||
Возможно в след. версиях это поведение как-то изменят. В любом случае, надо же делать периодический backup так вот в скрипте (там же где backup) можно собрать статистику по индексам (написав небольшую консольную программку). Добавлено через 10 минут и 46 секунд В дополнение несколько ссылок: http://www.firebirdsql.su/doku.php?id=set_statistics http://www.ibase.ru/devinfo/sysqry.htm#3 Для перестройки индекса: http://www.firebirdsql.su/doku.php?id=alter_index |
| Автор: Frees 27.7.2010, 06:35 |
может и не правильно но как минимум будет предсказуемое поведение. бекап надо, но то что надо делать еще и рестор не всем клиентам очевидно, поэтому и думал сделать бекап рестор в один клик ,тут много своих проблем. пока есть 2 варианта: 1) делать SET STATISTICS при бекапе, тут опять плохо что многие не делают бекап а просто сохраняют копию файла бд (как не объясняй что это плохо) 2) кнопка для пользователя, тут другой минус пользователю сложно объяснить зачем он должен ее нажимать |
| Автор: Akella 27.7.2010, 07:16 | ||
я так понимаю, что ты не читал моё сообщение?
|
| Автор: Deniz 27.7.2010, 07:23 |
| Frees, тогда вопрос про систему. Что это вообще за система? Интересуют тех. информация (Размер БД, кол-во записей, кол-во пользователей и т.д.) Судя по последнему посту, база отдается в другие руки и нет возможности ее админить. тогда можно предусмотреть по выходу из программы запускать скрипт, который сделает backup и сбор статистики, или при установки клиента/сервера добавить задачу в шедулер, в общем вариантов много. |
| Автор: Frees 27.7.2010, 07:39 | ||
ну да точно - это 3 вариант. только может создать генератор дергать его в тригерах таблиц, при старте смотреть на значение генератора если оно больше N то обновить статистику обнулить генератор....
так и есть размер базы неизвестен, какие таблицы будут больше заполняться неизвестно, гарантии что бекап будет делаться средствами нашего ПО нет. |
| Автор: Deniz 27.7.2010, 08:06 |
| А как все это хозяйство устанавливается? А примерные данные? |
| Автор: Frees 27.7.2010, 08:31 |
инсталятор. Намекаешь на то, что бы добавить задачу в шедулер и из нее обслуживать БД порядка 100 таблиц, клиенту поставляются пустыми, дальше кто на что горазд. Хотя я примерно знаю какие таблицы будут постоянно рости а какие нет, исходя из этого запросы и оптимизировал. |
| Автор: Deniz 27.7.2010, 09:17 | ||
|