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

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

XML вполне устроит
10 дек 14, 20:24    [16980074]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
maxapet
В каком виде план привести?
sqlplan, с актуальной статистикой
10 дек 14, 20:28    [16980102]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
maxapet
Но этот запрос исполняется очень медленно: на 3 тыс. заказов - 12-15 сек
Результат запроса широкий, может, там просто кллиенту возвращаются долго эти 3000 строк?
10 дек 14, 20:30    [16980109]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
maxapet,

А на кой черт там DISTINCT?
11 дек 14, 00:47    [16980942]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Mind
maxapet,

А на кой черт там DISTINCT?
Кстати да, подозрительно.
11 дек 14, 01:12    [16980991]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
SELECT 
 o.OrderId
,c.EMail AS CustomerEMail
,MAX(CASE WHEN s.OrderStatus = 0 THEN s.DateTimeStatusChanged ELSE NULL END) AS Created
,MAX(CASE WHEN s.OrderStatus = 0 THEN op.EMail ELSE NULL END) AS CreatedBy
,MAX(CASE WHEN s.OrderStatus = 0 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CreatedById

,MAX(CASE WHEN s.OrderStatus = 1 THEN s.DateTimeStatusChanged ELSE NULL END) AS Accepted
,MAX(CASE WHEN s.OrderStatus = 1 THEN op.EMail ELSE NULL END) AS AcceptedBy
,MAX(CASE WHEN s.OrderStatus = 1 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS AcceptedById

,MAX(CASE WHEN s.OrderStatus = 2 THEN s.DateTimeStatusChanged ELSE NULL END) AS Completed
,MAX(CASE WHEN s.OrderStatus = 2 THEN op.EMail ELSE NULL END) AS CompletedBy
,MAX(CASE WHEN s.OrderStatus = 2 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CompletedById

,MAX(CASE WHEN s.OrderStatus = 3 THEN s.DateTimeStatusChanged ELSE NULL END) AS Declined
,MAX(CASE WHEN s.OrderStatus = 3 THEN op.EMail ELSE NULL END) AS DeclinedBy
,MAX(CASE WHEN s.OrderStatus = 3 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS DeclinedById

FROM Orders o
LEFT OUTER JOIN OrderStates s ON s.OrderID = o.OrderID
LEFT OUTER JOIN Users c ON c.ID = o.CustomerId
LEFT OUTER JOIN Users op ON op.ID = s.OperatorId
GROUP BY o.OrderId,c.EMail
11 дек 14, 07:26    [16981211]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
aleks2
Guest
LexusR
SELECT 
 o.OrderId
,c.EMail AS CustomerEMail
,MAX(CASE WHEN s.OrderStatus = 0 THEN s.DateTimeStatusChanged ELSE NULL END) AS Created
,MAX(CASE WHEN s.OrderStatus = 0 THEN op.EMail ELSE NULL END) AS CreatedBy
,MAX(CASE WHEN s.OrderStatus = 0 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CreatedById

,MAX(CASE WHEN s.OrderStatus = 1 THEN s.DateTimeStatusChanged ELSE NULL END) AS Accepted
,MAX(CASE WHEN s.OrderStatus = 1 THEN op.EMail ELSE NULL END) AS AcceptedBy
,MAX(CASE WHEN s.OrderStatus = 1 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS AcceptedById

,MAX(CASE WHEN s.OrderStatus = 2 THEN s.DateTimeStatusChanged ELSE NULL END) AS Completed
,MAX(CASE WHEN s.OrderStatus = 2 THEN op.EMail ELSE NULL END) AS CompletedBy
,MAX(CASE WHEN s.OrderStatus = 2 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CompletedById

,MAX(CASE WHEN s.OrderStatus = 3 THEN s.DateTimeStatusChanged ELSE NULL END) AS Declined
,MAX(CASE WHEN s.OrderStatus = 3 THEN op.EMail ELSE NULL END) AS DeclinedBy
,MAX(CASE WHEN s.OrderStatus = 3 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS DeclinedById

FROM Orders o
LEFT OUTER JOIN OrderStates s ON s.OrderID = o.OrderID
LEFT OUTER JOIN Users c ON c.ID = o.CustomerId
LEFT OUTER JOIN Users op ON op.ID = s.OperatorId
GROUP BY o.OrderId,c.EMail


Ты б хоть JOIN под группировку не совал, "оптимизатор".
11 дек 14, 08:50    [16981393]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
автор
Результат запроса широкий, может, там просто кллиенту возвращаются долго эти 3000 строк?

Проверяю непосредственно на SQL-сервере, правда, на удалённом.
автор
А на кой черт там DISTINCT?

Убрал DISTINCT - не изменилось ничего.
Запрос с CASE'ами даёт в разы больше строк, ем есть заказов.
Файл с планом выполнения запрос прилагаю.

К сообщению приложен файл (OrderView.sqlplan - 44Kb) cкачать
11 дек 14, 09:09    [16981460]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
автор
SELECT 
 o.OrderId
,c.EMail AS CustomerEMail
,MAX(CASE WHEN s.OrderStatus = 0 THEN s.DateTimeStatusChanged ELSE NULL END) AS Created
,MAX(CASE WHEN s.OrderStatus = 0 THEN op.EMail ELSE NULL END) AS CreatedBy
,MAX(CASE WHEN s.OrderStatus = 0 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CreatedById

,MAX(CASE WHEN s.OrderStatus = 1 THEN s.DateTimeStatusChanged ELSE NULL END) AS Accepted
,MAX(CASE WHEN s.OrderStatus = 1 THEN op.EMail ELSE NULL END) AS AcceptedBy
,MAX(CASE WHEN s.OrderStatus = 1 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS AcceptedById

,MAX(CASE WHEN s.OrderStatus = 2 THEN s.DateTimeStatusChanged ELSE NULL END) AS Completed
,MAX(CASE WHEN s.OrderStatus = 2 THEN op.EMail ELSE NULL END) AS CompletedBy
,MAX(CASE WHEN s.OrderStatus = 2 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS CompletedById

,MAX(CASE WHEN s.OrderStatus = 3 THEN s.DateTimeStatusChanged ELSE NULL END) AS Declined
,MAX(CASE WHEN s.OrderStatus = 3 THEN op.EMail ELSE NULL END) AS DeclinedBy
,MAX(CASE WHEN s.OrderStatus = 3 THEN cast(op.ID as varchar(36)) ELSE NULL END) AS DeclinedById

FROM Orders o
LEFT OUTER JOIN OrderStates s ON s.OrderID = o.OrderID
LEFT OUTER JOIN Users c ON c.ID = o.CustomerId
LEFT OUTER JOIN Users op ON op.ID = s.OperatorId
GROUP BY o.OrderId,c.EMail


А MAX какую нагрузку несёт?
11 дек 14, 09:15    [16981478]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
[quot maxapet
А MAX какую нагрузку несёт?[/quot]

позволяет сделать группировку и получить на выходе ровно столько строк сколько заказов
11 дек 14, 09:22    [16981493]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
aleks2
Ты б хоть JOIN под группировку не совал, "оптимизатор".


если ВЫ про таблицы Users то ради бога вынесите во внешний селект - я хотел только показать как нужно использовать case c группировкой чтобы не множить записи

и сарказм Ваш оставьте при себе "критик"
11 дек 14, 09:26    [16981509]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
автор
позволяет сделать группировку и получить на выходе ровно столько строк сколько заказов

Спасибо, особенно за такое использование CASE'а. А DISTINCT не решит ту же проблему?
11 дек 14, 09:59    [16981644]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
zasandator

Ты не тоже самое повторил, неудачнег? ))))


Первоначальный запрос это одна из реализаций разворота таблицы (pivot).

Попробуй прочитать и понять что написано в статье о pivot, на которую ты ссылаешься. Внимательно изучи запрос LexusR. Это то, что я назвал вариантом 2.

Так что, zasandator, учиться, учиться и еще раз учиться.
11 дек 14, 10:18    [16981745]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
SomewhereSomehow
Member

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

Вы оценочный план выложили, а вас просили действительный.
Попробуйте order by убрать из запроса (top(100) percent кстати лишнее, можно не писать, оптимизатор такое убирает), чтобы сортировка исчезла (может быть она сливает в tempdb). Если станет быстрее - проверьте, сливает ли сортировка данные на диск (при помощи событий профайлера), если сливает - нужно посмотреть, насколько оценки отличаются от реальности.
Ну и проверьте, не уходит ли время на передачу данных клиенту - сделайте ваш селект во временную таблицу, select ... into #t ...? на блокировки - посмотрите ожидания?
11 дек 14, 10:19    [16981751]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
aleks2
Guest
LexusR
aleks2
Ты б хоть JOIN под группировку не совал, "оптимизатор".


если ВЫ про таблицы Users то ради бога вынесите во внешний селект - я хотел только показать как нужно использовать case c группировкой чтобы не множить записи

и сарказм Ваш оставьте при себе "критик"


Глупенький, JOIN под группировкой - это неиллюзорный тормоз.

А в этом конкретном случае достаточно оставить под группировкой только OrderStates.

Так то, "оптимизатор".
11 дек 14, 10:34    [16981848]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
aleks2
А в этом конкретном случае достаточно оставить под группировкой только OrderStates.


OrderStates - не достаточно оставить под группировкой .

OrderStates, Users - достаточно оставить под группировкой .
11 дек 14, 10:46    [16981929]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
aleks2
LexusR
пропущено...


если ВЫ про таблицы Users то ради бога вынесите во внешний селект - я хотел только показать как нужно использовать case c группировкой чтобы не множить записи

и сарказм Ваш оставьте при себе "критик"


Глупенький, JOIN под группировкой - это неиллюзорный тормоз.

А в этом конкретном случае достаточно оставить под группировкой только OrderStates.

Так то, "оптимизатор".


господин "умник" не могли бы вы представить запрос с группировкой только OrderStates чтобы нам повысить свой iq
11 дек 14, 10:51    [16981957]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
maxapet
автор
позволяет сделать группировку и получить на выходе ровно столько строк сколько заказов

Спасибо, особенно за такое использование CASE'а. А DISTINCT не решит ту же проблему?

НЕТ
11 дек 14, 10:52    [16981971]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
aleks2
Guest
LexusR
aleks2
пропущено...


Глупенький, JOIN под группировкой - это неиллюзорный тормоз.

А в этом конкретном случае достаточно оставить под группировкой только OrderStates.

Так то, "оптимизатор".


господин "умник" не могли бы вы представить запрос с группировкой только OrderStates чтобы нам повысить свой iq


Не могу - лень мне очевидное переписывать.
Сами ужо учитесь.
11 дек 14, 10:56    [16981991]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
LexusR
maxapet
пропущено...

Спасибо, особенно за такое использование CASE'а. А DISTINCT не решит ту же проблему?

НЕТ

почуствуйте разницу
declare @t table (id int,st int,val int)
insert into @t values(1,1,10),(1,2,20),(1,3,30)

select distinct ID
,case when st=1 then val else null end as state_1
,case when st=2 then val else null end as state_2
,case when st=3 then val else null end as state_3
from @t

select ID
,max(case when st=1 then val else null end) as state_1
,max(case when st=2 then val else null end) as state_2
,max(case when st=3 then val else null end) as state_3
from @t
group by ID
11 дек 14, 10:58    [16981997]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
aleks2
Guest
Wlr-l
aleks2
А в этом конкретном случае достаточно оставить под группировкой только OrderStates.


OrderStates - не достаточно оставить под группировкой .

OrderStates, Users - достаточно оставить под группировкой .


Зачем тебе там Users сдался?
11 дек 14, 10:58    [16982002]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
aleks2
LexusR
пропущено...


господин "умник" не могли бы вы представить запрос с группировкой только OrderStates чтобы нам повысить свой iq


Не могу - лень мне очевидное переписывать.
Сами ужо учитесь.


да вы батенька пустобрёх
11 дек 14, 10:59    [16982008]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
aleks2
Wlr-l
пропущено...


OrderStates - не достаточно оставить под группировкой .

OrderStates, Users - достаточно оставить под группировкой .


Зачем тебе там Users сдался?


потому что каждый State меняет свой оператор.
11 дек 14, 11:01    [16982023]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
aleks2
Guest
LexusR
aleks2
пропущено...


Зачем тебе там Users сдался?


потому что каждый State меняет свой оператор.

Переквалифицируйся в управдомы.
11 дек 14, 11:06    [16982072]     Ответить | Цитировать Сообщить модератору
 Re: Помтгите оптимизировать запросоптимизировать запрос?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
aleks2
LexusR
пропущено...


потому что каждый State меняет свой оператор.

Переквалифицируйся в управдомы.


А вам пожалуй надо обитать на форуме ПТ или в Area51
11 дек 14, 11:08    [16982081]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить