powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как понять что зависает в запросе?
25 сообщений из 33, страница 1 из 2
Как понять что зависает в запросе?
    #39972989
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день

Как понять, что именно зависает в запросе? Вот сейчас у меня он в зависшем состоянии, что посмотреть?
dm_os_waiting_tasks ничего не показывает по этой сессии.

Запрос несложный, и данных немного. Зависание воспроизводится на разных серверах, но нерегулярно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
INSERT INTO #tt20 WITH (TABLOCK) (_Q_001_F_000RRef,
                                  _Q_001_F_001RRef)
SELECT T1._Q_001_F_000RRef,
       T1._Q_001_F_001RRef
FROM #tt19 T1 WITH (NOLOCK)
INNER JOIN #tt7 T2 WITH (NOLOCK) ON (T1._Q_001_F_001RRef = T2._Q_000_F_000RRef)
INNER JOIN
  (SELECT T4.Q_001_F_001RRef AS Q_001_F_000RRef,
          T4.Q_001_F_000RRef AS Q_001_F_001RRef
   FROM
     (SELECT T5._Q_000_F_000RRef AS Q_001_F_000RRef,
             T6._Q_001_F_000RRef AS Q_001_F_001RRef
      FROM #tt2 T5 WITH (NOLOCK)
      INNER JOIN #tt17 T6 WITH (NOLOCK) ON @0 = @1) T4
   LEFT OUTER JOIN #tt16 T7 WITH (NOLOCK) ON ((T4.Q_001_F_001RRef = T7._Q_001_F_000RRef)
                                              AND (T4.Q_001_F_000RRef = T7._Q_001_F_001RRef))
   WHERE T7._Q_001_F_001RRef IS NULL) T3 ON ((T1._Q_001_F_000RRef = T3.Q_001_F_000RRef)
                                             AND (T2._Q_000_F_001RRef = T3.Q_001_F_001RRef))
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39972990
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат WhoIsActive после часа выполнения
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39972993
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, #tt20 WITH (TABLOCK) еще можно как-то понять... ну типа, минимальное логгирование включится.

Но нахера? На времянках NOLOCK?

#tt7 T2 WITH (NOLOCK)


Вот вам сервер и мстит.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39972997
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типичное поведение, когда в запросе есть NL, где на внутреннем входе таблица с большим числом строк, а на внешнем с маленьким, согласно оценке. В реальности же на внешнем входе тоже много строк.
У вас два таких NL.
Сколько реально строк в #tt2, #tt7 и #tt19?

ЗЫ: Для временных таблиц TABLOCK и NOLOCK смысла не имеют.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973012
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

размеры таблиц:
#tt2 2
#tt7 159
#tt19 855 000

это запросы от 1с, подобные хинты нигде проблем не вызывают
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973022
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
на внешнем с маленьким, согласно оценке. В реальности же на внешнем входе тоже много строк.
Почему сервер может неправильно оценивать размер таблиц, если они были созданы несколько секунд назад?
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973040
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Типичное поведение, когда в запросе есть NL, где на внутреннем входе таблица с большим числом строк, а на внешнем с маленьким, согласно оценке. В реальности же на внешнем входе тоже много строк.
Можете объяснить механику процесса? Или что за тема это, что гуглить, читать?
Я подозреваю что проблема решается просто, перегруппировкой запроса или типа того.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973051
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0
invm
Типичное поведение, когда в запросе есть NL, где на внутреннем входе таблица с большим числом строк, а на внешнем с маленьким, согласно оценке. В реальности же на внешнем входе тоже много строк.
Можете объяснить механику процесса? Или что за тема это, что гуглить, читать?
Я подозреваю что проблема решается просто, перегруппировкой запроса или типа того.


У Вас жизнь портят вот эти два момента:
Код: sql
1.
2.
3.
INNER JOIN #tt17 T6 WITH (NOLOCK) ON @0 = @1) T4
   LEFT OUTER JOIN #tt16 T7 WITH (NOLOCK) ON ((T4.Q_001_F_001RRef = T7._Q_001_F_000RRef)
                                              AND (T4.Q_001_F_000RRef = T7._Q_001_F_001RRef))



по план у они дают сканирование достаточно больших таблиц
#t17 => 612855
#t16 => 675339
на внешнем входе nested loop

думайте как решать сами, или переписывать запрос или индексировать поле _Q_001_F_001RRef
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973052
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0
Можете объяснить механику процесса?
NL - это цикл в котором для каждой строки на внешнем входе просматриваются все строки на внутреннем.
Например, если взять второй NL из вашего плана, - там по оценке на внешнем входе одна строка. Соответственно, сканирование таблицы из 600000+ строк на внутреннем входе должено бы выполниться только один раз.
Теперь представьте что произойдет, если при выполнении запроса на внешнем входе будет 1000 строк, а не 1.

ЗЫ: В пользу версии с NL говорит количество чтений в результате WhoIsActive.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973066
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соглашусь, что действительно дело может быть в nested loops, т.к. когда запрос выполняется без зависаний, то в плане запроса нет nested loops, а только hash match, при аналогичных размерах таблиц
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973082
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смущает только, что запрос зависает намертво
выполняется больше суток и конца и края не видно
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973102
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0
смущает только, что запрос зависает намертво
выполняется больше суток и конца и края не видно


он не зависает, он дофигища вычитывает строк по многу-многу раз.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973119
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff, да, я это образно про зависание. В WhoIsActive видно, что логические чтения растут.

Похоже что действительно неоптимальный план случается, т.к. по моим ручным расчетам получается что перед двумя тяжелыми нестедлупсами будут сотни тысяч строк, а в оценочном плане одна строка почему то. Если сейчас выполняю этот же запрос на этих же данных то план строится другой, который выполняется мнгновенно. В общем, т.к. план нестабильный то надо запрос упрощать. Я так понял.

Быстрый план:
(имена таблиц другие)
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973134
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0,

Попробуйте добавить к запросу option(recompile)
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973143
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
vi0,

Попробуйте добавить к запросу option(recompile)
Не получится. Конечный запрос строит 1с, а она не дает задавать такие настройки.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973187
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки интересно, почему строится насколько неоптимальный план?
Допустимо ли такое для новых временных таблиц?

Хотя я допускаю, конечно, что таблицы были уже, но пустые и переиспользовались, и план соответственно тоже был в кэше.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973199
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0
invm
vi0,

Попробуйте добавить к запросу option(recompile)
Не получится. Конечный запрос строит 1с, а она не дает задавать такие настройки.


возможности добавить индекс на временную таблицу у Вас тоже нет?
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973209
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
возможности добавить индекс на временную таблицу у Вас тоже нет?

есть, но вопрос ведь в том что план сильно некорректный и воспроизводится это нерегулярно
согласитесь?
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973218
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0
felix_ff
возможности добавить индекс на временную таблицу у Вас тоже нет?

есть, но вопрос ведь в том что план сильно некорректный и воспроизводится это нерегулярно
согласитесь?



вы несколько лукавите в плане предоставления данных:

у вас на скрине план запроса с hash-match join-ми используется как начальный вход таблица #tt3 которой нет в изначальном запросе топика.

Выбор между операторами соединения NL/HM/MJ зависит от достаточно многих факторов. могу предположить что в какие то моменты у вас достаточно сильно меняется оценка кардинальности предикатов. обычно с оценкой кардинальности темповых таблиц у сиквела все нормально. поскольку оптимизатор выбирает план запроса по cost-based модели у вас в каких то некоторых случаях план запроса с NL дешевле чем Hash.

вы можете поэкспериментировать сами на данных когда план запроса с NL и когда с HS
в ssms просто на копии этих данных смоделируйте копию плана с помощью жекстого хинтования INNER HASH|LOOP JOIN и смотрите общую оценку планов в попугаях. (понятно что вам нужно будет также все настройки сессии привести в соответствие с теми что используются при подключение из 1c)
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973228
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
вы несколько лукавите в плане предоставления данных: у вас на скрине план запроса с hash-match join-ми используется как начальный вход таблица #tt3 которой нет в изначальном запросе топика.

я написал что "(имена таблиц другие)" - при выполнении запроса платформа 1с динамически назначает имена временных таблиц
я также написал что на тех же данных на той же базе у меня получился другой план
база моя тестовая. не менялась в течение дня
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973229
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще 1с не всегда пересоздает новые временные таблицы, иногда может использовать прежние в течение сеанса, если их структура такая же
вот здесь у меня подозрение - что использовался план запроса из кэша для другого наполнения этих таблиц
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973234
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Выбор между операторами соединения NL/HM/MJ зависит от достаточно многих факторов. могу предположить что в какие то моменты у вас достаточно сильно меняется оценка кардинальности предикатов. обычно с оценкой кардинальности темповых таблиц у сиквела все нормально. поскольку оптимизатор выбирает план запроса по cost-based модели у вас в каких то некоторых случаях план запроса с NL дешевле чем Hash.

вы можете поэкспериментировать сами на данных когда план запроса с NL и когда с HS
в ssms просто на копии этих данных смоделируйте копию плана с помощью жекстого хинтования INNER HASH|LOOP JOIN и смотрите общую оценку планов в попугаях. (понятно что вам нужно будет также все настройки сессии привести в соответствие с теми что используются при подключение из 1c)
я соглашусь со многим из того что вы написали, но все таких хочу акцентировать - как я увидел, получается некорректный план, не просто неоптимальный а именно некорректный, в том что по оценке должна быть одна строка а по факту сотни тысяч. Поправьте меня если я ошибаюсь.

Попробую может эксперименты с хинтами, но чисто для расширения картины ситуации, может быть увижу что то.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973268
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0,

в каком смысле - некорректный? Любой план, который приводит к нужному результату - корректен. Оценка статистики подчиняется определённым законам. Скорее всего, вы создаете временную таблицу и добавляете в нее большой объём данных.
Попробуйте потом создать статистики для этой таблицы с учетом столбцов запроса и проверьте план.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973400
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,
План некорректный т.к. нужного результата нет, если выражаться вашими словами. В теории он должен давать результат. а по факту выливается в переборы которые занимают неопределенное количество времени - небольшой запрос выполнялся больше суток и его приходится прерывать.
...
Рейтинг: 0 / 0
Как понять что зависает в запросе?
    #39973421
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может ли сервер построить такой неоптимальный план при корректной статистике таблиц?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как понять что зависает в запросе?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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