powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
4 сообщений из 4, страница 1 из 1
ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
    #37472886
Morry_ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла мысль перетащить базу со старого ASA 7.0 Win но новую платформу 12 Linux x32. (осторожно много букав дальше :)
В базе используется внешняя библиотека реализующая функции DES криптования. Разобравшись с новым интерфейсом внешних вызовов сделал под Linux нужную библиотеку, но при тестах оказалось что вызов внешней функций теперь значительно медленнее чем это было при старом интерфейсе.
В моем случае это катастрофично медленно. Если при единичном вызове с этой задержкой еще можно мерится, то при вызове криптования одного поля на выборке в 10-20тыс записей фетчь результата занимает уже десятки секунд. А в рабочем режиме мне нужно такое криптование делать по 4-6 полям на выборке в 100-300 тыс за раз.
Выносить функцию криптования на клиентскую часть также невозможно, так как существует требования, что открытые данные не должны покидать защищенного хранилища (

В ходе экспериментов обнаружил что тормозит именно новый интерфейс передачи данных/вызова функций из библиотек. Т.к. написав тестовую функцию которая получив входные данные тут же передает их на выход получил те же самые задержки.
Тесты проводил на последних билдах ASA 11 и 12 под ubuntu 32, и на ASA 12 под win 32. Причем использование старого интерфейса на ASA 12 под win 32 работает также быстро как и раньше а новый тормозит также как и на линухе.

Вопрос в том есть ли хоть какие то возможности или методы ускорить вызов? Возможно я что-то не досмотрел в документации или в реализации библиотеки. Может кто-то с таким боролся.

Ниже коды функций

Объявление процедуры в базе:

Код: plaintext
1.
ALTER PROCEDURE "DBA"."dll_Encrypt"( inout D char( 16 ),in K char( 16 ) ) no result set
external name 'xp_des_encrypt@libsacrypt.so' language C_ESQL32

Код функции используемой в запросах:

Код: plaintext
1.
2.
3.
4.
5.
6.
ALTER FUNCTION "DBA"."Encrypt"(in D char( 16 ),in K char( 16 ))
returns char( 16 )
begin
  call DBA.dll_Encrypt(D,K);
  return(D)
end

С-ишная функция в библиотеке построена на базе примера в самплах

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
_VOID_ENTRY xp_des_encrypt( an_extfn_api *api, void *arg_handle ) {
  char *Data, *Key;
  an_extfn_value	arg;
  an_extfn_value	retval;

  if( !api->get_value( arg_handle,  1 , &arg ) || (arg.data == NULL) ) {
    return;
  } else {
    Data = (char *)arg.data;
  }

  if( !api->get_value( arg_handle,  2 , &arg ) || (arg.data == NULL) ) {
    return;
  } else {
    Key = (char *)arg.data;
  }
  
//  des_encrypt(Data, Key); /*вызов криптования закоментарен на время тестов*/
  
  retval.type = DT_FIXCHAR;
  retval.data = Data;  //возвращаем тоже что приняли
  retval.piece_len = retval.len.total_len = DES_LEN;
  api->set_value( arg_handle,  0 , &retval,  0  );
  
  return;  
};
...
Рейтинг: 0 / 0
ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
    #37473643
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может быть сразу UDF как External обьявить, типа того:
Код: plaintext
1.
CREATE FUNCTION "DBA"."dll_Encrypt"( inout D char( 16 ),in K char( 16 ) ) returns char( 16 )
external name 'xp_des_encrypt@libsacrypt.so' language C_ESQL32
или даже так, если обращений к БД из функций нету:
Код: plaintext
1.
CREATE FUNCTION "DBA"."dll_Encrypt"( inout D char( 16 ),in K char( 16 ) ) returns char( 16 )
external name 'unix:xp_des_encrypt@libsacrypt.so'

P.S. И еще прогоните просто UDF с заремаренным вызовом внешней процедуры. Может быть это она вообще тормозит, а не вызов внешней функции?
...
Рейтинг: 0 / 0
ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
    #37474228
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSили даже так, если обращений к БД из функций нету:
Код: plaintext
1.
CREATE FUNCTION "DBA"."dll_Encrypt"( inout D char( 16 ),in K char( 16 ) ) returns char( 16 )
external name 'unix:xp_des_encrypt@libsacrypt.so'

+1. Для начала - убрать external environment. Тестить не на чем, ибо сижу на десятке, но по логике вещей external environment д.б. заметно тормознее in-process DLL.
...
Рейтинг: 0 / 0
ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
    #37477676
Morry_ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim2000, ASCRUS,
Спасибо, все верно, объявлять нужно без директивы "language", а также верно указывать номер параметра в сишной реализации
api->set_value(); Т.к. оказалось что в моем случае OUT параметр процедуры dll_Encrypt - 1.
При работе через external environment out параметр устанавливался таким образом:
api->set_value( arg_handle, 0 , &retval, 0 );
и процедура возвращала закриптованное значение, то при работе как native-call выходное значение нужно устанавливать так:
api->set_value( arg_handle, 1 , &retval, 0 );
иначе функция выполнялась но в оуте возвращала те же данные которые в нее и передавались.
Касательно же скорости, выполнение внешних функций в external environment, при условии что эти функции используются для преобразования полей в запросах просто не пригодна.
Для примера, select из 1ой таблицы с простым DES криптованием 2х полей при native-call вызове внешней функции выполнился за 25сек на 250K записях. А вызов того-же самого select-а но с вызовом внешней функции через external environment за те же 25сек смог обработать только 15-16К записей.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 11/12 как ускорить вызов внешних функций (external call interface) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]