powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 10.0.1 Производительность функций
8 сообщений из 8, страница 1 из 1
ASA 10.0.1 Производительность функций
    #34932926
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток ALL!

Продолжаю изучать 10-ку.
Вот еще одна странность:

//Просто календарь. Дата, признак выходного дня, для теста заполнил
CREATE TABLE "branch"."t_calendar" (
"id_date" date NOT NULL,
"is_holiday" char(1) NOT NULL DEFAULT 'N',
PRIMARY KEY ( "id_date" ASC ));

select *, (select is_holiday from t_calendar cc where cc.id_date=c.id_date) as hol_1
into #tmp_02
from t_calendar c

Execution time: 0.063 seconds

Выносим подзапрос в функцию:
create function tmp02 (pid_date date)
returns char(1)
begin
declare i_tmp char(1);
set i_tmp= (select is_holiday from t_calendar where id_date=pid_date);
return i_tmp;
end;

select
*, tmp02(id_date) as hol
into #tmp_02
from t_calendar c

Execution time: 1.186 seconds

Возвращаемся на 9-ку и ...
с подзапросом: Execution time: 0.062 seconds
с функцией: Execution time: 0.89 seconds

Разница ОЧЕНЬ существенная (чем сложнее подзапрос-функция тем больше разница, например на 9-ке 1,5 сек а на 10-ке 18-ть сек!).
Неужели 10-ка на текущем этапе так плохо работает с функциями?

(такой баг был и у 9-ки в свое время, года так полтора назад)
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34933298
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v_smirnov(такой баг был и у 9-ки в свое время, года так полтора назад)Не думаю что это баг.
Функции по определению высчитываются для каждой строки по отдельности. А колоночный подзапрос разворачивается оптимизатором в join со всеми вытекающими.
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34933310
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда чем обусловлена такая разница?
Ну и риторический вопрос "как с этим жить" я не задам ...

Я точно помню что похожее поведение было и у 9-ки. Но каким-то EBF его исправили. Помню так как пришлось переписывать часть запросов что бы не использовались функции и потом обратно ;)
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34933362
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я же только что сказал чем эта разница обусловлена?
Можно еще в принципе поиграться с ключиком [ NOT ] DETERMINISTIC . Если оно NOT, то функция по существу превратится в вычисляемое поле и задержки на вычисление сократятся до минимума. Если функция построена на select из таблицы она по умолчанию становится determenistic, а если ты уверен что исходная таблица у тебя константная, то в принципе можно функцию превратить в NOT DETERMINISTIC, но это надо будет явно указывать.
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34933419
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извини но я немного повторюсь.

Больше всего интересует именно тормознутость более новой версии (ASA 10) в сравнении со старой (ASA 9).

Железо одинаковое, параметры старта одинаковые - и по возможности все одинаковое (кол-во повторов выполнения, reorganize, statistics etc...).

ASA 9
с подзапросом: Execution time: 0.062 seconds
с функцией: Execution time: 0.89 seconds

против ASA 10
с подзапросом: Execution time: 0.063 seconds
с функцией: Execution time: 1.186 seconds

Вот и все.
Обычно новое это "быстрее, правильнее, надежнее".

N.B. возможно здесь мы наблюдаем правильную работу ASA 10 с функциями, но за эту правильность платим временем ... (заранее согласен - мысль бредовая)
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34938120
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу DETERMINISTIC все с точностью наоборот. Если стоит NOT DETERMINISTIC, то результат не кэшируется, если без NOT , то кэшируется и для одинаковых наборов аргументов используется вычисленный ранее результат.
В 10-ке может изменили дефолтное значение, поэтому может необходимо явно указать DETERMINISTIC и на 9-ке и на 10-ке и сравнить?
И потом, можно ведь иначе попробывать написать ф-ию?
К примеру так:
create function tmp02 (pid_date date)
returns char(1)
begin
declare i_tmp char(1);

select is_holiday
into i_tmp
from t_calendar
where id_date=pid_date;

return i_tmp;
end;
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34939639
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Без разницы как писать функцию.
Изучаю, делаю тесты, пока плачевно все.

Как пример кусок плана !_одного и того-же_! запроса на одних и тех же данных на одном и том же железе.
База из 9-ки была перелита в 10-ку со (включая индексы и пр)

Total Cost Estimate: 40 против 85847

Я допускаю что где-то что-то я упустил, но вот что ... пока не нашел

Это на 9-ке:
( Plan [ Total Cost Estimate: 40.9896895 ]
( NestedLoopsJoin[ TRUE ]
( NestedLoopsJoin[ TRUE ]
( TableScan ( o_OrderComplect this_ )[ this_.id_base = 53 : 100% Statistics ] )
( IndexScan ( o_Doc this_2_ ) o_Doc[ ( ( 2007-09-01 21:00:00.000000 <= this_2_.Create_Date <= 2007-09-30 21:00:00.000000 ) : 30.41511917% Statistics ) AND ( this_2_.Active = 1 : 95.44488192% Statistics ) AND ( this_.id_base = this_2_.id_base : 100% Column-Column ) ] )
)
( IndexScan ( o_DocDet this_1_ ) o_DocDet[ ( this_2_.id_Doc = this_1_.id_Doc : .0064379064% Column-Column (bounded) ) AND ( this_.Version = this_1_.Version : 94.34475979% Column-Column ) AND ( this_2_.id_base = this_1_.id_base : 100% Column-Column ) AND ( this_.id_base = this_1_.id_base : 100% Column-Column ) ] )
)
)
( SubQ 1 [ Total Cost Estimate: .0090684385 ]
( RowLimit
( NestedLoopsJoin[ TRUE ]
( NestedLoopsJoin[ TRUE ]
( NestedLoopsJoin[ TRUE ]
( NestedLoopsJoin[ TRUE ]
( IndexScan ( o_OrderComplect ooc ) o_OrderComplect )
( IndexScan ( o_DocRef odr ) FK_DOC_REF_FROM )
)
( IndexScan ( o_Invoice oi ) o_Invoice )
)
( IndexScan ( t_invoice i ) t_invoice )
)
( IndexScan ( t_personnel p ) t_personnel )
)
)
)

А вот ЭТО на 10-ке:
( Plan [ Total Cost Estimate: 85847 ]
( NestedLoopsJoin [ TRUE ]
( IndexScan ( o_OrderComplect this_ ) PK_O_ORDERCOMPLECT**[ this_.id_base = 53 : 100% Statistics ] )
( IndexScan ( o_Doc this_2_ ) PK_O_DOC[ ( this_2_.id_base = this_.id_base : 100% Column-Column ) AND ( this_2_.Active = 1 : 94.979% Statistics ) AND ( this_2_.Create_Date BETWEEN 2007-09-01 21:00:00.000 AND 2007-09-30 21:00:00.000 : 26.125% Statistics ) ] )
)
)
( SubQ 1 [ Total Cost Estimate: 58.224 ]
( RowLimit
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( IndexScan ( o_OrderComplect ooc ) PK_O_ORDERCOMPLECT )
( IndexScan ( o_DocRef odr ) FK_DOC_REF_FROM )
)
( IndexScan ( o_Invoice oi ) PK_O_INVOICE )
)
( IndexScan ( t_invoice i ) t_invoice )
)
( IndexScan ( t_personnel p ) t_personnel )
)
)
)
...
Рейтинг: 0 / 0
ASA 10.0.1 Производительность функций
    #34939703
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри - забыл пересоздать статистику.
Вот теперь правильная цифра на 10-ке.

( Plan [ Total Cost Estimate: 4156.8 ]
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( IndexScan ( o_OrderComplect this_ ) idx_o_ordercomplect_id_base )
( IndexScan ( o_Doc this_2_ ) PK_O_DOC[ ( this_2_.id_base = this_.id_base : 100% Column-Column ) AND ( this_2_.Active = 1 : 95.492% Statistics ) AND ( this_2_.Create_Date BETWEEN 2007-09-01 21:00:00.000 AND 2007-09-30 21:00:00.000 : 26.581% Statistics ) ] )
)
( IndexScan ( o_DocDet this_1_ ) PK_O_DOCDET[ ( this_1_.id_base = this_.id_base : 100% Column-Column ) AND ( this_1_.Version = this_.Version : 94.317% Column-Column ) AND ( this_2_.id_Doc = this_1_.id_Doc : 0.0057951% Column-Column | Bounded ) AND ( this_2_.id_base = this_1_.id_base : 100% Column-Column ) ] )
)
)
( SubQ 1 [ Total Cost Estimate: 3.0345 ]
( RowLimit
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( NestedLoopsJoin [ TRUE ]
( IndexScan ( o_OrderComplect ooc ) PK_O_ORDERCOMPLECT )
( IndexScan ( o_DocRef odr ) FK_DOC_REF_FROM )
)
( IndexScan ( o_Invoice oi ) PK_O_INVOICE )
)
( IndexScan ( t_invoice i ) t_invoice )
)
( IndexScan ( t_personnel p ) t_personnel )
)
)
)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 10.0.1 Производительность функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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