powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / почему самодельная функция тормозит?
7 сообщений из 7, страница 1 из 1
почему самодельная функция тормозит?
    #39472952
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простейшая ф-я для форматирования телефонов почему-то работает медленнее, чем "руками":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DELIMITER //

DROP function IF EXISTS make_phone;
CREATE function make_phone(`code` INT,`num` INT)
RETURNS VARCHAR(17)

BEGIN
    RETURN IF(`code`>0,CONCAT('+7 (',`code`,') ',SUBSTR(`num`,1,3),'-',SUBSTR(`num`,4)),'');

END //
DELIMITER ;



запрос
Код: sql
1.
select make_phone(code,num) from phones;


отрабатывает за 0.70
а такой:
Код: sql
1.
select IF(`code`>0,CONCAT('+7 (',`code`,') ',SUBSTR(`num`,1,3),'-',SUBSTR(`num`,4)),'') from phones;


за 0.05

так задумано?
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39472971
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ещё она в mysql.func почему-то не пишется
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39473008
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78а ещё она в mysql.func почему-то не пишется
а, ну это потому что там только AGGREGATE, а пользовательские в mysql.proc
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39473739
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю , что не хватает оптимизатору
DETERMINISTIC и NO SQL
в определении функции
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39474460
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovдумаю , что не хватает оптимизатору
DETERMINISTIC и NO SQL
в определении функции
ничего не дало

вот в таком виде ф-я отрабатывает уже за 1 секунду:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE function make_phone(code INT,num INT)
RETURNS VARCHAR(20)

BEGIN
    DECLARE s VARCHAR(20);

    IF code>0 THEN SET s = CONCAT('+7 (',code,') ',SUBSTR(num,1,3),'-',SUBSTR(num,4));
    ELSE SET s = '';
    END IF;

    RETURN s;

END //


было 0.65
и это на 43к строках...
т.е. такая огромная просадка в 50% из-за простого добавления переменной
очевидно, что ф-я не кешируется, а каждый раз как-будто бы компилируется заново, на каждой из 43к строк
чего-то я упускаю, а что?
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39474482
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну походу так и задумано ...
для добычи счастья надо UDF-ы писать походу
...
Рейтинг: 0 / 0
почему самодельная функция тормозит?
    #39474483
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yes, stored procedures are slow, a bunch of magnitudes slower than interpreted/compiled code. They turn out useful when you need to tie up some database logic which you want to keep out of.
your application because it's out of the specific domain (ie, logging/administrative tasks). If a stored function contains no queries, it's always better practice to write an utility.
function in your chosen language, as that wont prevent reuse (there are no queries), and will run much faster.

nope the direct query is a lot faster; i assumed as a given fact that stored functions are inherently slower than interpreted/compiled code and just wanted to show you a better.
implementation; btw when stored function/procedures contain no queries, it's always better to implement the same as an external function.

My answer, in summary, is that the custom function was being called up 7000 times in a query and not 300 times as I originally thought. 300 times would be fine for this report, taking about.
10 seconds. 7000 times takes over 3 minutes and is no good.
The reason is that the custom function in the SELECT clause gets applied to all rows retrieved in the query before the GROUP BY clause is applied. The GROUP BY reduces the 700 rows.
retrieved to just 30 unique rows.

This has been a flaw of MySQL for a long time - sub-queries are executed for each outer query match returned, even if the sub-query is not linked to the outer query. The optimiser should be.
able to work out that there is no point executing the sub-query or custom function on rows that are going to be discarded through the WHERE clause conditions.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / почему самодельная функция тормозит?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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