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

Откуда:
Сообщений: 168
Есть запрос, работает правильно, но очень долго. Это видимо происходит из-за повторного обращения к одним и тем же таблицам. Помогите пожалуйста переделать. Пробовала сама переписать используя OUTER APPLY и от поиска Max(id) избавиться используя top(1) но видимо не хватает опыта написания запросов

SELECT   City			AS City 	
	,Sum(Summa)		AS Summa  
	,Count(distinct Code)	AS Counter	 
FROM Alocatii
WHERE Destination = 215 
  AND DateBegin >= '20100101' 
  AND DateEnd   <  '20110101'
  AND CodVidaPosobia in (1,2) 
  AND ID IN (
	SELECT ID_doc 
	FROM Movement 
	WHERE ID IN (
		SELECT Max(id) 
		FROM Movement 
		WHERE id_doc in 
			(
			SELECT id 
			FROM Alocatii
			WHERE destination = 215 
			  AND status = 4 
			  AND DateBegin >= '20100101' 
			  AND DateEnd   <  '20110101'
			  AND (UType not LIKE '%Фонд%' OR UType not LIKE '%Fond%')
			 ) 
		  AND DateMovement >= '20100101'  
		  AND DateMovement <  '20110101'
		GROUP BY id_doc
		HAVING Count(*) = 3
		)
	)
GROUP BY City
7 фев 13, 11:14    [13889183]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_ч_
Member

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

выложите план запроса
7 фев 13, 11:16    [13889194]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

Откуда:
Сообщений: 168
А можно как-то без плана запроса?
Просто надо избавиться от повторного обращения к таблицам Alocatii и Movement
7 фев 13, 11:27    [13889300]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_ч_
Member

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

тогда выложите структуру таблицы, тестовые данные и результат выборки, которого вы хотите добиться
7 фев 13, 11:42    [13889423]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Len4ick
А можно как-то без плана запроса?

Без плана запроса, без структуры таблиц?
Тогда вам к этим, которые "Лечат по фотографии, гадают на хрустальном шаре".
7 фев 13, 11:42    [13889429]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
Гость333, _ч_

Да тут и без планов, данных и структур видно, что три вложенных IN-подзапроса переписывать нужно... ;)
7 фев 13, 11:49    [13889489]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

Откуда:
Сообщений: 168
Добрый Э - Эх,

имено это я хотела бы сделать
7 фев 13, 11:55    [13889533]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Мне думается если id и id_doc это уникальные ключи Movement и Alocatii соответственно, то можно было так упростить.

SELECT   City			AS City 	
	,Sum(Summa)		AS Summa  
	,Count(distinct Code)	AS Counter	 
FROM Alocatii
WHERE Destination = 215 
  AND DateBegin >= '20100101' 
  AND DateEnd   <  '20110101'
  AND CodVidaPosobia in (1,2) 
  AND ID IN 
(select

m.id_doc  
from	Alocatii a
		inner join Movement m
		on m.id_doc = a.id
WHERE	a.destination = 215 
		AND a.status = 4 
		AND a.DateBegin >= '20100101' 
		AND a.DateEnd   <  '20110101'
		AND (a.UType not LIKE '%Фонд%' OR a.UType not LIKE '%Fond%')
		 AND m.DateMovement >= '20100101'  
		  AND m.DateMovement <  '20110101'
GROUP BY m.id_doc
		HAVING Count(*) = 3	)
7 фев 13, 12:23    [13889824]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

Откуда:
Сообщений: 168
Мистер Хенки,

Спасибо, добавила GROUP BY City в конце и подзапрос заменила на OUTER APPLY и получила именно то, что и было нужно. Огромное спасибо!!!
7 фев 13, 12:52    [13890140]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Добрый Э - Эх
Гость333, _ч_

Да тут и без планов, данных и структур видно, что три вложенных IN-подзапроса переписывать нужно... ;)


Ага, ты кто у нас, целитель, или ясновидящий ?
7 фев 13, 12:54    [13890163]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
Len4ick,

я бы и последний оставшийся у Хенки in-подзапрос раскрыл бы в JOIN...
7 фев 13, 12:54    [13890169]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
MasterZiv
Ага, ты кто у нас, целитель, или ясновидящий ?
Кто тебе сказал, что я - "у вас"? Не нужно меня в своё скопище присовокупливать. Я сам по себе.
7 фев 13, 13:02    [13890239]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
FROM Alocatii
WHERE ...
  AND ID IN 
(select

m.id_doc  
from	Alocatii a
		inner join Movement m
		on m.id_doc = a.id

Если ID есть Alocatii.ID то это масло маслянное получается
Потому что Alocatii.ID = Movement.id_doc = Alocatii a.id

Какую задачу вы пытаетесь решить ?
7 фев 13, 13:06    [13890282]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

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

?? почему пытаюсь, все отлично решилось, только что тестирование закончила
7 фев 13, 13:21    [13890385]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Len4ick
?? почему пытаюсь, все отлично решилось, только что тестирование закончила

Т.е. вы считаете, что у задачи может быть только один способ решения ?
7 фев 13, 13:22    [13890398]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

Откуда:
Сообщений: 168
Glory,
решений может быть много, и мое решение далеко не самое оптимальное, но задача слишком долго формулируется (у меня несколько листов тех задания)
7 фев 13, 13:41    [13890534]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Len4ick
(у меня несколько листов тех задания)

Вот для этого одного запроса техзадание на нескольких листах ???
7 фев 13, 13:42    [13890548]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_ч_
Member

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

не пытайте её, она партизан ещё тот, раз даже структуру табличек не выложила
7 фев 13, 13:43    [13890566]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Len4ick
Member

Откуда:
Сообщений: 168
_ч_,
:)
7 фев 13, 13:55    [13890660]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
_ч_, Glory ,

парни, да ладно вам - рано или поздно запрос загнется, Тогда Ленчик придет и в двух словах расскажет суть техзадания на несколько листов......
7 фев 13, 13:56    [13890667]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_ч_
Member

Откуда:
Сообщений: 1446
Добрый Э - Эх
_ч_, Glory ,

парни, да ладно вам - рано или поздно запрос загнется, Тогда Ленчик придет и в двух словах расскажет суть техзадания на несколько листов......


Почему сразу так? Есть еще варианты: увольнение, декрет
7 фев 13, 13:59    [13890691]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
                 Сорри за злостный оффтоп

_ч_
Почему сразу так? Есть еще варианты: увольнение, декрет
Если рассматривать события в правильном хронологическом порядке, то, скорее всего, развиваться они будут так: замедление работы запроса, разбор полетов на ковре у начальника, декрет с последующим увольнением ;)
7 фев 13, 14:03    [13890748]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Добрый Э - Эх
                 Сорри за злостный оффтоп

_ч_
Почему сразу так? Есть еще варианты: увольнение, декрет
Если рассматривать события в правильном хронологическом порядке, то, скорее всего, развиваться они будут так: замедление работы запроса, разбор полетов на ковре у начальника, декрет с последующим увольнением ;)

тяжело вам. За каждый замедляющийся запрос приходиться увольнять, или отправлять в декрет, а потом увольнять.
7 фев 13, 14:10    [13890829]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить