Ошибка BLR

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

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

Ответить
Birdy
Сообщения: 4
Зарегистрирован: 19 апр 2005, 11:55

Ошибка BLR

Сообщение Birdy » 19 апр 2005, 11:59

Доброго времени суток!

Возникла проблема:

Создаю хранимую процедуру в базе(Сервер Yaffil, работаю череж IBExpert). В процедуре куча селектов+операций с данными. Итого обьем сохраненной процедуры в текстовом файле равен 38945 байт.

Проблема заключается в следующем:
При попытке откомпилить процедуру ни одной ошибки не вылетает, но при коммит - вылетает ошибка

"Invalid token.
invalid request BLR at offset 26131.
Context allready in use (BLR error).

Changes will be rolled back... "

При этом если я укорачиваю процедуру (делаю размер в тексте меньше 26000) - то все нормально компилится.

Вопрос - что сделать и почему это происходит? Нашел фак - в нем говорится что размер процедур не более 48к, у меня меньше....
Подскажите плз, а то не хочется разбивать на подпроцедуры...

Заранее благодарен!

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 19 апр 2005, 12:05

Размер BLR тоже ограничен. Точную цифру не помню, но меньше 64К. Так что дроби на вызовы.

Birdy
Сообщения: 4
Зарегистрирован: 19 апр 2005, 11:55

Сообщение Birdy » 19 апр 2005, 12:09

Merlin

Мда, жаль, я уже сам не могу понять где там что :)

Буду дробить.

Спасибо.

DSKalugin
Сообщения: 212
Зарегистрирован: 27 окт 2004, 13:39

Re: Ошибка BLR

Сообщение DSKalugin » 19 апр 2005, 12:10

Birdy писал(а):Итого обьем сохраненной процедуры в текстовом файле равен 38945 байт.
Ну прямо экзотика какая-то. Зачем такие большие ХП делать???
Программу писать надо не на SQL, а на языках программирования.
практика показывает, что отдельные маленькие запросы в общем работают быстрей ежели загрузить сервер одной огромной ХП.
Birdy писал(а): При этом если я укорачиваю процедуру (делаю размер в тексте меньше 26000) - то все нормально компилится.
!
не удивительно, т.к. ошибка дальше на стр 26131, а ты ее просто отсекаешь

Birdy
Сообщения: 4
Зарегистрирован: 19 апр 2005, 11:55

Сообщение Birdy » 19 апр 2005, 12:17

DSKalugin

Куча мелких запросов (в процедуре арифметических операций строчек 10) это порядка 150-200 для каждой записи в таблице - потом сложить/вычесть/поделить, а потом в отчет запихнуть, я считаю что на слабой клиентской машине со слабой сеткой (10 мб) это сделается медленнее, чем ХП на нормальной машине выступающей сервером.

Хотя, будет время - сделаю и так и так - проверю что лучше..

А насчет строки - там нету ошибки в самой процедуре, это связано с размером процедуры, так как разбил на две чести - обе выполняются нормально.

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Re: Ошибка BLR

Сообщение sag » 19 апр 2005, 12:22

DSKalugin писал(а):Программу писать надо не на SQL, а на языках программирования.
практика показывает, что отдельные маленькие запросы в общем работают быстрей ежели загрузить сервер одной огромной ХП.
Хм. Практика. Все делать на клиенте (в том числе "жирные обработки" данных) и таскать тонны данных по сети?
Не надо обобщать. Всему свое применение.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 19 апр 2005, 12:41

Birdy писал(а):Merlin
Мда, жаль, я уже сам не могу понять где там что :)
Вот поэтому добрые люди и придумали процедуры :) Чтоб функции с однозначным назначением были обозримы и понятны, а не только для того, чтоб использовать один и тот же код в разных местах.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Ошибка BLR

Сообщение hvlad » 19 апр 2005, 14:22

Birdy писал(а):"Invalid token.
invalid request BLR at offset 26131.
Context allready in use (BLR error).

Changes will be rolled back... "
Кол-во контекстов ограничено - 255 штук.
Контекст - ссылка на таблицу, аггрегат, объединение.

IMHO это пора в FAQ

Birdy писал(а):Нашел фак - в нем говорится что размер процедур не более 48к, у меня меньше
Выкинуть этот FAQ.
Текст процедуры ограничен 64K, BLR - тоже 64К

Birdy
Сообщения: 4
Зарегистрирован: 19 апр 2005, 11:55

Сообщение Birdy » 19 апр 2005, 19:20

hvlad
Спасибо, понял в чем ошибка.

Лечится только одним - разбитием на несколько процедур.

Спасибо всем кто откликнулся!

Ответить