Тормоза LPAD FB 2.1.1

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
SDG
Сообщения: 20
Зарегистрирован: 27 авг 2008, 09:32

Тормоза LPAD FB 2.1.1

Сообщение SDG » 28 ноя 2008, 14:09

Захотел вот избавится от сторонних UDF и сразу нарвался на неприятность…

Select C.* FROM CUSTOMER C order by C.account_no
297 ms

RFUNC
Select C.* FROM CUSTOMER C order by PADLEFT(C.account_no,10,'0')
484 ms

ADHOCFREEUDF
Select C.* FROM CUSTOMER C order by F_Padleft(c.Account_No,'0',10)
Execute time = 3s 0ms

Родное для FIREBIRD LPAD
Select C.* FROM CUSTOMER C order by LPAD(C.Account_No,10,'0')
45s 672ms !!!!!!

Сервер FB v 2.1.1.1790
Всего в таблице CUSTOMER 8956 записей

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Тормоза LPAD FB 2.1.1

Сообщение dimitr » 28 ноя 2008, 14:25

результатом LPAD является строка длиной 32К, что приводит к тормозам во время сортировки. Обойти можно кастом:

Код: Выделить всё

order by CAST(LPAD(C.Account_No,10,'0') as VARCHAR(10))

SDG
Сообщения: 20
Зарегистрирован: 27 авг 2008, 09:32

Re: Тормоза LPAD FB 2.1.1

Сообщение SDG » 28 ноя 2008, 14:32

Действительно CAST помог (482 мс)

на все функции которые возвращают строки нужно наклвдывать CAST?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Тормоза LPAD FB 2.1.1

Сообщение dimitr » 28 ноя 2008, 15:11

только для LPAD/RPAD, т.к. для них на этапе компиляции запроса неизвестно, какова будет длина результата

Ответить