Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NOT IN Actual Executed plan достать если запрос виснет / 14 сообщений из 14, страница 1 из 1
23.01.2020, 19:28
    #39918078
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Добрый день всем.
SQL 2012

Есть несложынй запрос
Очень тормозящий при одном значении - вместо 10 сек работает > 5 мин и яего снимаю

Код: 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.
SELECT DISTINCT
      sc.id_SalesChannel	AS id_item,
      sc.name				AS name_item,
      sc.active				AS active
    FROM
      F_Pogr fp
        JOIN Cm_Outlet co WITH (NOLOCK)
          ON co.id_cm_outlet = fp.id_cm_outlet
        JOIN F_Firm ff WITH (NOLOCK)
          ON fp.id_firm = ff.id_firm
        JOIN Cm_Client cc WITH (NOLOCK)
          ON cc.id_cm_client = ff.id_cm_client
        JOIN CmClient2SalesChannel AS ccsc WITH (NOLOCK)
          ON ccsc.id_Cm_Client = cc.id_cm_client
        JOIN SalesChannel AS sc  WITH (NOLOCK)
          ON sc.id_SalesChannel = ccsc.id_SalesChannel   
    WHERE
      cc.Active = 1 AND
      co.Active = 1 AND
      fp.id_pogr NOT IN
      (
      	SELECT
      	  fpca.id_pogr
        FROM
          F_Firm_CommandAgent ffca
            JOIN F_Pogr_CommandAgent fpca WITH (NOLOCK)
              ON ffca.id_FirmCommand = fpca.id_FirmCommand
      	WHERE
      	  ffca.id_command = @id_param
      )



@id_param - я подставляю конкертные значения и запускаю в SSMS
И вот с одинм значением виснет реально

связано нав. с етм что при этом параметре общий резалтсет запроса пустой
(подзапрос возвращате 16 000 записей )
(прричем резалтсет там не может быть больше 15 записей !! )

NOT IN - ясно не лучший выбор
и LEFT JOIN решает проблему - все работает за 2 сек
Estimated plan вытаскивается без проблем ( приатачил его )

а вот как вытащить Actual Execute plan при проблемном значении если запрос виснет в SSMS (и SentryOne Plan Explorer )?

я понимаю что это parametr sniffing - и план сохраненный для одного значения


ведь в другом случае подзапрос вовзваращет 32000 записей - работате чуть дольше
т.е разница походу в том что с проблемным значением общий резалтсет пустой
но хочется понять причину
...
Рейтинг: 0 / 0
23.01.2020, 20:05
    #39918086
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор
как вытащить Actual Execute plan при проблемном значении если запрос виснет в SSMS (и SentryOne Plan Explorer )?
Никак.
Гулин Федор
Estimated plan вытаскивается без проблем ( приатачил его )
Что-то не то вытащили. Этот оценочный план с константой вместо переменной бесполезен в контексте заданного вопроса.
Давайте оценочный план с ffca.id_command = @id_param
...
Рейтинг: 0 / 0
23.01.2020, 20:32
    #39918092
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор,

Предполагаю, что у вас вот это - 16854682
...
Рейтинг: 0 / 0
24.01.2020, 02:35
    #39918148
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
invm,

+1. сам недавно наткнулся на тяжелый запрос с not in(), который из-за nested loop отрабатывал очень долго, после переписывания в not exists() - практически мгновенно
...
Рейтинг: 0 / 0
24.01.2020, 09:18
    #39918192
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
invm
Гулин Федор,

Предполагаю, что у вас вот это - 16854682


Нет
Nolock убрал - ничего не изменилось

так я запускал запрос с конкетным значением = 40
он также тормозит
поэтому и план от него.
тормозит (точнее вешает )и при вызове из SP с параметром и с одним конкертным значением

ps счас проверю
99% Not Exists тоже поможет
...
Рейтинг: 0 / 0
24.01.2020, 09:32
    #39918205
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
также тормозит (виснет) с одним значением - план похоже тот же

Код: 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.
SELECT DISTINCT
      sc.id_SalesChannel	AS id_item,
      sc.name				AS name_item,
      sc.active				AS active
    FROM
      F_Pogr fp
        JOIN Cm_Outlet co --WITH (NOLOCK)
          ON co.id_cm_outlet = fp.id_cm_outlet
        JOIN F_Firm ff --WITH (NOLOCK)
          ON fp.id_firm = ff.id_firm
        JOIN Cm_Client cc --WITH (NOLOCK)
          ON cc.id_cm_client = ff.id_cm_client
        JOIN CmClient2SalesChannel AS ccsc --WITH (NOLOCK)
          ON ccsc.id_Cm_Client = cc.id_cm_client
        JOIN SalesChannel AS sc  --WITH (NOLOCK)
          ON sc.id_SalesChannel = ccsc.id_SalesChannel   
    WHERE
      cc.Active = 1 
      AND       co.Active = 1 
--      AND N2.id_pogr IS null -- not in - пеерписанный запрос работает оч. быстро
      AND
	  NOT EXISTS -- !  также тормозит 
	  (
	  	SELECT 1 
	  	FROM
	  	      (
      	SELECT   DISTINCT    
      	  fpca.id_pogr
        FROM
          F_Firm_CommandAgent ffca --WITH (NOLOCK)
            JOIN F_Pogr_CommandAgent fpca --WITH (NOLOCK)
              ON ffca.id_FirmCommand = fpca.id_FirmCommand
      	WHERE
      	  ffca.id_command = 40 -- 6 -- 40 -- 40 -- 40 -- 1-- 6 -- 6-- @id_param
      	--  and fpca.id_pogr IS NOT null
	  	      )  B
	  	WHERE  
	  	      B.id_pogr = fp.id_pogr
	  )	
...
Рейтинг: 0 / 0
24.01.2020, 12:21
    #39918315
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор,

Сколько строк в F_Firm_CommandAgent для id_command = 40?
...
Рейтинг: 0 / 0
25.01.2020, 13:50
    #39918657
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор,

авторИ вот с одинм значением виснет реально
первое, что приходит в голову - ошибка в оценке кардинальности. В результате оптимизатор предполагает, что в наборе будет одна строка, а их намного больше. Кроме того, может не использоваться параллелизм из-за ошибочной оценки времени выполнения. Смотрите на план запроса.
...
Рейтинг: 0 / 0
27.01.2020, 09:50
    #39918959
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
прогнал еще 1 раз с утра

Код: sql
1.
2.
3.
4.
UPDATE STATISTICS F_Pogr_CommandAgent
UPDATE STATISTICS F_Firm_CommandAgent

SELECT COUNT(*) FROM  F_Firm_CommandAgent where id_command = 40 -- 4726



Если прописать
@id_param = 40 то отрабатоло за 1.5 минуты (медленно - но все таки отработало )
а если захрадкодить
ffca.id_command = 40
то > 5 мин и я снимаю

Прилагаю
actial plan ffca.id_command = @id_param -- 40 к-й отрабоал
Estimated plan for ffca.id_command = 40
...
Рейтинг: 0 / 0
27.01.2020, 09:51
    #39918960
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
оказыается нельзя 2 атачмента к 1 сообщения
прилагаю
esitm_plan_for_40_HARDCODE.sqlplan
...
Рейтинг: 0 / 0
27.01.2020, 10:38
    #39918979
NOT IN Actual Executed plan достать если запрос виснет
Код: 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.
CREATE NONCLUSTERED INDEX ix ON F_Pogr (id_cm_outlet) INCLUDE (id_pogr, id_firm)
CREATE NONCLUSTERED INDEX ix ON F_Pogr_CommandAgent (id_FirmCommand) INCLUDE (id_pogr)
CREATE NONCLUSTERED INDEX ix ON F_Firm_CommandAgent (id_command, id_FirmCommand) INCLUDE (id_pogr)
GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

IF OBJECT_ID('tempdb.dbo.#F_Pogr') IS NOT NULL
    DROP TABLE #F_Pogr

SELECT fp.id_cm_outlet
     , fp.id_pogr
     , fp.id_firm
INTO #F_Pogr
FROM F_Pogr fp
WHERE fp.id_cm_outlet IN (SELECT co.id_cm_outlet FROM Cm_Outlet co WHERE co.active = 1)

SELECT DISTINCT sc.id_SalesChannel AS id_item
              , sc.name AS name_item
              , sc.active AS active
FROM #F_Pogr fp
JOIN F_Firm ff ON fp.id_firm = ff.id_firm
JOIN Cm_Client cc ON cc.id_cm_client = ff.id_cm_client
JOIN CmClient2SalesChannel AS ccsc ON ccsc.id_Cm_Client = cc.id_cm_client
JOIN SalesChannel AS sc ON sc.id_SalesChannel = ccsc.id_SalesChannel
WHERE cc.active = 1
    AND fp.id_pogr NOT IN (
        SELECT fpca.id_pogr
        FROM F_Firm_CommandAgent ffca
        JOIN F_Pogr_CommandAgent fpca ON ffca.id_FirmCommand = fpca.id_FirmCommand
        WHERE ffca.id_command = @id_param
    )
OPTION(RECOMPILE)
...
Рейтинг: 0 / 0
27.01.2020, 10:46
    #39918986
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор,

Для начала обновите статистику для всех таблиц и индексов из запроса с FULL SCAN
...
Рейтинг: 0 / 0
27.01.2020, 11:51
    #39919011
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
invm,
ДА
с этого наверно надо было и начинать - я обновил 2 таблицы в подзапросе
а надо было ВСЕ

подозреваю что дело было в CmClient2SalesChannel
она красным подсвечитвается в SQL Sentry (RID Lookup )

Код: sql
1.
с FULL SCAN 


RID Lookup - это Full Scan ??
...
Рейтинг: 0 / 0
27.01.2020, 12:02
    #39919016
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NOT IN Actual Executed plan достать если запрос виснет
Гулин Федор,

авторRID Lookup - это Full Scan
нет. Это лукап по heap
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NOT IN Actual Executed plan достать если запрос виснет / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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