Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
У меня работает служба обменивающаяся принимающая заказы с сайта, записывающая их в базу MSSQL 2012 и высылающая их изменения в базе на сайт. Для высылки получения списка изменений (чтобы потом выслать их на сайт) использовалась одна хранимая процедура, которая пробегала каждый раз по всему списку заказов (огромному за несколько лет) искала изменения сверяя с датой последней синхронизации каждого заказа. И вызывалась она после записи каждого нового заказа (вообще в томже потоке). Я решил сделать чтобы после записи нового заказа она пробегала только по нему, и только через определенный тоже не очень большой интервал пробегала по всем. Там было также сделано чтобы если процедура выполняется дольше 100сек она обрывалась. Поставил в её запрос условие "and (@UID1='' or z.[UID]=@UID1)". И после этого начались чудеса. Сначала все было хорошо, заказы полетели намного быстрее потом спустя день в тех моментах где процедура выполнялась на всех заказах ( с параметром @UID1='') начались жуткие тормоза, она тормозила более чем в 5 раз дольше чем прежде, не укладывалась в лимит и обрывалась и так каждый раз. То есть практически сдохла. Я долго мучился с ней. Один раз запустишь сделает за пол секунды, а через минуту запустишь намертво зависнит. И в следующий раз продолжает виснуть, причем если её параметр переименовать (например из @UID2 в @UID2, то довольно долгое время начинает нормально работать). Какой-то дикий глюк MSSQL с построением плана запроса. И решил эту задачу (по крайней мере уже 2 недели работает) только написав в этой хранимой процедуре 2 отдельных запроса различающихся только строкой "z.[UID]=@UID1", то есть сделав так if @UID1='' запросПолный else запрос1заказ. Эстетически безобразно конечно, но по иному никак. Можете ли вы что-нибудь пояснить по поводу такого явления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 21:44 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
читать про parameter sniffing либо закладывайтесь на усреднённый план передавая значения входных параметров во внутренние переменные либо перекомпилируйте процедуру каждый раз (with recompile) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 22:02 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
Весело с ней было. Параметр этот изначально назывался @UID. Я его переименовал, все сразу заработало. Я сразу придумал " UID - зарезервированное слово MSSQL и именно это причина всего...". Потом переименовал такие параметры ещё 4х других хранимых процедур, перелопатил массу кода где они упоминались и даже в репозитории-тортузе написал сообщение "Никогда, никогда не используйте параметры @UID" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 22:19 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
bilovВесело с ней было. Параметр этот изначально назывался @UID. Я его переименовал, все сразу заработало. Я сразу придумал " UID - зарезервированное слово MSSQL и именно это причина всего...". Потом переименовал такие параметры ещё 4х других хранимых процедур, перелопатил массу кода где они упоминались и даже в репозитории-тортузе написал сообщение "Никогда, никогда не используйте параметры @UID" бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 01:21 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
bilovперелопатил массу кода где они упоминались и даже в репозитории-тортузе написал сообщение "Никогда, никогда не используйте параметры @UID" У вас просто код рекомпилировался после alter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 01:52 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
felix_ff, Это то я потом понял, когда спустя выходные снова перестало работать. См первое сообщение. А тогда такая логически стройная картина нарисовалась, прямо думал открытие совершил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 08:57 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
Я ешё год или два назад заметил что случались зависания если параметры хранимой процедуры по-умолчанию = NULL и участвуют в запросе. Это миф из той же серии или действительно что-то такое есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 14:49 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
Дедушка, значит чтобы процедура работала стабильно независимо от каких-нибудь директив лучше чтобы параметры не участвовали в запросах в хранимой процедуре, а передавались переменным. Спасибо, не знал о таком, учту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 14:53 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
bilov, наоборот прослушивание параметров очень неплохая оптимизация, если учесть нюансы ваших выборок. если у вас есть процедура: Код: sql 1. 2. 3. 4. это будет хорошо работать в случае если у вас процедура скомпилируется с параметром значения @id по которому происходит большинство запросов. к примеру почти все запросы выполняющие процедуру выбирают строки с значением [columnID] = 1 в таком случае первый раз запущенная процедура Код: sql 1. построит план оптимизированный под выборку строк для запросов по columnId = 1 для запросов которые будут выбирать [columnID] = 2 а статистика распределения строк сильно различается (к примеру 80 % на значение 1 и 20 % на значение 2) план используемый процедурой будет не оптимален для выборок по значению 2. если вы выбираете из таблицы где [columnID] - уникальные значения, то в таком случае вы можете переписать процедуру что бы использовать статистические данные (равносильно тому же если вы будете вместо параметра использовать переменные) Код: sql 1. 2. 3. 4. тоже самое Код: sql 1. 2. 3. 4. 5. 6. самый лучший вариант будет использование перекомпиляции отдельной инструкции в процедуре. но это только в том случае если издержки на рекомпиляцию имеют менее затратную стоимость по сравнению с операциями выборки данных в зависимости от изменения значения параметра. Код: sql 1. 2. 3. 4. если у вас процедура запускается очень часто, то такой подход может сказаться на производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 16:44 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
felix_ff, авторнаоборот прослушивание параметров очень неплохая оптимизация, если учесть нюансы ваших выборок. ну что за бредятина, для этого есть OPTIMIZE FOR с конкретным значением и не маятся с тем с каким же значением скомпелировалось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 09:05 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
У меня поле [UID] - первичный ключ таблицы. Название отвратительное, зарезервированное MSSQL, но пока не меняем. И это varchar(50). Понимаю что это тоже плохо и неудобно. От сайта на котором заказы делаются это повелось, пока тоже менять не будем. Параметр @UID1 это либо ключ причем только что добавленное значение либо @UID1=''. Я недавно перенес вызов с @UID1='' в отдельный процесс, потом как-нибудь в отдельном потоке одного процесса сделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 09:52 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
TaPaK, автор хотел поменьше хардкодить. <optimize for @var = > иногда не очень удобно в плане внесения изменений в код. можно нарваться на ситуацию когда у тебя процедура в 5000 строк и значение параметра захардовано значением, а значение вдруг понадобилось изменилось. Не очень удобно вылавливать где программеры там написали, если не брать в расчет поиск регулярками Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:21 |
|
||
|
Ограничение запроса одной записью вызвало очень малообъяснимые тормоза
|
|||
|---|---|---|---|
|
#18+
felix_ff, ещё раз: ваш комментарий в тему "что может быть не плохо" ниочём, ибо план будет тот что скомпелирует первый, при этом всякие дба любют сбрасывать кеши и тп, и какой план будет в кеше неведомо, так что стабильно либо полностью Recompile, либо OPTIMIZE FOR если предпологаемый план более подходящий из-за массы запросов или оптимален по статистике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:24 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39623876&tid=1690002]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 392ms |

| 0 / 0 |
