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

Откуда:
Сообщений: 170
Подскажите, можно сделать какой то вывод по поводу увлечения времени выполнения запроса глядя, на план выполнения.

Приводить пример всех таблиц будет очень громоздко....

К сообщению приложен файл (Routes.7z - 7Kb) cкачать
11 июл 12, 17:02    [12852069]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
step_ks
Member

Откуда:
Сообщений: 936
актуальный план был бы полезнее. + сам запрос в нормальном виде.
11 июл 12, 22:09    [12853236]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Routes.7z

<Лять>
Кто RAR, кто 7zip. Ёпрст. Ради 3х бит нужно так сильно выёживаться.
Для тупых: Zip работает на любой OS из каробки!!!111
Тут не может быть никаких НО.
</Лять>

Я конечно понимаю что он (7zip) Open Source и поставить легко, а на линухе ещё проще, и то что делал самый классный (практически единственно классный) чувак, но стандарт есть стандарт и уважение к собеседникам, тем более у кого спрашиваешь.

Спасибо за понимание.
12 июл 12, 00:53    [12853767]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
danton
Подскажите, можно сделать какой то вывод по поводу увлечения времени выполнения запроса глядя, на план выполнения.

Приводить пример всех таблиц будет очень громоздко....
Для начала обновите статистику на вашей многомилионной таблице.
12 июл 12, 01:41    [12853839]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
сам запрос в нормальном виде.

danton
INSERT	saleit_db_Danone.dbo.tbl_RouteSalesSum	(  RouteID,   PlanID,         RouteName,    [Month],    [Year],  KodeMonth,SalesVolume)
SELECT						rr.RouteID,pd.PlanID,c.cus_SalesRouteID,t.theMonth ,t.TheYear ,t.KodeMonth
	,CASE	WHEN pr.[Type] = 0
		THEN Sum(s.Caf) 
		ELSE Sum(s.Kg)
		END		AS KG 
FROM	          Mart.dbo.SalesD s
	LEFT JOIN Mart.dbo.CustomersD			c  ON c.cus_CustomerID	= s.CustomerID
	LEFT JOIN Mart.dbo.[Time]			t  ON t.TheDate		= s.TheDate
	LEFT JOIN Mart.dbo.tbl_transcode		tt ON tt.ProductIDOld	= s.ProductID
	LEFT JOIN saleit_db_Danone.dbo.tbl_PlanDetails	pd ON pd.ProductID	= tt.ProductIDNew
	LEFT JOIN saleit_db_Danone.dbo.RoutesN		rr ON rr.RouteName	= c.cus_SalesRouteID
	LEFT JOIN saleit_db_Danone.dbo.tbl_Plans	ps ON ps.PlanID		= pd.PlanID
	LEFT JOIN saleit_db_Danone.dbo.tbl_PlanRoutes	pr ON pr.PlanID		= pd.PlanID
							  AND pr.RouteID	= rr.RouteID
WHERE	    c.cus_SalesRouteID	IN (SELECT rn.RouteName FROM saleit_db_Danone.dbo.RoutesN rn WHERE rn.ActiveRoute = 1)
	AND s.TheDate		>= Convert(Char,                DateAdd(Day,1-DatePart(Day,GetDate()),GetDate())   ,112)	-- Начало текущего месяца
	AND s.TheDate		<= Convert(Char,DateAdd(Month,1,DateAdd(Day,1-DatePart(Day,GetDate()),GetDate()))-1,112)	-- Конэц  текущего месяца
	AND Left(rr.RouteID,1)	 = ps.PlanPlatform
	AND pd.PlanID		IN (
		SELECT	pp.PlanID
		FROM	saleit_db_Danone.dbo.tbl_Plans pp 
		WHERE	    pp.PlanDateEnd	<= Convert(Char,DateAdd(Month,1,DateAdd(Day,1-DatePart(Day,GetDate()),GetDate()))-1,112)	-- Конэц  текущего месяца
			AND pp.PlanDateStart	>= Convert(Char,                DateAdd(Day,1-DatePart(Day,GetDate()),GetDate())   ,112)	-- Начало текущего месяца
		)
GROUP BY rr.RouteID
	,pd.PlanID
	,c.cus_SalesRouteID
	,t.theMonth
	,t.TheYear
	,t.KodeMonth
	,pr.[Type]
12 июл 12, 10:40    [12854689]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
danton,
у вас там сплошной скан таблиц,постройте нужные индексы
перепишите условия типа этого
and s.TheDate>=convert(char,DATEADD(day,1-DATEPART(day,GETDATE()),GETDATE()),112)
and s.TheDate<=convert(char,DATEADD(MONTH,1,DATEADD(day,1-DATEPART(day,GETDATE()),GETDATE()))-1,112)
and left(rr.RouteID,1) = ps.PlanPlatform

махните in на exists.
12 июл 12, 10:45    [12854727]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
danton
Подскажите, можно сделать какой то вывод по поводу увлечения времени выполнения запроса глядя, на план выполнения.
Вывод очень не утешительный.
Нет индексов (почти никаких), нет некоторых ключей на таблах (есть nonclustered unique index на ID в куче, ужос). Практически одни сканы, что учеличивает время пропорционально данным.

Случай на грани "это не лечится".
12 июл 12, 10:47    [12854749]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
danton
Member

Откуда:
Сообщений: 170
Cпасибо всем за комменты, этим как раз и занимаюсь.

denis2710
перепишите условия типа этого
and s.TheDate>=convert(char,DATEADD(day,1-DATEPART(day,GETDATE()),GETDATE()),112)
and s.TheDate<=convert(char,DATEADD(MONTH,1,DATEADD(day,1-DATEPART(day,GETDATE()),GETDATE()))-1,112)
and left(rr.RouteID,1) = ps.PlanPlatform


махните in на exists.


Вопрос уже не по теме, как exists увеличит производительность и в каком виде лучше разворачивать строки?
12 июл 12, 10:57    [12854817]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
danton,
Ну для начала посмотреть по поиску как лучше работать с датами в SQL Server.Я бы например в переменные положил значения.
left(rr.RouteID,1)
сие в вычисляемое поле положить.
danton
как exists увеличит производительность

может и ни как
Можно исчо перестать даты в строке хранить например.(судя по convert char(30))
12 июл 12, 11:27    [12855122]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
danton
Member

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

Ну я серьезно спрашивал)
Запрос не я писал, cам не знаю зачем convert делался
12 июл 12, 12:21    [12855706]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
danton, "мопед не мой,я просто разместил объявление"
так я и серьезно и сказал,что может быть ни какого прироста производительности,но хуже с exists точно не будет.
Тип полей s.TheDate,pp.PlanDateEnd,pp.PlanDateStart какой?
12 июл 12, 12:33    [12855839]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
danton
как exists увеличит производительность
Очень просто - однозначностью связки для оптимизатора.
AND pd.PlanID IN (SELECT pp.PlanID
-- Для оптимизатора не всегда то же самое что
AND Exists(... WHERE ... AND pp.PlanID = pd.PlanID
IN - сопоставь значение со списком (который надо собрать и ещё отсечь дубли)
Exists - найди первый попавшийся случай удовлетворяющий условию (просто найди что существует, ничего не возвращая)

Даты самое узкое место, IMXO. Остальное может и не особо селективно.
А вот ещё маленькая глупость:
SELECT						rr.RouteID,pd.PlanID,c.cus_SalesRouteID,t.theMonth ,t.TheYear ,t.KodeMonth
	,CASE	WHEN pr.[Type] = 0
		THEN Sum(s.Caf) 
		ELSE Sum(s.Kg)
		END		AS KG 
FROM	          Mart.dbo.SalesD			s
	LEFT JOIN Mart.dbo.CustomersD			c  ON c.cus_CustomerID	= s.CustomerID
	LEFT JOIN Mart.dbo.[Time]			t  ON t.TheDate		= s.TheDate
	LEFT JOIN Mart.dbo.tbl_transcode		tt ON tt.ProductIDOld	= s.ProductID
	LEFT JOIN saleit_db_Danone.dbo.tbl_PlanDetails	pd ON pd.ProductID	= tt.ProductIDNew
	LEFT JOIN saleit_db_Danone.dbo.RoutesN		rr ON rr.RouteName	= c.cus_SalesRouteID
	LEFT JOIN saleit_db_Danone.dbo.tbl_Plans	ps ON ps.PlanID		= pd.PlanID
	LEFT JOIN saleit_db_Danone.dbo.tbl_PlanRoutes	pr ON pr.PlanID		= pd.PlanID
							  AND pr.RouteID	= rr.RouteID
WHERE	    c.cus_SalesRouteID	IN (SELECT rn.RouteName FROM saleit_db_Danone.dbo.RoutesN rn WHERE rn.ActiveRoute = 1)
	AND s.TheDate		>= Convert(Char,                DateAdd(Day,1-DatePart(Day,GetDate()),GetDate())   ,112)	-- Начало текущего месяца
	AND s.TheDate		<= Convert(Char,DateAdd(Month,1,DateAdd(Day,1-DatePart(Day,GetDate()),GetDate()))-1,112)	-- Конэц  текущего месяца
	AND Left(rr.RouteID,1)	 = ps.PlanPlatform
	AND pd.PlanID		IN (
		SELECT	pp.PlanID
		FROM	saleit_db_Danone.dbo.tbl_Plans pp 
		WHERE	    pp.PlanDateEnd	<= Convert(Char,DateAdd(Month,1,DateAdd(Day,1-DatePart(Day,GetDate()),GetDate()))-1,112)	-- Конэц  текущего месяца
			AND pp.PlanDateStart	>= Convert(Char,                DateAdd(Day,1-DatePart(Day,GetDate()),GetDate())   ,112)	-- Начало текущего месяца
		)
GROUP BY rr.RouteID
	,pd.PlanID
	,c.cus_SalesRouteID
	,t.theMonth
	,t.TheYear
	,t.KodeMonth
	,pr.[Type]
Бессмысленно ставить LEFT.

А это взрывает моск:
c.cus_SalesRouteID IN (SELECT rn.RouteName
12 июл 12, 12:34    [12855854]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
danton
Запрос не я писал, cам не знаю зачем convert делался
Боже.
Это безнадёжно ...
12 июл 12, 12:39    [12855898]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
danton
Member

Откуда:
Сообщений: 170
Mnior
danton
Запрос не я писал, cам не знаю зачем convert делался
Боже.
Это безнадёжно ...


Вы меня неправильно поняли.
Что выполняет преобразование понятно. Не знаю, зачем писали именно так, в контексте того, что есть в базах, можно было реализовать по проще.
12 июл 12, 13:56    [12856643]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
danton
Member

Откуда:
Сообщений: 170
denis2710
Тип полей s.TheDate,pp.PlanDateEnd,pp.PlanDateStart какой?


Datetime
12 июл 12, 13:59    [12856669]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
danton
Member

Откуда:
Сообщений: 170
Mnior
А это взрывает моск:
c.cus_SalesRouteID IN (SELECT rn.RouteName

Видимо так разработали...
12 июл 12, 14:02    [12856686]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
danton
denis2710
Тип полей s.TheDate,pp.PlanDateEnd,pp.PlanDateStart какой?


Datetime

так уберите конверты.
Какой скрытый смысл работать с датами,потом преобразовывать в строку,а потом сравнивать с датой???
Mnior
А это взрывает моск:
c.cus_SalesRouteID IN (SELECT rn.RouteName

Это что б враги не догадались!!!Встречал м-цать раз
12 июл 12, 14:36    [12857064]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
denis2710
так уберите конверты.
Какой скрытый смысл работать с датами,потом преобразовывать в строку,а потом сравнивать с датой???

это такой неочевидный способ обнуления времени, которое возникает из getdate()
12 июл 12, 14:38    [12857087]     Ответить | Цитировать Сообщить модератору
 Re: План выполнения запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Shakill
denis2710
так уберите конверты.
Какой скрытый смысл работать с датами,потом преобразовывать в строку,а потом сравнивать с датой???

это такой неочевидный способ обнуления времени, которое возникает из getdate()

+ получения первого и последнего дня текущего месяца.
12 июл 12, 15:03    [12857341]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить