Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Медленный запрос...Где грабли???  [new]
Гуест123
Guest
Всем доброго дня!
Прошу сильно не пинать если неправильно выражаю свои мысли, так как на данный момент нахожусь в стадии изучения :-))
Есть запрос, который вывод около 4 тысяч строк и выполняется 3- 4 секунды
План запроса следующий:
            |--Sort(ORDER BY:([motor].[grupa_id] ASC, [motor].[detal_name] ASC, [motor].[skuba_nomer] ASC))
                 |--Compute Scalar(DEFINE:([Expr1006]=[motor].[nal]+[Expr1004], [Expr1009]=[Expr1009], [Expr1014]=[Expr1014]))
                      |--Merge Join(Right Outer Join, MERGE:([ps].[id])=([motor].[id]), RESIDUAL:([ps].[id]=[motor].[id]))
                           |--Compute Scalar(DEFINE:([Expr1014]=If ([Expr1038]=0) then NULL else [Expr1039]))
                           |    |--Stream Aggregate(GROUP BY:([ps].[id]) DEFINE:([Expr1038]=COUNT_BIG([ps].[kolvo]), [Expr1039]=SUM([ps].[kolvo])))
                           |         |--Sort(ORDER BY:([ps].[id] ASC))
                           |              |--Hash Match(Inner Join, HASH:([p].[postavka_id])=([ps].[postavka_id]), RESIDUAL:([ps].[postavka_id]=[p].[postavka_id]))
                           |                   |--Table Scan(OBJECT:([db13].[dbo].[postavka] AS [p]), WHERE:([p].[sost_id]=1))
                           |                   |--Clustered Index Scan(OBJECT:([db13].[dbo].[postavka_sostav].[PK_postavka_sostav] AS [ps]))
                           |--Merge Join(Left Outer Join, MANY-TO-MANY MERGE:([motor].[id])=([ps].[id]), RESIDUAL:([ps].[id]=[motor].[id]))
                                |--Merge Join(Left Outer Join, MERGE:([motor].[id])=([zakaz_sostav].[id]), RESIDUAL:([zakaz_sostav].[id]=[motor].[id]))
                                |    |--Clustered Index Scan(OBJECT:([db13].[dbo].[motor].[PK_motor]),  WHERE:(like([motor].[cl_nomer], [@detal_nomer]+'%', NULL) AND Convert([motor].[visible])=0) ORDERED FORWARD)
                                |    |--Compute Scalar(DEFINE:([Expr1004]=If ([Expr1040]=0) then NULL else [Expr1041]))
                                |         |--Stream Aggregate(GROUP BY:([zakaz_sostav].[id]) DEFINE:([Expr1040]=COUNT_BIG([zakaz_sostav].[kolvo]), [Expr1041]=SUM([zakaz_sostav].[kolvo])))
                                |              |--Sort(ORDER BY:([zakaz_sostav].[id] ASC))
                                |                   |--Table Scan(OBJECT:([db13].[dbo].[zakaz_sostav]), WHERE:([zakaz_sostav].[sost_id]=4))
                                |--Compute Scalar(DEFINE:([Expr1009]=If ([Expr1042]=0) then NULL else [Expr1043]))
                                     |--Stream Aggregate(GROUP BY:([ps].[id]) DEFINE:([Expr1042]=COUNT_BIG([ps].[kolvo]), [Expr1043]=SUM([ps].[kolvo])))
                                          |--Sort(ORDER BY:([ps].[id] ASC))
                                               |--Hash Match(Inner Join, HASH:([p].[postavka_id])=([ps].[postavka_id]), RESIDUAL:([ps].[postavka_id]=[p].[postavka_id]))
                                                    |--Table Scan(OBJECT:([db13].[dbo].[postavka] AS [p]), WHERE:([p].[sost_id]=2))
                                                    |--Clustered Index Scan(OBJECT:([db13].[dbo].[postavka_sostav].[PK_postavka_sostav] AS [ps]))

Подскажите где искать причину медленного выполнения запроса???
2 мар 05, 11:49    [1355367]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос...Где грабли???  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31604
Сложный запрос с кучей сканов.
Нужно сам запрос выложить.
2 мар 05, 11:52    [1355382]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос...Где грабли???  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
|--Table Scan(OBJECT:([db13].[dbo].[zakaz_sostav]), WHERE:([zakaz_sostav].[sost_id]=4))

и
автор
|--Table Scan(OBJECT:([db13].[dbo].[postavka] AS [p]), WHERE:([p].[sost_id]=2))

Я бы повесил индексы на соответсвующие поля. Если их там еще нет. Если есть - давайте запрос.
2 мар 05, 11:54    [1355386]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос...Где грабли???  [new]
Гуест123
Guest
Запрос следующий:
 select *, (nal+(select sum(kolvo) from zakaz_sostav where sost_id=4 and id=motor.id)) as real_kolvo, 
(select sum(ps.kolvo) from postavka p, postavka_sostav ps 
where p.postavka_id=ps.postavka_id and  p.sost_id=2 and ps.id=motor.id) as in_way,
(select sum(ps.kolvo) from postavka p, postavka_sostav ps 
where p.postavka_id=ps.postavka_id and  p.sost_id=1 and ps.id=motor.id) as zak_kolvo
 from motor
 where cl_nomer like @detal_nomer+'%' and visible=0
 order by grupa_id, detal_name
2 мар 05, 11:59    [1355420]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос...Где грабли???  [new]
ChA
Member

Откуда: Москва
Сообщений: 11129
Попробуйте так
SELECT m.*
	, (m.nal + (
		SELECT SUM(kolvo) FROM zakaz_sostav WHERE sost_id=4 AND id=m.id)
	) AS real_kolvo
	, ps.in_way
	, ps.zak_kolvo
FROM motor m
INNER JOIN (
	SELECT
		ps.id
		, SUM(CASE p.sost_id WHEN 1 THEN ps.kolvo END) AS zak_kolvo
		, SUM(CASE p.sost_id WHEN 2 THEN ps.kolvo END) AS in_way
	FROM postavka p
	INNER JOIN postavka_sostav ps ON (ps.postavka_id=p.postavka_id )
	WHERE p.sost_id IN (1, 2)
	GROUP BY ps.id
) ps ON (ps.id=m.id)
WHERE m.cl_nomer LIKE @detal_nomer+'%' AND visible=0
ORDER by m.grupa_id, m.detal_name
Хотя это не отменяет правильных индексов...
2 мар 05, 13:58    [1356086]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить