Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
К сожалению я ее восстановил рестором.

 
Цитата(Deniz @  26.7.2010,  13:16 Найти цитируемый пост)
Со временем индексы "устаревают"

как понять что в базе есть устаревшие индексы, из за чего они "стареют"?

Добавлено через 2 минуты и 8 секунд
еще такой момент если я явно дописывал "сломавшемуся" запросу plan, то он начинал правильно работать.

Автор: Deniz 26.7.2010, 11:11
Цитата(Frees @  26.7.2010,  12:57 Найти цитируемый пост)
как понять что в базе есть устаревшие индексы, из за чего они "стареют"?
Посмотри вот http://www.ibase.ru/dpopov/plan-intro.html статью, точнее в ней параграф "Автоматическое планирование"

Добавлено через 3 минуты и 6 секунд
PS: ручное "планирование" не есть гуд, данные (может и метаданные) меняются и оптимизатор может со временем предложить лучший план.

Автор: Frees 26.7.2010, 11:38
Цитата(Deniz @  26.7.2010,  14:11 Найти цитируемый пост)
Посмотри вот эту статью

получается изменения плана запроса это все таки фича...

актуальность статьи 93 год,она все еще верна? все еще проблема решается только принудительным обновление статистики индекса?

как с этим в последних версиях firebird?


Автор: Deniz 26.7.2010, 12:52
Цитата(Frees @  26.7.2010,  13:38 Найти цитируемый пост)
как с этим в последних версиях firebird?
про сильно последние версии сказать не могу, но в 1.5 периодически статистику собираю.

Автор: Akella 26.7.2010, 13:50
Цитата(Frees @  26.7.2010,  11:38 Найти цитируемый пост)
все еще проблема решается только принудительным обновление статистики индекса?

да, к сожалению, программист сам должен периодически обновлять статистику индексов.
Я в своих приложениях даже такую команду вставляю.
дельфи + FibPlus
Код

procedure TfmMain.actServiceDBExecute(Sender: TObject);
Var
 SQL:TstringList;
 fq : TpFIBQuery;
begin
  fq  := TpFibQuery.Create(nil);
  SQL := TstringList.Create;
  try
    fq.Database := DM.fibDB;
    fq.Transaction := DM.fibTransRead;

    if not fq.Transaction.InTransaction then fq.Transaction.StartTransaction;

    fq.SQL.Add( 'select RDB$INDEX_NAME from RDB$INDICES');
    fq.GoToFirstRecordOnExecute := true;
    fq.ExecQuery;
    while not fq.Eof do  begin
      sql.Add('SET STATISTICS INDEX '+fq.FieldByName('RDB$INDEX_NAME').AsString+';');
      fq.Next;
    end;
    ExecMyQuery(sql, True);

  finally
    FreeAndNil(fq);
    FreeAndNil(sql);
  end;
end;


Автор: Frees 26.7.2010, 13:56
Цитата(Akella @  26.7.2010,  16:50 Найти цитируемый пост)
Я в своих приложениях даже такую команду вставляю.

и когда эту акцию выполняешь, или это кнопка для пользователя (типо "нажми если тормозит")?

а время выполнения этого кода на много быстрее чем бекап - ресторе?

подумаваю о кнопке  "бекап - рестор"



Автор: Deniz 26.7.2010, 14:52
Цитата(Frees @  26.7.2010,  15:56 Найти цитируемый пост)
а время выполнения этого кода на много быстрее чем бекап - ресторе?
сбор статистики по всем индексам намного быстрее.
Цитата из IBAnalyst
Цитата
Сбор статистики по всем индексам может занять около 2-х минут на базе размером в 2 гига
как-то так звучало.

Добавлено через 2 минуты и 51 секунду
Цитата(Frees @  26.7.2010,  15:56 Найти цитируемый пост)
и когда эту акцию выполняешь, или это кнопка для пользователя (типо "нажми если тормозит")?
В том же IBAnalyst можно примерно отследить разницу в индексах (реально и текущее) и решить как часто запускать.
Далее в автомате настроить такой запрос по ночам, хоть каждый день.

Цитата(Frees @  26.7.2010,  15:56 Найти цитируемый пост)
подумаваю о кнопке  "бекап - рестор"
это нужно с умом делать.

Автор: Akella 26.7.2010, 18:20
Цитата(Frees @  26.7.2010,  13:56 Найти цитируемый пост)
и когда эту акцию выполняешь, или это кнопка для пользователя (типо "нажми если тормозит")?

кнопка для пользователя, но всё хочу реализовать в базе какую-то таблицу, где хранить кол-во добавленных, отредактированных, удалённых записей (можно на триггеры повесить), и через каждые, например, 100 записей в фоне выполнять пересчёт индексов.

Цитата(Frees @  26.7.2010,  13:56 Найти цитируемый пост)
а время выполнения этого кода на много быстрее чем бекап - ресторе?

конечно, если небольшая база, то ваще секунду, и пользователей не нужно отключать

Автор: Frees 26.7.2010, 18:29
меня бы больше устроило что бы оптимизатор не менял планов. если забить таблицу со статистико нулями, оптимизатор  должен будет действовать всегда одинаково. или это тупиковая идея?

Автор: Deniz 27.7.2010, 05:31
Цитата(Frees @  26.7.2010,  20:29 Найти цитируемый пост)
меня бы больше устроило что бы оптимизатор не менял планов. если забить таблицу со статистико нулями, оптимизатор  должен будет действовать всегда одинаково. или это тупиковая идея?
Это не правильно.
Возможно в след. версиях это поведение как-то изменят.
В любом случае, надо же делать периодический 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
Цитата(Deniz @  27.7.2010,  08:31 Найти цитируемый пост)
Это не правильно.

может и не правильно но как минимум будет предсказуемое поведение.

Цитата(Deniz @  27.7.2010,  08:31 Найти цитируемый пост)
В любом случае, надо же делать периодический backup

бекап надо, но то что надо делать еще и рестор не всем клиентам очевидно, поэтому и думал сделать бекап рестор в один клик ,тут много своих проблем.

пока есть 2 варианта:
1) делать SET STATISTICS при бекапе, тут опять плохо что многие не делают бекап а просто сохраняют копию файла бд (как не объясняй что это плохо)

2) кнопка для пользователя, тут другой минус пользователю сложно объяснить зачем он должен ее нажимать



Автор: Akella 27.7.2010, 07:16
я так понимаю, что ты не читал моё сообщение?
Цитата(Akella @  26.7.2010,  18:20 Найти цитируемый пост)
реализовать в базе какую-то таблицу, где хранить кол-во добавленных, отредактированных, удалённых записей (можно на триггеры повесить), и через каждые, например, 100 записей в фоне выполнять пересчёт индексов.


Автор: Deniz 27.7.2010, 07:23
Frees, тогда вопрос про систему.
Что это вообще за система? Интересуют тех. информация (Размер БД, кол-во записей, кол-во пользователей и т.д.)
Судя по последнему посту, база отдается в другие руки и нет возможности ее админить. тогда можно предусмотреть по выходу из программы запускать скрипт, который сделает backup и сбор статистики, или при установки клиента/сервера добавить задачу в шедулер, в общем вариантов много.

Автор: Frees 27.7.2010, 07:39
Цитата(Akella @  27.7.2010,  10:16 Найти цитируемый пост)
я так понимаю, что ты не читал моё сообщение?

ну да точно  - это 3 вариант. только может создать генератор дергать его в тригерах  таблиц, при старте смотреть на значение генератора если оно больше N то обновить статистику обнулить генератор....



Цитата(Deniz @  27.7.2010,  10:23 Найти цитируемый пост)
Судя по последнему посту, база отдается в другие руки и нет возможности ее админить

так и есть размер базы неизвестен, какие таблицы будут больше заполняться неизвестно, гарантии что бекап будет делаться средствами нашего ПО нет.

Автор: Deniz 27.7.2010, 08:06
Цитата(Frees @  27.7.2010,  09:39 Найти цитируемый пост)
так и есть размер базы неизвестен, какие таблицы будут больше заполняться неизвестно, гарантии что бекап будет делаться средствами нашего ПО нет.
А как все это хозяйство устанавливается? А примерные данные?

Автор: Frees 27.7.2010, 08:31
Цитата(Deniz @  27.7.2010,  11:06 Найти цитируемый пост)
А как все это хозяйство устанавливается? А примерные данные?

инсталятор. Намекаешь на то, что бы добавить задачу в шедулер и из нее обслуживать БД 

Цитата(Deniz @  27.7.2010,  11:06 Найти цитируемый пост)
А примерные данные?

порядка 100 таблиц, клиенту поставляются пустыми, дальше кто на что горазд. Хотя я примерно знаю какие таблицы будут постоянно рости а какие нет, исходя из этого запросы и оптимизировал.

Автор: Deniz 27.7.2010, 09:17
Цитата(Frees @  27.7.2010,  10:31 Найти цитируемый пост)
инсталятор. Намекаешь на то, что бы добавить задачу в шедулер и из нее обслуживать БД 
давно уже намекал, но ...
Цитата(Deniz @  26.7.2010,  16:52 Найти цитируемый пост)
Далее в автомате настроить такой запрос по ночам, хоть каждый день.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)