Страница 1 из 1

Тормоза LPAD FB 2.1.1

Добавлено: 28 ноя 2008, 14:09
SDG
Захотел вот избавится от сторонних 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 записей

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

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

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

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

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

Добавлено: 28 ноя 2008, 14:32
SDG
Действительно CAST помог (482 мс)

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

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

Добавлено: 28 ноя 2008, 15:11
dimitr
только для LPAD/RPAD, т.к. для них на этапе компиляции запроса неизвестно, какова будет длина результата