powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долго выполняется запрос
23 сообщений из 23, страница 1 из 1
Долго выполняется запрос
    #38843222
VladimirFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть долго выполняющийся запрос. Подскажите что можно сделать для его оптимизации.
Собственно сам запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT class_union.rn 
FROM (class_okdp,company_with_class AS cwc ,class_user_pk) 
LEFT JOIN  class_okdp cot ON cot.`code` LIKE( CONCAT(class_okdp.code,'%')) 
LEFT JOIN  class_union ON class_union.rn = cot.RN AND class_union.direct=1
LEFT JOIN  company_user_part as cup3 ON cup3.id_company=class_union.id_company AND cup3.id_user=class_union.id_user
WHERE 
  class_user_pk.type_class=2 AND 
  class_user_pk.id_class=class_okdp.RN  AND
  cwc.`code` LIKE CONCAT(class_okdp.code,'%')  AND 
  cwc.direct=0 GROUP BY cwc.id_company,class_okdp.code,cwc.user_union 

Тормоза явно по LEFT JOIN  company_user_part as cup3 ON cup3.id_company=class_union.id_company AND cup3.id_user=class_union.id_user



EXPLAIN по запросу выдает следующие данные:

id"select_type""table""type""possible_keys""key""key_len""ref""rows""Extra" 1"SIMPLE""company_t""ALL""PRIMARYid_company"nullnullnull"1756""Using where Using temporary Using filesort"1"SIMPLE""class_union""ref""id_company""id_company""4""society.company_t.id_company""7""Using where" 1"SIMPLE""class_okdp_t""eq_ref""UK_class_okdp_RN""UK_class_okdp_RN""4""society.class_union.rn""1""Using where" 1"SIMPLE""class_user""eq_ref""PRIMARY""PRIMARY""4""society.class_union.id_class_user""1""Using index" 1"SIMPLE""class_user_pk""ALL""UK_class_user_pk_id_class"nullnullnull"102""Using where Using join buffer (Block Nested Loop)" 1"SIMPLE""class_okdp_t""eq_ref""UK_class_okdp_RN""UK_class_okdp_RN""4""society.class_user_pk.id_class""1""Using where" 1"SIMPLE""class_okdp_t""ALL"nullnullnullnull"45750""Using where Using join buffer (Block Nested Loop)" 1"SIMPLE""class_union""ref""rn""rn""5""society.class_okdp_t.RN""1""Using where" 1"SIMPLE""cup3""ref""IDX_company_user_part_id_userIDX_company_user_part_id_company""IDX_company_user_part_id_user""4""society.class_union.id_user""12""Using where"
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843270
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirFl,

что-то не сочетается список полей в SELECT и в GROUP BY
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843337
VladimirFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, да, точно. здесь не все поля в селекте указал. Со всеми полями в селекте не легче... запрос выполняется 15 сек.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT class_union.rn, cwc.id_company,class_okdp.code,cwc.user_union
FROM (class_okdp,company_with_class AS cwc ,class_user_pk) 
LEFT JOIN  class_okdp cot ON cot.`code` LIKE( CONCAT(class_okdp.code,'%')) 
LEFT JOIN  class_union ON class_union.rn = cot.RN AND class_union.direct=1
LEFT JOIN  company_user_part as cup3 ON cup3.id_company=class_union.id_company AND cup3.id_user=class_union.id_user
WHERE 
  class_user_pk.type_class=2 AND 
  class_user_pk.id_class=class_okdp.RN  AND
  cwc.`code` LIKE CONCAT(class_okdp.code,'%')  AND 
  cwc.direct=0 GROUP BY cwc.id_company,class_okdp.code,cwc.user_union 
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843342
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirFlСо всеми полями в селекте не легче...Для начала должно стать не "легче", а правильно. Неправильный запрос оптимизировать бессмысленно.
VladimirFl
Код: sql
1.
2.
3.
SELECT class_union.rn, cwc.id_company,class_okdp.code,cwc.user_union
...
GROUP BY cwc.id_company,class_okdp.code,cwc.user_union 

Вы в курсе, что в таком случае значение поля class_union.rn может взяться из любой записи в пределах группы? Причем даже из разных от раза к разу.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843363
VladimirFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, а.. вы в этом смысле. да.. я в курсе. там немного просто упростил запрос

вот он целиком

Код: 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.
SELECT type_class,
3 as typec, c_union.id_class_user,
IF(cup1.id_global_company_role IS NULL,
1,
cup1.id_global_company_role) as cup1role, 
IF(cup2.id_global_company_role IS NULL,1,cup2.id_global_company_role) as cup2role,
cwc.user_union,
company_with_class.user_union as user_union2, 
company_with_class.id_company, 
company_with_class.id_user AS approve_user, 
user_buyers.nick_user AS nick_approve_user,
cwc.id_company AS gt, 
company_with_class.id_class_union,  
cwc.id_class_union as id_class_union2, 
class_user_pk.id_pk_user AS pk_users, 
cwc.`code_class_user` as code, 
cwc.RN,
cwc.`name_class_user`,
'' AS name2, 
'собственному классификатору' as type1,
3 AS class_type

FROM (company_with_class,company_with_class cwc ,class_user_pk) 
LEFT JOIN  company_user_part as cup1 ON cup1.id_company=company_with_class.id_company AND cup1.id_user=company_with_class.user_union
LEFT JOIN  company_user_part as cup2 ON cup2.id_company=cwc.id_company AND cup2.id_user=cwc.user_union
LEFT JOIN  company as company_buyers on company_buyers.id_company=company_with_class.id_company
LEFT JOIN  user as user_buyers on user_buyers.id_user=company_with_class.id_user
left join class_user_del on company_with_class.code_class_user like concat(class_user_del.code_class_user,'%') and class_user_del.id_user=company_with_class.id_user 
left join class_user_del as cwc_del on cwc.code_class_user like concat(cwc_del.code_class_user,'%') and cwc_del.id_user=cwc.id_user 
LEFT JOIN  class_union AS c_union ON c_union.id_class_union=cwc.id_class_union

WHERE type_class=3 AND class_user_del.id_user IS NULL AND cwc_del.id_user IS NULL AND 
  class_user_pk.id_class=company_with_class.id_class_union  AND  cwc.`code_class_user` LIKE CONCAT(company_with_class.`code_class_user`,'%')  AND
  cwc.direct=0 and company_with_class.direct=1 AND (IsInOkato(company_with_class.id_class_union,cwc.id_class_union))  
GROUP BY cwc.id_company,gt,code,cwc.user_union 

UNION ALL

SELECT type_class,
2 as typec, c_union.id_class_user,
CONCAT(1,',',GROUP_CONCAT( COALESCE( IF(cup3.id_global_company_role IS NULL,1,cup3.id_global_company_role), '0'))  )  as cup1role,
IF(cup2.id_global_company_role IS NULL,1,cup2.id_global_company_role) as cup2role,
cwc.user_union,
4 as user_union2, 
CONCAT(328,',',GROUP_CONCAT( COALESCE(class_union.id_company, '0'))  ) AS id_company, 
CONCAT(4,',',GROUP_CONCAT( COALESCE(class_union.id_user, '0'))  ) AS approve_user,
CONCAT('Администратор',',',GROUP_CONCAT( COALESCE(user_buyers.nick_user, ''))  ) AS nick_approve_user,

cwc.id_company AS gt, 
class_okdp.RN as id_class_union,  
cwc.id_class_union as id_class_union2, 
class_user_pk.id_pk_user AS pk_users, 
cwc.CODE as code, 
cwc.RN,
cwc.`OKDP_NAME`,
'' AS name2, 
'классификатору ОКДП администратора' as type1,
2 AS class_type

FROM (class_okdp,company_with_class cwc ,class_user_pk) 
LEFT join  (class_union, class_okdp cot) ON class_union.rn = cot.RN AND cot.`code` LIKE CONCAT(class_okdp.code,'%') AND class_union.direct=1
LEFT JOIN  company_user_part as cup3 ON cup3.id_company=class_union.id_company AND cup3.id_user=class_union.id_user
LEFT JOIN  company_user_part as cup2 ON cup2.id_company=cwc.id_company AND cup2.id_user=cwc.user_union
LEFT JOIN  company as company_buyers on company_buyers.id_company=class_union.id_company
LEFT JOIN  user as user_buyers on user_buyers.id_user=class_union.id_user
LEFT JOIN  class_union AS c_union ON c_union.id_class_union=cwc.id_class_union

WHERE type_class=2 AND class_user_pk.id_class=class_okdp.RN  AND  cwc.`code` LIKE CONCAT(class_okdp.code,'%')  AND 
  cwc.direct=0
GROUP BY cwc.id_company,gt,code,cwc.user_union
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843473
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirFlmiksoft, а.. вы в этом смысле. да.. я в курсе. там немного просто упростил запрос

вот он целиком но мне пофиг

Код: 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.
SELECT 
type_class,
3 as typec,
c_union.id_class_user,
IF(cup1.id_global_company_role IS NULL,1,cup1.id_global_company_role) as cup1role, 
IF(cup2.id_global_company_role IS NULL,1,cup2.id_global_company_role) as cup2role,
cwc.user_union,
company_with_class.user_union as user_union2, 
company_with_class.id_company, 
company_with_class.id_user AS approve_user, 
user_buyers.nick_user AS nick_approve_user,
cwc.id_company AS gt, 
company_with_class.id_class_union,  
cwc.id_class_union as id_class_union2, 
class_user_pk.id_pk_user AS pk_users, 
cwc.`code_class_user` as code, 
cwc.RN,
cwc.`name_class_user`,
'' AS name2, 
'собственному классификатору' as type1,
3 AS class_type


GROUP BY cwc.id_company,gt,code,cwc.user_union

Или всё выделенное жёлтым однозначно определяется полями группировки?

PS. Не пойму, какой смысл выбирать вот так "cwc.id_company AS gt", а потом группировать вот так "GROUP BY cwc.id_company,gt"? Два раза группируете по одному и тому же значению.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843486
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я что-то понятно не могу. У вас план не соответствует запросу. Покажите план на полный запрос без всяких
автортам немного просто упростил запрос
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843488
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"понятно" = "понять"
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843489
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStone,

Это да. План не соответствует ни одному варианту запроса тут...

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

Избавьтесь от лайков в условиях соединений. Это первое. Как? сильно зависит от вашей БД. По крайней мере, в части выборки ключей юзверя - может быть полезным создание таблицы групп ключей и двойной джойн с нею... зато выборка пойдет по индексам, а не лайкам...
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843490
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И избавьтесь от смеси французского с нижегородским (перепишите неявные джойны на явные) - читать очень неудобно, особенно секцию where.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38843614
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ибудтобы я удивился, что запрос медленно работает...
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844255
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109JeStone,
то что сама группировка вызывает вопросы, это уже второй момент... ну и корректность выборок при такой группировке - уже совсем на совести автора..

когда уже mysql придушат за такие вольности ;)
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844340
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81,

Никогда. Это иногда даже полезно. Проблема как всегда не в плохом инструменте, который разрешает что-то лишнее, а в кривых ручках. Ибо, как известно, при определенной сноровке можно и "прибор" сломать. :)
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844353
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема исключительно в том, что это разрешено по умолчанию.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844359
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirПроблема исключительно в том, что это разрешено по умолчанию.

А второе за что его надо придушить, так это за зависимость результата одного и того-же запроса от настроек сервера :)

Arhat109, Потому и называется MySQL наверное... в стандарте для таких вещей есть gerouping sets
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844372
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81,

Вопрос терминологии. Но, в целом я согласен и с вами и с tanglir-ом.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844382
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81зависимость результата одного и того-же запроса от настроек сервераА разве это не у любого сервера так?
В Оракле такое точно есть. Одни только неявные преобразования типов данных сколько крови попили у новичков...
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844388
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftNikolayV81зависимость результата одного и того-же запроса от настроек сервераА разве это не у любого сервера так?
В Оракле такое точно есть. Одни только неявные преобразования типов данных сколько крови попили у новичков...

ораклы увы такой-же набор пережитков прошлого, котрые нужны для совместимости ( да и контора увы одна )
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844391
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81ораклы увы такой-же набор пережитков прошлого, котрые нужны для совместимостия бы не сказал, что NLS-параметры нужны только для совместимости.
NikolayV81( да и контора увы одна )А это тут вообще не причем, контора одна стала совсем недавно, все или почти все настройки, влияющие на результат, были внесены до того в оба продукта.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844392
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftNikolayV81ораклы увы такой-же набор пережитков прошлого, котрые нужны для совместимостия бы не сказал, что NLS-параметры нужны только для совместимости.

Когда первый раз увидел сообщение про параметры подключения в PL/SQLDeveloper, когда начинал с Оракл, долго втыкал в текст, и думал что я идиот ( вот зачем драйверу куда-то лезть куда его не просят? )
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844398
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Specifies conventions such as the language used for Oracle messages , sorting , day names, and month names. Each supported language has a unique name; for example, AMERICAN , FRENCH , or GERMAN . The language argument specifies default values for the territory and character set arguments. If the language is not specified, then the value defaults to AMERICAN .

А из-за этого приходиться иногда наблюдать забавные переводы ошибок ;), с другой стороны какое отношение сортировка имеет к настройкам пользовательсткого компа?

ИМХО это должно быть в строке подключения, если про клиентскую часть, нет в строке, должно быть по дефолту, дефолт должен быть задан либо на сервере либо вобще как глобальное умолчание.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844402
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81какое отношение сортировка имеет к настройкам пользовательсткого компак настройкам пользовательского компа, может, и никакого, а вот к настройкам сервера - самое прямое.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38844410
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftNikolayV81какое отношение сортировка имеет к настройкам пользовательсткого компак настройкам пользовательского компа, может, и никакого, а вот к настройкам сервера - самое прямое.

так в том то и фишка, настройки компа/сервера и прочее это совсем из другой серии, для сортировок есть charset-ы и прочее, что задаётся при создании таблиц, схем, баз, да чего угодно. При этом не должно ( на мой взгляд ) быть такого что date = "01.01.2001" на одном клиенте работает, на другом нет, эти вроде как упрощения для разработчиков заканчиваются в итоге проблемами.
Баз на сервере ( клиентов на десктопе ) может быть куча, с разными настройками, понимаю конечно что написание даты в стиле to_date ( "", "yyyy-..." ) в оракле может быть привычкой ( с учётом того что и там нестандартных на мой взгляд литералов напихали ), но ...

Вообще это конечно к проектированию СУБД больше относится, одно оракловое varchar2 чего стоит, а там ещё отсуствие on update cascade, с весёлыми ответами идеолога в стиле "вы ничего не понимаете, и то что вам нужно вам на самом деле не нужно"...
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долго выполняется запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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