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

Откуда:
Сообщений: 24
Проблема вот в чем. в конце запроса 2 join`а. в таком виде запрос выполняется 2 мин. если закоментить любой один join в конце. запрос выполняется меньше секунды. а мне нужно туда еще join`ов добавлять.

Размеры таблиц: Locations ~ 40 тыс., fn_lc_properties() ~ 40 тыс., fn_batch_properties() ~ 252 записи

Кто знает в чем кроется причина, как обойти?


  Select * 
  FROM(
  select 
   o.LcAdr,
   LIDWithParent,
	o.BID as [Партия]
from (
		SELECT 
			case Locations.Prefix
				When 'U' Then
					Locations.Parent_ID
				else
					Out_Candidates.LID
			end AS LIDWithParent,
			Out_Candidates.*
		  FROM dbo.Out_Candidates 
		  Left Join dbo.Locations AS Locations on Locations.LID = Out_Candidates.LID
	   ) o 
Where o.LID not IN (SELECT distinct LID FROM dbo.OUT_RES)
) w
join fn_lc_properties() lc_properties on lc_properties.obj_ID = w.LIDWithParent and lc_properties.l_ForStorage = 1
join fn_batch_properties() bp on w.Партия = bp.obj_ID and bp.b_BatchType = 0 and isnull(bp.b_Blocked, 0) = 0
26 июл 12, 10:14    [12917869]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
во вложенном запросе w на выходе получается 252 записи всего
26 июл 12, 10:16    [12917885]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Соколов Антон,

А покажите текст функций fn_lc_properties() и fn_batch_properties().
26 июл 12, 10:16    [12917893]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
обычная выборка из одноименных таблиц с указанием типов каждого поля
26 июл 12, 10:18    [12917906]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
GO
/****** Object:  UserDefinedFunction [dbo].[fn_lc_properties]    Script Date: 07/26/2012 10:17:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_lc_properties]
()
RETURNS TABLE
RETURN(SELECT CAST(l_PrintName as nchar(36)) l_PrintName,
              CAST(l_ForStorage as smallint) l_ForStorage,
              CAST(l_ForPickup as smallint) l_ForPickup,
              CAST(l_FT as nchar(30)) l_FT,
              l_Prior,
              CAST(l_Floor as smallint) l_Floor,
              CAST(l_Kind as nchar(36)) l_Kind,
              CAST(l_Blocked as smallint) l_Blocked,
              CAST(l_type as nchar(36)) l_type,
              l_weight,
              l_volume,
              l_Percent_full,
              CAST(l_ABC as nchar(1)) l_ABC,
              l_MaxCapacity,
              obj_ID
       FROM Location_Properties src PIVOT(MAX(PValue) FOR [PName] IN([l_PrintName],
                                                                     [l_ForStorage],
                                                                     [l_ForPickup],
                                                                     [l_FT],
                                                                     [l_Prior],
                                                                     [l_Floor],
                                                                     [l_Kind],
                                                                     [l_Blocked],
                                                                     [l_type],
                                                                     [l_weight],
                                                                     [l_volume],
                                                                     [l_Percent_full],
                                                                     [l_ABC],
                                                                     [l_MaxCapacity])) pvt)
26 июл 12, 10:18    [12917910]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
оказывается даже не 2 минуты, а 7 минут
26 июл 12, 10:21    [12917937]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Соколов Антон,

Думал может функция не inline. Но нет. Не вышел фокус. Планы смотреть надо тогда .Статистику может обновить.
26 июл 12, 10:25    [12917961]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Соколов Антон,

Придется либо поизучать план и поколдовать над функциями, либо запихнуть результаты выполнения функций во временные таблицы и в запросе джойнить уже их. Благо у вас запрос это позволяет. Видимо такое поведение объясняется тем, что функции, так или иначе мешают оптимизатору сделать правильные оценки.
26 июл 12, 10:26    [12917967]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
SomewhereSomehow
Соколов Антон,

Видимо такое поведение объясняется тем, что функции, так или иначе мешают оптимизатору сделать правильные оценки.


Можно попробовать еще отказаться от функции, а завернуть запрос во вью. Может оптимизатору легче станет.
26 июл 12, 10:28    [12917983]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

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

Временные таблицы юзать к сожалению не имею возможности, т.к. запросы выполняются через Ole DB.

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

Про планы нужно читать, не сталкивался еще
26 июл 12, 10:32    [12918012]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
не знаю важно или нет, но если сделать левые соединения, то проблема время выполнения меньше секунды
26 июл 12, 10:33    [12918021]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
а еще я видимо соврал в таблицах, которые я пытаюсь присоединить другая структура. не знаю правда как так получается. они хранят набор свойств. и имеют всего три столбца: UID записи, UID свойства, значение свойства
26 июл 12, 10:36    [12918041]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
изменил текст join`ов на прямой запрос к таблицам:

join Location_Properties lp on lp.obj_ID = w.LIDWithParent and lp.PName = 'l_ForStorage' and CAST(lp.PValue as smallint) = 1
join Batch_Properties bp on w.Партия = bp.obj_ID and bp.PName = 'b_BatchType' and bp.PValue =  0


ситуации это не изменило.

учитывая стурктуру Location_Properties в ней не меньше 600 тыс записей
26 июл 12, 10:42    [12918078]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Соколов Антон,

Если вы хотите более конкретных советов, то выкладывайте действительные планы "быстрого с лефт джойном" и "медленного с иннер" запроса.
26 июл 12, 10:44    [12918087]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
очень хочу разобраться. осталось найти где план запроса посмотреть
26 июл 12, 10:47    [12918115]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Соколов Антон
очень хочу разобраться. осталось найти где план запроса посмотреть

set showplan_xml on
26 июл 12, 10:49    [12918130]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Не-не, лучше set statistics xml или выполнить с нажатой кнопочкой include actual execution plan в SSMS. В действительном плане можно будет посмотреть на расхождения оценок.
26 июл 12, 10:53    [12918163]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
Alexandr Kr.,

сам xml 2300 строк. выложил план в архив

К сообщению приложен файл (1.rar - 11Kb) cкачать
26 июл 12, 10:54    [12918171]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alexandr Kr.
SomewhereSomehow
Соколов Антон,

Видимо такое поведение объясняется тем, что функции, так или иначе мешают оптимизатору сделать правильные оценки.


Можно попробовать еще отказаться от функции, а завернуть запрос во вью. Может оптимизатору легче станет.
in-line функция ничем не хуже представления.
И оптимизатору вряд ли мешает, поскольку он её встраивает в запрос, а уж потом оптимизирует.
Стало быть, к моменту выбра плана никакой функции для оптимизатора уже как бы и нет
26 июл 12, 12:17    [12918776]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Но вот сам запрос с многочисленными вложенными подзапросами (зачем они?! )
вызывает сомнение. Особенно вот такие перлы:
o.LID not IN (SELECT distinct LID FROM dbo.OUT_RES)
Зачем там DISTINCT??
Да и NOT IN(SELECT ...) - очень рискованная конструкция.
Вот появится хотя бы один dbo.OUT_RES.LID IS NULL - и усё!
26 июл 12, 12:26    [12918834]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Соколов Антон
Alexandr Kr.,

сам xml 2300 строк. выложил план в архив

Выложите действительный план, а не оценочный. И желательно, еще действительный план "быстрого" запроса, для сравнения, если такой есть.
26 июл 12, 12:27    [12918846]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

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

хотел бы по подробнее узнать чем вас смущает эта конструкция. но проблема не в ней.

Если верить оценке стоимости 91% времени у меня занимает просмотр кластеризованного индекса Location_Properties. Количество выполнений 252. факт кол-во строк 9.5 млн.

Правильно ли я понял что мне нужно как то заменить это на не кластеризованный просмотр?
26 июл 12, 12:31    [12918873]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Соколов Антон
iap,

хотел бы по подробнее узнать чем вас смущает эта конструкция
Я ж вроде написал?
26 июл 12, 12:34    [12918904]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

Откуда:
Сообщений: 24
iap,
т.е. как я понимаю вас только смущает что пожет попастся NULL в выборке. чем мне это помешает? тем что мои значения не смогут принимать NULL?
26 июл 12, 12:36    [12918925]     Ответить | Цитировать Сообщить модератору
 Re: долго выполняется запрос JOIN  [new]
Соколов Антон
Member

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

да. какой то косяк с первым планом вышел.

К сообщению приложен файл (медленный.rar - 11Kb) cкачать
26 июл 12, 12:37    [12918931]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить