Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
invm
pavifed,

Повторюсь - ваши картинки неинформативны.
Не хотите сами разбираться с ожиданиями (предположительно) - тогда запустите запрос еще раз и покажите актуальный план выполнения в формате sqlplan, а не картинкой.

Приложил файл. Посмотрите, пожалуйста.

К сообщению приложен файл (sqlplan-01.zip - 10Kb) cкачать

Сообщение было отредактировано: 16 ноя 20, 16:40
16 ноя 20, 16:45    [22233104]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
Yasha123
видите же, что другие thread ждут работающего, которому досталось больше.
вам предлагали при maxdop = 1 запускать,
попробуйте снова и посмотрим, что там за ожидания, исключим CXPACKET


за минуту до вашего комментария успел ответить другому участнику:
При использовании OPTION (MAXDOP 1) представление sys.dm_os_waiting_tasks возвращает пустой набор.
16 ноя 20, 16:47    [22233107]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 1929
ну и где тут "актуальных строк столько же, сколько оценочных"?
кривая оценка числа строк, криво же распределил работу между threads.
все ждали одного.

К сообщению приложен файл. Размер - 16Kb
16 ноя 20, 17:05    [22233126]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 1929
a вообще планы какие-то урезанные
QueryTimeStats напрочь отсутствует.
16 ноя 20, 17:28    [22233154]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
pavifed
Приложил файл.
И каждый по 3 часа выполнялся?

Планы не соответствуют опубликованным картинкам.
И какие-то урезанные. QueryTimeStats может и не быть, ибо появилось в 2017 CU3, а у вас почти что RTM. Но WaitStats появилось в 2016 SP1, а нету.

Откуда планы брали?
16 ноя 20, 18:20    [22233202]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
Yasha123,

я прислал выше куцый план, к сожалению. Вот план после выполнения запроса.

К сообщению приложен файл (UPDATE, ServicePointId = 5, без JOIN HINT, без MAXDOP.sqlplan - 91Kb) cкачать
16 ноя 20, 18:31    [22233214]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 1929
вот в некуцем плане есть и нехилый индекс спул

К сообщению приложен файл. Размер - 7Kb
16 ноя 20, 18:56    [22233237]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
Yasha123,

Как это лечится? (смущённый смайл)
Есть типовые пути решения?
16 ноя 20, 18:58    [22233241]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
pavifed,

попробуйте, там спулирование вроде не для HP добавляется, по сути он должен убрать его из плана.
option (no_performance_spool)
16 ноя 20, 19:04    [22233252]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
felix_ff,

Кажется, не помогло. В Live сразу отображается (при option (no_performance_spool))

К сообщению приложен файл. Размер - 14Kb
16 ноя 20, 19:06    [22233254]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
pavifed,

кароче ему не хватает индекса на VSheduleItem вида
create index ix on [staging].[VSheduleItem] ([StartDateTime]) include ([EndDateTime])


но делать это на такой большой таблице возможно не камильфо.

у Вас в плане изначальный предикат правого входа это IndexSeek на VScheduleItem по предикату ServicePointId = Scalar Operator((5))
оценка такого предиката возвращает оценочное кол-во строк в 87832.

поскольку потом дополнительно нужно фильтроваться по предикатам неравенства сервер решает построить индекс.
но вот только он считает вполне нормальным что левый вход ему дает набор в 376852 строки и можно столько раз посоздавать индекс.

Можете попробовать заскриптовать оценочный план который не содержит IndexSpool и применить его в виде PlanGuide

Сообщение было отредактировано: 16 ноя 20, 19:17
16 ноя 20, 19:21    [22233276]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 1929
felix_ff


кароче ему не хватает индекса на VSheduleItem вида
create index ix on [staging].[VSheduleItem] ([StartDateTime]) include ([EndDateTime])


но делать это на такой большой таблице возможно не камильфо.

да ладно, там девелопер, можно онлайново создать и с компрессией
create index ix on [staging].[VSheduleItem] ([StartDateTime]) include ([EndDateTime])
with(online = on, data_compression = page)
16 ноя 20, 19:39    [22233298]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
pavifed
Member

Откуда:
Сообщений: 20
Yasha123
да ладно, там девелопер, можно онлайново создать и с компрессией
create index ix on [staging].[VSheduleItem] ([StartDateTime]) include ([EndDateTime])
with(online = on, data_compression = page)

Добавил такой индекс. Выполняю запрос, вижу, что по-прежнему используется кластерный индекс pr_id, а не новый ix.

К сообщению приложен файл. Размер - 3Kb
16 ноя 20, 19:52    [22233307]     Ответить | Цитировать Сообщить модератору
 Re: Проблема соединения двух таблиц (26 и 4 млн строк)  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
pavifed,

Перепишите так
UPDATE ed
SET IsBusySegment = 1 
FROM
    staging.VScheduleItem sps inner hash join
	staging.ServicePointScheduleEveryDay ed ON
			sps.ServicePointId = ed.ServicePointId 
			AND (sps.StartDateTime < ed.EndDateTime) 
			AND (sps.EndDateTime > ed.StartDateTime)
WHERE sps.ServicePointId = 5
Спул уйдет.
16 ноя 20, 19:56    [22233310]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить