powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase SA 12: Скорость выполнения запроса в UDF и в живую
3 сообщений из 3, страница 1 из 1
Sybase SA 12: Скорость выполнения запроса в UDF и в живую
    #38435803
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All,

Есть некий запрос по таблице. Одно из полей этого запроса представляет собой сложный подзапрос с парой if exists().
Этот подзапрос почти не влияет на общую скорость выборки. Но смотрится такой запрос не очень красиво.
Поэтому я решил поместить подзапрос (практически ничего в нем не меняя) внутрь DETERMINISTIC UDF.
После этого общая скорость выборки упала почти в два раза.

Вопрос: Почему упала скорость ? Это SA12 так медленно вызывает UDF или сама UDF почему то не оптимизируется или тут есть еще какие то причины ?
...
Рейтинг: 0 / 0
Sybase SA 12: Скорость выполнения запроса в UDF и в живую
    #38435851
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это код запроса с подзапросом:
Код: sql
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.
27.
select
 DOCUMENTS.IDENTITY,
 TEMPLATETYPECODE,
 BRANCHPARENT,
 DOCUMENTS.DOCDATE,
 DOCUMENTS.DOCNUMBER_N,
 DOCUMENTS.DOCNUMBER_C,
 FORMNUMBER, 
 FORMSERIES,
 DOCTYPECODE,
 (if not exists(select * from dba.ACCEPTDOCDISPATCHLIST 
                   where (DOCUMENTCODE = DOCUMENTS.IDENTITY) and
                         (WORKERCODE in (select CHECKCLIENT.WORKERCODE from dba.CHECKCLIENT
                                         where (USERNAME = current user) and (RESTRICTLIST like '%2%')))) then
     '1'
   else 
     if exists(select * from dba.MARKREADACCEPTLIST
               join dba.ACCEPTDOCDISPATCHLIST on (ACCEPTDOCDISPATCHLIST.DOCUMENTCODE = DOCUMENTS.IDENTITY)
               where (MARKREADACCEPTLIST.DOCUMENTCODE = DOCUMENTS.IDENTITY) and (MARKREADACCEPTLIST.USERNAME = current user) and
                     (WORKERCODE in (select CHECKCLIENT.WORKERCODE from dba.CHECKCLIENT
                                     where (CHECKCLIENT.USERNAME = current user) and (CHECKCLIENT.RESTRICTLIST like '%2%')))) then
       '1'
     else
       '2'
     endif endif) as FLAG2,
 SUBSTR(DOCHEADER, 1, 200) as DOCHEADER
from dba.DOCUMENTS



Это код запроса в вынесением подзапроса в UDF:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
 DOCUMENTS.IDENTITY,
 TEMPLATETYPECODE,
 BRANCHPARENT,
 DOCUMENTS.DOCDATE,
 DOCUMENTS.DOCNUMBER_N,
 DOCUMENTS.DOCNUMBER_C,
 FORMNUMBER, 
 FORMSERIES,
 DOCTYPECODE,
 dba.GetFlagForDocument(DOCUMENTS.IDENTITY, DOCUMENTS.DOCSTATE) as FLAG,
 SUBSTR(DOCHEADER, 1, 200) as DOCHEADER
from dba.DOCUMENTS



Это сама UDF:
Код: sql
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE FUNCTION "DBA"."GetFlagForDocument"(in nDocumentCode integer, in nDocState integer)
RETURNS char(1)
DETERMINISTIC
BEGIN

 declare cReturn char(1);

 set cReturn = '';

 if nDocState = 2 then

   if not exists(select * from dba.ACCEPTDOCDISPATCHLIST 
                   where (DOCUMENTCODE = nDocumentCode) and
                         (WORKERCODE in (select CHECKCLIENT.WORKERCODE from dba.CHECKCLIENT
                                         where (USERNAME = current user) and (RESTRICTLIST like '%2%')))) then
     set cReturn = '1'
   else 

     if exists(select * from dba.MARKREADACCEPTLIST
               join dba.ACCEPTDOCDISPATCHLIST on (ACCEPTDOCDISPATCHLIST.DOCUMENTCODE = MARKREADACCEPTLIST.DOCUMENTCODE)
               where (MARKREADACCEPTLIST.DOCUMENTCODE = nDocumentCode) and (MARKREADACCEPTLIST.USERNAME = current user) and
                     (WORKERCODE in (select CHECKCLIENT.WORKERCODE from dba.CHECKCLIENT
                                     where (CHECKCLIENT.USERNAME = current user) and (CHECKCLIENT.RESTRICTLIST like '%2%')))) then
       set cReturn = '1'
     else
       set cReturn = '2'
     end if;

   end if;

 end if;

 return cReturn;

END
...
Рейтинг: 0 / 0
Sybase SA 12: Скорость выполнения запроса в UDF и в живую
    #38436126
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Вопрос: Почему упала скорость ? Это SA12 так медленно вызывает UDF или сама UDF почему то не оптимизируется или тут есть еще какие то причины ?В варианте с подзапросом сервер может обрабатывать его для нескольких строк главного запроса за раз а потом уже брать значения из кэша. В случае с UDF ты потребовал отдельных запусков подзапроса для каждой строки внешнего запроса.

Вариантов решения два:
Можно вынести большой-страшный подзапрос во вьюшку.
Можно сделать выборку в во временную таблицу а потом читать ее из главного запроса.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase SA 12: Скорость выполнения запроса в UDF и в живую
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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