powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В процедуре и раздельно
4 сообщений из 4, страница 1 из 1
В процедуре и раздельно
    #39598640
Фотография alexnews
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть одна процедура, где выполняется много команд. И есть один апдейт по середине процедуры. Так вот вся процедура выполняется за 16 минут, Но если выполнять отдельно до апдейта - 20 секунд и апдейт с последующими командами еще 37 секунд. Приводить тут неимеет смысла, так как основная таблица имеет более 150 тыс строк. Смешное то, что на другом сервере с такими же данными и настройками данная процедура выполняется за 70 секунд (похоже на реальность). Так вот вопрос, куда копать? Что можно сделать в данном случае?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
update
    agreement_list_tmp
    USE INDEX (ind_agreement_5fields)
        JOIN
    agreement_list_tmp a ON 
    (a.AgreementNumber = agreement_list_tmp.AgreementNumber
         AND a.AgreementTypeID = agreement_list_tmp.AgreementTypeID
         AND a.CustomerSiteID = agreement_list_tmp.CustomerSiteID
         AND a.Source = agreement_list_tmp.Source
	)

set agreement_list_tmp.ActualEndDate = agreement_list_tmp.EndDate
WHERE a.ParentAgreementNumber > 0
;



Что я пробовал:
1. Сделал принудительный сброс данных FLUSH TABLE; FLUSH QUERY CACHE;
2. Сделал принудительный индекс, до этого апдейт выполнялся 2 минуты, теперь 30 милисекунд

Код: sql
1.
CREATE INDEX ind_agreement_5fields ON agreement (`AgreementNumber`,`AgreementTypeID`,`CustomerSiteID`,`Source`);



Естественно индекс на ParentAgreementNumber существует.

3. Выносил в отдельную таблицу agreement_list_tmp, и затем делал джоин. Не помогло.

Что можно еще попробовать?
Заранее спасибо за любые советы.
...
Рейтинг: 0 / 0
В процедуре и раздельно
    #39599253
Фотография alexnews
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да забыл указать EXPLAIN
Код: sql
1.
2.
1	SIMPLE	a	range	AgreementTypeID,CustomerSiteID,index5,ParentAgreementNumber,index2017060601,agreement_AgreementNumber,ind_agreement,ind_agreement_test,ind_agreement_5fields,ind_agreement_full	ParentAgreementNumber	4	NULL	1997	Using where
1	SIMPLE	agreement_list_tmp	ref	ind_agreement_5fields	ind_agreement_5fields	12	sedbqa.a.AgreementNumber,sedbqa.a.AgreementTypeID,sedbqa.a.CustomerSiteID	1	Using where
...
Рейтинг: 0 / 0
В процедуре и раздельно
    #39599259
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexnewsвся процедура выполняется за 16 минут, Но если выполнять отдельно до апдейта - 20 секунд и апдейт с последующими командами еще 37 секунд.Проверьте эти секунды:
1) Просмотрите лог медленных запросов (действительно ли апдейт выполняется 15 минут?);
2) Поставьте перед и после запроса INSERT (а также в начале и конце процедуры) во временную таблицу штампов времени.
...
Рейтинг: 0 / 0
В процедуре и раздельно
    #39599288
Фотография alexnews
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Akina, нашел проблему. Решилось выставлением паузы между исполнением команд. Похоже пока в таблице работала предыдущая команда с одним процессором, следующая начинала уже работать с другим процессором. И получался deadlock. Вопрос закрыт.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В процедуре и раздельно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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