Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток 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-ки в свое время, года так полтора назад) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 16:21 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
v_smirnov(такой баг был и у 9-ки в свое время, года так полтора назад)Не думаю что это баг. Функции по определению высчитываются для каждой строки по отдельности. А колоночный подзапрос разворачивается оптимизатором в join со всеми вытекающими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 17:40 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
Тогда чем обусловлена такая разница? Ну и риторический вопрос "как с этим жить" я не задам ... Я точно помню что похожее поведение было и у 9-ки. Но каким-то EBF его исправили. Помню так как пришлось переписывать часть запросов что бы не использовались функции и потом обратно ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 17:43 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
я же только что сказал чем эта разница обусловлена? Можно еще в принципе поиграться с ключиком [ NOT ] DETERMINISTIC . Если оно NOT, то функция по существу превратится в вычисляемое поле и задержки на вычисление сократятся до минимума. Если функция построена на select из таблицы она по умолчанию становится determenistic, а если ты уверен что исходная таблица у тебя константная, то в принципе можно функцию превратить в NOT DETERMINISTIC, но это надо будет явно указывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 17:54 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
Извини но я немного повторюсь. Больше всего интересует именно тормознутость более новой версии (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 с функциями, но за эту правильность платим временем ... (заранее согласен - мысль бредовая) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 18:12 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
По поводу 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 12:54 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
Без разницы как писать функцию. Изучаю, делаю тесты, пока плачевно все. Как пример кусок плана !_одного и того-же_! запроса на одних и тех же данных на одном и том же железе. База из 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 ) ) ) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 17:23 |
|
||
|
ASA 10.0.1 Производительность функций
|
|||
|---|---|---|---|
|
#18+
сорри - забыл пересоздать статистику. Вот теперь правильная цифра на 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 ) ) ) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=57&tid=2011817]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 262ms |
| total: | 429ms |

| 0 / 0 |
