Проблемы с fetch!

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Проблемы с fetch!

Сообщение Дмитрий » 29 окт 2004, 13:12

Добрый день!
Имеем IB 6.5 на NT. Проблема в следующем. Есть запрос, кторый возвращает большое количество записей. Когда в IBExpert-е говорю fetch all все виснет после 40000 записей. Пробовал из ISQL, с других машин - то же самое. В чем проблема?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 29 окт 2004, 13:35

План запроса какой? Сколько записей должно вернуться всего? Если не делать fetch all, а пролистывать набор данных в IBE вручную, тоже виснет?

Гость

Сообщение Гость » 29 окт 2004, 14:09

План довольно сложный, если надо, могу разместить.
Вернуться должно около 60000 записей.
Листать вручную не пробовал, но если нажать на кнопочку "последняя запись", то виснет.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 29 окт 2004, 14:33

Тип верхней операции плана какой? SORT / JOIN / MERGE?

Гость

Сообщение Гость » 29 окт 2004, 14:36

Адаптированный план
PLAN (DOC_HISTORY INDEX (DOC_HIS2))(DIV_99 INDEX (DV99_8))JOIN (DOC_HISTORY INDEX (DOC_HIS3,DOC_HIS2),ACC_HISTORY INDEX (AH_1))(DIV_99 INDEX (DV99_8)

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 29 окт 2004, 15:02

Вьюхи что-ль с процедурами используются в запросе? На первый взгляд, нормальный план. То, что фетч будет медленный - факт, но виснуть не должно. Если написать select count(*) from <остаток запроса>, то виснет или отрабатывает?

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 29 окт 2004, 15:10

Ну да, запрос из одной процедуры. Отлаживаю, потому что программа, ее использующая, виснет.

Фетч до 40000 достаточно быстрый, а потом - виснет.

Пробовал написать select count(*) from <остаток запроса>, но не дождался результата (за 30 минут он не выполнился).

Странное что-то творится.

olegenty
Сообщения: 5
Зарегистрирован: 31 окт 2004, 14:31

Сообщение olegenty » 31 окт 2004, 15:52

не поленись докачать компоненты gb_Datasets и заюзать их, либо, если твои сотни тысяч не визуализируются, в цикле фетчить по 1000 записей, т.е. написать запрос с условием, и потом менять условие по типу WHERE SOME_KEY > LAST_VALUE_OF_KEY...
если все твои записи - результат хранимой процедуры, то целесообразно именно её сделать условной.

касаемо зависаний - у тебя клиент, скорее всего, переходит в режим перманентного свопа, т.е. вся опреативка занята, и он офигенно шуршит винтом. предложенные тебе варианты эту проблему легко решают.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 01 ноя 2004, 11:46

Раз count() тоже виснет, то клиент тут не причем, проблема в сервере. Сколько хоть он памяти жрет в момент зависания?

Я бы обратил пристальное внимание на исходники процедуры.

olegenty
Сообщения: 5
Зарегистрирован: 31 окт 2004, 14:31

Сообщение olegenty » 01 ноя 2004, 14:43

пардон, я неправ.
тогда действительно только сорцы хранимки.
пройдись по ней анализатором производительности...

Гость

Сообщение Гость » 01 ноя 2004, 15:17

Всем спасибо за ответы!
Проблема решена. Все дело было в "плохом" индексе. В его состав входит поле, которое в начальном состоянии NULL. Индекс начинает хорошо работать при занесении данных в это поле.
Вот в этом и была проблема.

Ответить