Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Дмитрий
- Сообщения: 127
- Зарегистрирован: 26 окт 2004, 11:05
Сообщение
Дмитрий » 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. Индекс начинает хорошо работать при занесении данных в это поле.
Вот в этом и была проблема.