Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 30 ноя 2004, 10:55
Вопрос 1:
Как FB/IB работаю с UDF?
1. Загружают DLL разово на момент подключения пользователя?
2. Загружают DLL разово при старте сервера?
3. Загружают DLL каждый раз при вызове UDF из этой DLL?
(сервер установлен по default-у)
Вопрос 2:
Написал свою DLL с UDF. В UDF корректно освобождаю память, но при работе с базой (select по 250 тысяцам записей с использованием UDF) у меня память неимоверно быстро растёт до 400 мегабайт (база ~420 мег). ОС WINDOWS 2003 Server
P.S.:
Работа со строками:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION CSTR
CHAR(30000),
CHAR(30000),
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'CHECKSTR' MODULE_NAME 'f'
Внутри просто PChar
Его нужно/нет как-то освобождать.
функция вида
Код: Выделить всё
function CHECKSTR(var S,P: PChar; var i,j: integer): integer;
begin
Проверка(S,P) и результат Result = (Integer ....)
end;
Помогите советом
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 30 ноя 2004, 17:44
WAKE-UP писал(а):Вопрос 1:
Как FB/IB работаю с UDF?
1. Загружают DLL разово на момент подключения пользователя?
нет. разово в момент вызова пользователем этой udf.
2. Загружают DLL разово при старте сервера?
нет. сервер сам ни к каким базам не коннектится, а udf объявлены в базах.
3. Загружают DLL каждый раз при вызове UDF из этой DLL?
нет, ибо это мазохизм.
Написал свою DLL с UDF. В UDF корректно освобождаю память, но при работе с базой (select по 250 тысяцам записей с использованием UDF) у меня память неимоверно быстро растёт до 400 мегабайт (база ~420 мег). ОС WINDOWS 2003 Server
Код: Выделить всё
DECLARE EXTERNAL FUNCTION CSTR
CHAR(30000),
CHAR(30000),
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'CHECKSTR' MODULE_NAME 'f'
где ты взял что надо параметры CHAR писать?
CSTRING надо, а не CHAR.
Внутри просто PChar
pchar это не CHAR.
Его нужно/нет как-то освобождать.
нет.
возьми в качестве примера
www.ibase.ru/download/safeudf.zip
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 30 ноя 2004, 18:52
Спасибо. До самой UDF я дошел сам, а вот с технологией загрузки - спасибо
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 01 дек 2004, 09:25
я не помню, описано это в документации или нет.
выгрузка, кстати, происходит когда этот пользователь закрывает коннект, в котором было обращение к udf. т.е. как обычно, стоит счетчик dll usage, которому делается +1 на каждый вызов udf, и -1 на каждый disconnect откуда был такой вызов.
про суперсервер и классик, надеюсь, объяснять не надо?

-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 01 дек 2004, 09:56
Пока нет

Я не знаю их отличия, предназначения и т.п. потому как пока не надо было. Стоит думаю почитать на эту тему. А так я вроде SS ставлю всё время

-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 01 дек 2004, 10:53
superserver - 1 процесс на всех пользователей. Classic - 1 процесс на 1 пользователя. Соответственно, все что написано выше, актуально только для SuperServer. потому что udf это обычная dll (shared library).
-
noisy
- Сообщения: 25
- Зарегистрирован: 27 окт 2004, 13:21
Сообщение
noisy » 06 апр 2005, 10:30
Не хочеться создавать новый топ..
У меня есть проблема с UDF DNVL из FBUDF.DLL.
DNVL возвращает всегда 0
например запрос по пустой таблице
select sum(P.PAY_SUM) from PAYMENT P
результат : <null>
select DNVL(sum(P.PAY_SUM),1) from PAYMENT P
результат : 0
select INVL(sum(P.PAY_SUM),1) from PAYMENT P
результат : 1
в чем дело?
проблему я решил заменой DNVL на ROUND из RFUNC
но как быть с DNVL
Windows XP SP2 Rus
FB 1.5.2
региональные параметры: Русский
-
dimitr
- Разработчик Firebird
- Сообщения: 888
- Зарегистрирован: 26 окт 2004, 16:20
Сообщение
dimitr » 06 апр 2005, 21:14
noisy писал(а):У меня есть проблема с UDF DNVL из FBUDF.DLL.
DNVL возвращает всегда 0
У меня все нормально. Сообщи тип столбца PAY_SUM и диалект базы.
ЗЫ. А COALESCE заюзать религия не позволяет?
-
noisy
- Сообщения: 25
- Зарегистрирован: 27 окт 2004, 13:21
Сообщение
noisy » 07 апр 2005, 10:16
сообщаю:
SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE TABLE PAYMENT (
PAY_DOC_ID NUMERIC(15,0) NOT NULL,
CUSTOMER_ID NUMERIC(15,0) NOT NULL,
PAYMENT_ID NUMERIC(15,0) NOT NULL,
SERV_ID NUMERIC(15,0) NOT NULL,
PAY_DATE DATE NOT NULL,
PAY_SUM NUMERIC(15,2) NOT NULL
);