Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Ткните носом с чего начать
ALTER PROCEDURE [dbo].[getList]
(@id AS INT, @isInUse AS BIT = 0, @all AS BIT = 0)
AS
BEGIN
	SET NOCOUNT ON;
	SELECT T.id,
	       T.name,
	       U.unit,
	       T1.company,
	       (
	           SELECT COUNT(*)
	           FROM   Comments  AS C WITH (NOLOCK) INNER
	                  JOIN L    AS L WITH (NOLOCK)
	                       ON  C.id = L.id
	           WHERE  L.id = @id
	       )                         AS num_c,
	       T2.e_name,
	       S.sn_id,
	       S.sn_name,
	       (
	           SELECT COUNT(*)
	           FROM   Dates AS D WITH (NOLOCK)
	           WHERE  d.id = @id
	       )                         AS uC,
	       CASE 
	            WHEN EXISTS(
	                     SELECT [file]
	                     FROM   Docs WITH (NOLOCK)
	                     WHERE  id = @id
	                 ) THEN 1
	            ELSE 0
	       END                       AS qEF,
	       ISNULL(
	           (
	               SELECT TOP 1 CAST(M.id AS NVARCHAR(MAX)) + '.'
	               FROM   manq      AS mq WITH (NOLOCK) INNER
	                      JOIN man  AS M WITH (NOLOCK)
	                           ON  mq.id = man.id
	               WHERE  mq.id = @eq_id
	                      AND man.s_id < 3
	           ),
	           ''
	       )                         AS num,
	       CAST(T3.date1 AS DATE)    AS cld,
	       T3.date1                  AS cld1,
	       T3.location_id            AS clid,
	       C.cnum,
	       C.cid,
	       '' AS                        fk_p_id,
	       T4.r_c
	FROM   [dbo].E15                 AS T WITH (NOLOCK)
	                           
	                           INNER
	       JOIN [dbo].[Units]        AS U WITH (NOLOCK)
	            ON  T.id = U.id
	       INNER JOIN [dbo].[Cs]     AS T1 WITH (NOLOCK)
	            ON  T1.id = T.id
	       LEFT JOIN [dbo].[RLCo]    AS C WITH (NOLOCK)
	            ON  T.id = C.id
	       INNER JOIN [dbo].[Los]    AS T3 WITH (NOLOCK)
	            ON  T3.id = T.id
	            AND T3.id = (
	                    SELECT TOP 1       pk_EqL_id
	                    FROM   RL_qLoc  AS qL WITH (NOLOCK)
	                    WHERE  qL.id = T.id
	                )
	            AND T3.id = @id
	       INNER JOIN [dbo].[we]     AS T2 WITH (NOLOCK)
	            ON  T3.id = T2.id
	       INNER JOIN [dbo].[Sec]    AS S WITH (NOLOCK)
	            ON  T3.id = S.id
	       INNER JOIN [dbo].[ases]   AS B WITH (NOLOCK)
	            ON  T3.id = B.id
	       INNER JOIN [dbo].[gs]     AS R WITH (NOLOCK)
	            ON  T3.id = R.id
	       INNER JOIN [dbo].[eques]  AS T4
	            ON  T.id = T4.id
	WHERE  (T.all = 0 OR @all = 1)
	       AND (@isInUse = 0 OR W.active = @isInUse)
	ORDER BY
	       T3.date1 DESC;
END
29 май 14, 00:53    [16088818]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Cheerful Calf,

Как обычно, с планов:)
29 май 14, 01:22    [16088848]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Cheerful Calf,

Ну, а откуда будет быстро, если вы, как я понял, выбираете все данные какие есть.

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

Из того, что сразу бросается в глаза:

	            AND T3.id = (
	                    SELECT TOP 1       pk_EqL_id
	                    FROM   RL_qLoc  AS qL WITH (NOLOCK)
	                    WHERE  qL.id = T.id
	                )

Можно попробовать заменить на EXISTS, да и вообще TOP без ORDER BY не имеет смысла.

Потом, не понятно, зачем эти подзапросы нужны в SELECTе, если они для каждой строки будут возвращать одно и тоже значение. Имеет смысл посчитать их отдельно и подставить переменные в запрос:
	       ISNULL(
	           (
	               SELECT TOP 1 CAST(M.id AS NVARCHAR(MAX)) + '.'
	               FROM   manq      AS mq WITH (NOLOCK) INNER
	                      JOIN man  AS M WITH (NOLOCK)
	                           ON  mq.id = man.id
	               WHERE  mq.id = @eq_id
	                      AND man.s_id < 3
	           ),
	           SELECT COUNT(*)
	           FROM   Comments  AS C WITH (NOLOCK) INNER
	                  JOIN L    AS L WITH (NOLOCK)
	                       ON  C.id = L.id
	           WHERE  L.id = @id
(
	           SELECT COUNT(*)
	           FROM   Dates AS D WITH (NOLOCK)
	           WHERE  d.id = @id
	       )                         AS uC,
	       CASE 
	            WHEN EXISTS(
	                     SELECT [file]
	                     FROM   Docs WITH (NOLOCK)
	                     WHERE  id = @id
	                 ) THEN 1
	            ELSE 0
	       END         

И вот этим вы лишаете оптимизатор возможности использовать Index Seek:
	WHERE  (T.all = 0 OR @all = 1)
	       AND (@isInUse = 0 OR W.active = @isInUse)


Ну, и информативность названий таблиц и полей нулевая.
29 май 14, 07:41    [16088957]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
aleks2
Guest
WarAnt
Cheerful Calf,

Как обычно, с планов:)


Ответ неверный.

Начинать надо с медитации на тему: "а нахера мне такой запрос?"
29 май 14, 07:57    [16088961]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Crimean
Member

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

+1 но все, почему-то, кидаются "люто, бешено" (ц) "хинтовать" запросы вместо поиска эффективного решения собственно задачи
впрочем, зачастую уже все написано и надо хоть как-то "запинать" и оно еще немного "поработает" ))
29 май 14, 09:28    [16089139]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Ruuu
	            AND T3.id = (
	                    SELECT TOP 1       pk_EqL_id
	                    FROM   RL_qLoc  AS qL WITH (NOLOCK)
	                    WHERE  qL.id = T.id
	                )


Можно попробовать заменить на EXISTS, да и вообще TOP без ORDER BY не имеет смысла.
Эмм, как?
Ruuu
И вот этим вы лишаете оптимизатор возможности использовать Index Seek:
	WHERE  (T.all = 0 OR @all = 1)
	       AND (@isInUse = 0 OR W.active = @isInUse)
Чем именно, @all=1?

PS: Пошел делать план :)
29 май 14, 10:01    [16089274]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ruuu
да и вообще TOP без ORDER BY не имеет смысла
В данном случае как раз имеет!
И смысл именно "EXISTS"!
29 май 14, 10:09    [16089311]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Crimean
Member

Откуда:
Сообщений: 13147
"top 1" вместо "exists" могли и специально написать, чтобы в loop свалиться, скажем, вместо sort + merge
29 май 14, 10:35    [16089483]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Сервер
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) 
	Apr 22 2011 19:23:43
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


План (после ночных преобразований, но смысл и тормоза те же, только в профиль)

К сообщению приложен файл (plan.txt - 20Kb) cкачать
29 май 14, 10:38    [16089499]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
План

Там
- предварительные планы
- нет плана PROCEDURE [dbo].[getList]

ЗЫ
Запрос надо переписывать полностью
29 май 14, 10:45    [16089545]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Glory
предварительные планы
вот статитстикс план
Glory
нет плана PROCEDURE [dbo].[getList]
это теперешний её вариант


Glory
Запрос надо переписывать полностью

ок, как и говорил ткните носом в самое проблематичное, с чего начать?

К сообщению приложен файл (STAT_P.xls - 66Kb) cкачать
29 май 14, 10:55    [16089642]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
ок, как и говорил ткните носом в самое проблематичное, с чего начать?

С формулировки задачи
29 май 14, 10:56    [16089646]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
это теперешний её вариант

Т.е. теперь в текст запроса насовали еще UDF-ов ?
29 май 14, 10:57    [16089653]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Glory
Cheerful Calf
это теперешний её вариант

Т.е. теперь в текст запроса насовали еще UDF-ов ?
Ну да.. Я ж и говорю: дайте направление. UDF - это еще не самое чудесатое, что я мог сделать для оптимизации и ускорения.
29 май 14, 10:59    [16089669]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
Я ж и говорю: дайте направление.

Нанять специалиста
29 май 14, 11:01    [16089687]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Glory
Cheerful Calf
Я ж и говорю: дайте направление.

Нанять специалиста
Я смотрю, уважаемый, по прошествии многих лет, Вы своими ответами на форуме еще более мастерски научились маскировать своё стремление к нормальному общению и получению вежливых ответов от собеседников.

Конкретно по переделыванию запроса можете что-то посоветовать (кроме перенести топик в форум работа)?
29 май 14, 11:10    [16089767]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
Конкретно по переделыванию запроса можете что-то посоветовать

Не в коня корм.
Ваш уровень знаний "по прошествии многих лет" остался таким же низким.
Наверное потому, что вы по-прежнему тратите свое время на ПТ.
29 май 14, 11:13    [16089808]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Cheerful Calf
Member

Откуда: Lithuania
Сообщений: 6999
Glory
Cheerful Calf
Конкретно по переделыванию запроса можете что-то посоветовать

Не в коня корм.
Ваш уровень знаний "по прошествии многих лет" остался таким же низким.
Наверное потому, что вы по-прежнему тратите свое время на ПТ.
Жаль вашего времени потраченного мой социально-поведенческий анализ, я надеялся, что вы уделите те несколько секунд моему конкретному вопросу, но, увы. Надеюсь Вы получили некое удовлетворение и сможете теперь дать возможность и другим участникам отвечать в данной ветке.
29 май 14, 11:27    [16089962]     Ответить | Цитировать Сообщить модератору
 Re: Toрмозит процедура...  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cheerful Calf
Надеюсь Вы получили некое удовлетворение и сможете теперь дать возможность и другим участникам отвечать в данной ветке.

А я кому-то запрещаю давать ответы ? Или удаляю ответы ?
Вот вам уже ответили 16088961
И вот еще 16089139

Cheerful Calf
Жаль вашего времени потраченного мой социально-поведенческий анализ,

Вам же не жаль было времени на аналогичный анализ

Cheerful Calf
я надеялся, что вы уделите те несколько секунд моему конкретному вопросу, но, увы

Если в 1кг гавна добавить 1кг варенья, то получится 2кг гавна. Вот кратко анализ вашего запроса.
29 май 14, 11:31    [16089998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить