powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите ускорить хранимку, или запрос
12 сообщений из 37, страница 2 из 2
помогите ускорить хранимку, или запрос
    #39931317
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
ЧТО тут можно оптимизировать?
Убрать цикл (развернуть), убрать вызов LENGTH (там константа), убрать LOCATE-ы (переходом на нормальные байтовые значения вместо символьной шкалы), вычисление (a-b)*(a-b) сделать по необходимости, а не на каждой итерации, сделать досрочный выход из процедуры по достижении некоторого значения R (все равно результат менее 70 не используется)...

При более творческом подходе можно внести секцию WHERE из запроса внутрь функции и вызывать ее один раз, а не пять (или более)...

В пределе написать свою внешнюю функцию на С++
Adding a User-Defined Function
Adding a Native Function

В идеале, наверное, уходить от SQL, а делать какое-то другое решение. В частности, распараллелить по процам/ядрам. Запрос (точнее говоря, его алгоритмический аналог) должен хорошо параллелиться.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931321
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

кстати про распоралелить - это вполне реально для меня, единственное я не понимаю даст это прирост именно на моей жлезяке или нет, но я попробую, посмотрю...

по поводу переписать на с++ тут не все так просто, у меня мускуль предустановлен и установка там хитрая с использованием виртуальных дисков которые сбрасываются при перезагрузки и востанавливаются из пзу. Конечно способы есть, но я не хочу ломать штатную (и достаточно сбалансированую) систему
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931323
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
кстати про распоралелить - это вполне реально для меня, единственное я не понимаю даст это прирост именно на моей жлезяке или нет, но я попробую, посмотрю...
Можно распараллелить весь запрос оставаясь в рамках SQL, хотя это и не просто. Т.е. выполнять запрос одновременно в N сессиях, но каждый из отдельных запросов должен обрабатывать 1/N долю таблицы Files_CRC.

Предварительно надо потестить, а является ли вообще вызов функции узким местом. А то, может, узким местом является диск, а тогда от параллельности может стать даже хуже.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931983
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16 сек

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
SELECT 
  DISTINCT T10.*, 
  T20.* 
FROM 
  Files T10 
  INNER JOIN (
    SELECT 
      T0.*, 
      (
        T0.k_red + T0.k_green + T0.k_blue + T0.k_grey + T0.k_color
      ) AS k_sum 
    from (
        SELECT 
          ID_Files, 
          sum(k_red) as k_red, 
          sum(k_green) as k_green, 
          sum(k_blue) as k_blue, 
          sum(k_grey) as k_grey, 
          sum(k_color) as k_color
        FROM 
          (
            SELECT 
              ID_Files, 
              compare_key_9(Key_red, "1e43f4333") as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color 
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              compare_key_9(Key_green, "5543f4335") as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              compare_key_9(Key_blue, "bbb3f4337") as k_blue, 
              0 as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              0 as k_blue, 
              compare_key_9(Key_grey, "1777f4333") as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              compare_key_9(Key_color, "1e4399933") as k_color 
             FROM 
               Files_CRC
           ) AS T
               
        GROUP BY ID_Files ) T0 
        WHERE 
          (
            LEAST(
              T0.k_red, T0.k_green, T0.k_blue, T0.k_grey, 
              T0.k_color
            ) > 70 
            AND GREATEST(
              T0.k_red, T0.k_green, T0.k_blue, T0.k_grey, 
              T0.k_color
            ) > 90
          ) 
          OR GREATEST(
            T0.k_red, T0.k_green, T0.k_blue, T0.k_grey, 
            T0.k_color
          ) > 97
      ) T20 ON T10.ID = T20.ID_Files 
    ORDER BY 
      T20.k_sum DESC 
    LIMIT 
      0, 10
     
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931984
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3.5 сек

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            SELECT 
              ID_Files, 
              compare_key_9(Key_red, "1e43f4333") as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color 
            FROM 
              Files_CRC 
 
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931985
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть идея сделать таблицу с 2 столбцами которые будут хранить готовое значение 2х символов.

и если разбить все ключи на односимвольные колонки, то все будет работать на чистых джойнах, правда меня смущает добавление 40 колонок
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933235
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного переписал (и переделал ключи) стало 10 сек против начальных 20

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN
DECLARE R INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
DECLARE a INT;
DECLARE L INT;
SET L = LENGTH(key1);
WHILE i<=L DO
	Set a = ABS(ORD(SUBSTRING(key1, i, 1))-ORD(SUBSTRING(key2, i, 1)));
	IF a>10 THEN Set R = R + 100; ELSE Set R = R + a * a; END IF;    
	SET i=i+1;
END WHILE;
Set R = 100 - R / L;
RETURN (R);
END
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933238
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на будущее наверно буду делать кеширование части результататов в отдельной таблице
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933287
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69,

Мне кажется, что вызов ABS все-таки дороже, чем умножение a * a.
Ну и кроме этого еще остались резервы...
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933744
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

а какие еще резервы остались?

ps
отказываться от цикла не буду
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933747
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
а какие еще резервы остались?
miksoft
сделать досрочный выход из процедуры по достижении некоторого значения R (все равно результат менее 70 не используется)...
Кстати, надо еще на кодировки посмотреть. Возможно, замена CHAR(9) на BINARY(9) что-то даст.

vde69
отказываться от цикла не буду
Почему же? Можно сэкономить 10 сравнений, 9 инкрементов переменной i и около 10 переходов. Впрочем, я не уверен, что это будет заметно на общем фоне.

В варианте запроса с UNION ALL проследите, а не создаются ли временные файлы на диске?
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933752
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

и то и другое - в пределах погрешности измерения
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите ускорить хранимку, или запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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