Страница 1 из 1

Время выполнения запроса

Добавлено: 29 окт 2007, 10:17
neuro
Периодически (раз в 2 часа) в табличку переливаются данные из внешних OLTP-систем (делается с помощью IBPump-а). Предварительно удаляются из таблицы записи, датированные текущим месяцем и заливаются обновленные, тоже за текущий месяц (положим 100 тыс. записей). Таким образом осуществляется поддержание актуального состояния записей. Затем из этой таблички запросами делаются отчеты (запросы простые select * from Table) очередность выполнения запросов, формирующих отчеты фиксирована, и записана в BAT-файле. Выборок много, с разными фильтрами, есть выборки, пролетающие за секунды есть и подольше. Есть пара выборок (возвращают 300-500 тыс записей) с числом полей до 30, по которым происходит странная ситуация (систематически!):

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

Подскажите пожалуйста как побороть эту напасть и сделать так, чтобы запрос выборки не провисал на час?
Подскажите где собака порылась. Такое впечатление что первое выполнение длинного запроса происходит без использования индексов.

Условия: FB 1,5. Заливка :Ibpump 3,4, выборки для создания отчетов при помощи ODBC 1.02.00.69 Phoenix. таблица индексирована по полям, используемым в фильтрах, изменение очередности выполнения запросов не влияет на скорость их выполнения.

Добавлено: 29 окт 2007, 10:51
mdfv
Может таки это мусор?
У меня тоже после больших заливок/апдейтов/удалений долго большой подсчет выполняется.

Добавлено: 29 окт 2007, 11:12
neuro
В пятницу утром подняли базу из ночного бекапа, сразу попробовали сформировать эти большие отчеты – пролетели за 3 минуты, потом запустили переливку данных за последний месяц, после этого сразу повторили генерацию больших отчетов – шла примерно 1 час… :cry:

Добавлено: 29 окт 2007, 11:16
mdfv
IBAnalist-ом посмотреть состояние после загрузки, но перед формированием отчета.

Добавлено: 29 окт 2007, 11:58
Slavik
neuro писал(а):...потом запустили переливку данных за последний месяц, после этого сразу повторили генерацию больших отчетов – шла примерно 1 час… :cry:
Типичное поведение после массовых update/delete при кооперативной сборке мусора. Соответственно читать про неё любимую. Кстати, стоило бы указать, в каком режиме (CS/SS) используется сервер.

Re: Время выполнения запроса

Добавлено: 29 окт 2007, 12:13
WildSery
neuro писал(а):Предварительно удаляются из таблицы записи, датированные текущим месяцем и заливаются обновленные, тоже за текущий месяц (положим 100 тыс. записей).
Мусор, однозначно.
Во-первых, советую не убить/залить заново, а update. При условии, что меняется не всё, даст выигрышь.
Во-вторых, можно отчёты пускать в транзакции no_garbage_collect, а собирать его sweep'ом в специально выделенное ночером время.

Добавлено: 30 окт 2007, 11:19
neuro
Коллеги, спасибо за подсказки,
Прочитал и про мусор в базе и про кооперативную сборку этого мусора.
Для чистоты эксперимента поднял базу из бекапа, отчеты на этой базу сгенерилась очень быстро (мусора – то нет), затем запустил полный цикл, с перекачкой данных за текущий месяц и затем обновление отчетов, заняло все примерно 2 часа (отчеты генерились уже меденно, так как мусор уже появился после первой же перекачки).
В соответствии с тем, что прочитал про мусор, в цикл после перекачки данных добавил запрос вида select count(*) from tab и вот что получилось: перекачка данных прошла как обычно, затем о-очень долго выполнялся запрос select count(*) from tab и затем быстро сгенерились отчеты. Итого весь цикл > 2 часов. :cry:

Ps сервер работает в режиме CS

Добавлено: 30 окт 2007, 12:04
Ivan_Pisarevsky
несколько рекомендаций, можно попробовать, возможно где-то будет выигрыш:
1. попробовать двойку, со времен полуторки механизм сбора мусора сильно правили.
2. собирать мусор gfix-ом
3. заблокировать сбор мусора, версий, конечно, наплодится, но возможно это будет меньшее зло. Или не удалять записи, а только метить на удаление и отбрасывать такие записи фильтром в селектах.
4. купить рэйд адаптор с набортным кэшем включить его на запись и решить проблему ломовым железом. При сборке мусора упор явно идет в диски.
5. drop/create table или b/r хотя это изврат полнейший.

Добавлено: 30 окт 2007, 15:48
neuro
заитересовал параметр no_garbage_collect
подскажите пожалуйста, можно ли его как-нить использовать если коннект к базе идет через ODBC?

Добавлено: 31 окт 2007, 20:42
kdv
можно ли его как-нить использовать если коннект к базе идет через ODBC?
нет.

Добавлено: 01 ноя 2007, 11:07
WildSery
NB: И с использованием BDE тоже нет :cry: