Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как то оптимизировать запрос? / 17 сообщений из 17, страница 1 из 1
03.09.2019, 09:01
    #39856493
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Добрый день. Есть такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
 SELECT DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
   LEFT JOIN Terminal.dbo.Downtime  as DDO ON CON.OID = DDO.oid
	  AND DO.start < DDO.start
   WHERE DDO.id is NULL



Вот примерный результат выполнения:

id oid start stop sms15 sms30 sms60E822C3A7-89A2-4A16-B918-E7A31DAD44BB 93E8FECB-8782-4357-B0FC-75C147594F50 2019-09-01 15:53:56.000 2019-09-01 16:21:10.000 NULL NULL NULL6A3917C6-4C9E-4759-B147-02DB544E7FE5 E0472205-8C90-4C66-A5EF-F36BE9399875 2019-07-04 15:00:31.000 NULL 1 1 1F99E87F1-C206-4428-BA0C-203BE44A171C 5B22FE0E-36A5-42AE-A280-93E6D47B4044 2019-07-08 10:32:51.000 NULL 1 1 15997C60C-3524-46DF-BB7D-2CE7725B7DCB 0ADA876A-4C54-4EFB-8D72-62CE5CEE1A3E 2019-09-01 09:00:51.000 2019-09-01 09:06:43.000 NULL NULL NULL

Суть вопроса. Чтобы получить последнюю дату столбца start пишется два одинаковых запроса LEFT JOIN . Далее сравнивается большее значение даты DO.start < DDO.start .

Вопрос, можно ли как то упростить запрос. Чтобы он выполнялся быстрее?
...
Рейтинг: 0 / 0
03.09.2019, 09:17
    #39856495
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Hopfen_Artur,

[R] = ROW_NUMBER(PARTITION BY DO.id ORDER BY DO.stop DESC) + WHERE R = 1
или TOP 1 WITH TIES
...
Рейтинг: 0 / 0
03.09.2019, 09:31
    #39856500
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
TaPaKHopfen_Artur,

[R] = ROW_NUMBER(PARTITION BY DO.id ORDER BY DO.stop DESC) + WHERE R = 1
или TOP 1 WITH TIES
оконные функции
https://docs.microsoft.com/ru-RU/sql/t-sql/queries/select-over-clause-transact-sql?view=aps-pdw-2016
...
Рейтинг: 0 / 0
03.09.2019, 09:33
    #39856501
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
FochaTaPaKHopfen_Artur,

[R] = ROW_NUMBER(PARTITION BY DO.id ORDER BY DO.stop DESC) + WHERE R = 1
или TOP 1 WITH TIES
оконные функции
https://docs.microsoft.com/ru-RU/sql/t-sql/queries/select-over-clause-transact-sql?view=aps-pdw-2016
ухты
...
Рейтинг: 0 / 0
03.09.2019, 09:34
    #39856502
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
TaPaKFochaпропущено...

оконные функции
https://docs.microsoft.com/ru-RU/sql/t-sql/queries/select-over-clause-transact-sql?view=aps-pdw-2016
ухты
ну вдруг он не поймет
...
Рейтинг: 0 / 0
03.09.2019, 09:35
    #39856503
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Вот так написал, пока не работает, пишет недопустимое имя столбца, разбираюсь

Код: sql
1.
2.
3.
4.
 SELECT ROW_NUMBER() OVER(PARTITION BY DO.oid ORDER BY DO.stop DESC) as R, DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
   WHERE R = '1'
...
Рейтинг: 0 / 0
03.09.2019, 09:37
    #39856504
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Hopfen_ArturВот так написал, пока не работает, пишет недопустимое имя столбца, разбираюсь

Код: sql
1.
2.
3.
4.
 SELECT ROW_NUMBER() OVER(PARTITION BY DO.oid ORDER BY DO.stop DESC) as R, DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
   WHERE R = '1'


обурнуть в WITH x as (SELECT ...) SELECT .. FROM x WHERE R = 1
...
Рейтинг: 0 / 0
03.09.2019, 09:50
    #39856507
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
TaPaKHopfen_ArturВот так написал, пока не работает, пишет недопустимое имя столбца, разбираюсь

Код: sql
1.
2.
3.
4.
 SELECT ROW_NUMBER() OVER(PARTITION BY DO.oid ORDER BY DO.stop DESC) as R, DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
   WHERE R = '1'


обурнуть в WITH x as (SELECT ...) SELECT .. FROM x WHERE R = 1


а тогда зачем left join если потом мы убираем где нет даты?
Может
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT max(DO.stop) OVER(PARTITION BY DO.oid) as R
		 , DO.id
		 , CON.oid as oid
		 , DO.start
		 , DO.stop
		 , DO.outSms15 as sms15
		 , DO.outSms30 as sms30
		 , DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
...
Рейтинг: 0 / 0
03.09.2019, 09:59
    #39856510
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
TaPaK,

очень быстро получилось, спасибо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 SET STATISTICS TIME ON;
 WITH tb (R, id, oid, start, stop, sms15, sms30, sms60)  
AS  
(  SELECT ROW_NUMBER() OVER(PARTITION BY DO.oid ORDER BY DO.start DESC) as R, DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
  
)  
SELECT id, oid, start, stop, sms15, sms30, sms60   
FROM tb
WHERE R = 1
SET STATISTICS TIME OFF; 
...
Рейтинг: 0 / 0
03.09.2019, 10:01
    #39856511
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Было

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 47 мс, затраченное время = 40 мс.

Стало

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 4 мс.
...
Рейтинг: 0 / 0
03.09.2019, 11:20
    #39856550
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Hopfen_ArturБыло

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 47 мс, затраченное время = 40 мс.

Стало

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 4 мс.

это вообще-то подозрительно
...
Рейтинг: 0 / 0
03.09.2019, 11:24
    #39856553
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Ролг Хупин,

полный запрос выглядит так, оптимизирую сижу вот:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SET STATISTICS TIME ON; 
with tb (R, id, oid, start, stop, sms15, sms30, sms60)  
AS  
(  SELECT ROW_NUMBER() OVER(PARTITION BY DO.oid ORDER BY DO.start DESC) as R, DO.id, CON.oid as oid, DO.start, DO.stop, DO.outSms15 as sms15, DO.outSms30 as sms30, DO.outSms60 as sms60
   FROM Terminal.dbo.Connection  as CON
   LEFT JOIN Terminal.dbo.Downtime  as DO ON CON.OID = DO.oid
  
)

SELECT MAX(RF.Date) AS date
   ,CON.OID as oid
   ,TC.ProductCycle as cycl
   ,tb.id as downtime
   ,TC.Product as product
   ,tb.sms15
   ,tb.sms30
   ,tb.sms60
FROM EAM_test.dbo.RFIDData AS RF
LEFT JOIN EAM_test.dbo.RFIDReader AS RR ON RF.Reader = RR.Oid AND RR.Active = 1
LEFT JOIN Terminal.dbo.Connection AS CON ON CON.OID = RR.Asset
LEFT JOIN Terminal.dbo.Terminal1C AS TC ON CON.OID = TC.OID
   AND TC.Day = 'День'
   AND TC.status = 1
LEFT JOIN tb ON CON.OID = tb.oid and tb.stop is null AND tb.R = 1
WHERE TC.Date = '2019-03-09'
GROUP BY CON.OID, TC.ProductCycle, tb.id, TC.Product, tb.sms15, tb.sms30, tb.sms60

SET STATISTICS TIME OFF; 



пока полное время такое:

(затронуто строк: 3)

Время работы SQL Server:
Время ЦП = 1606 мс, затраченное время = 1155 мс.
...
Рейтинг: 0 / 0
03.09.2019, 14:27
    #39856665
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Hopfen_Artur,

Это же сплошной table scan....
Тут даже нечего оптимизировать
...
Рейтинг: 0 / 0
03.09.2019, 14:31
    #39856667
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
MasterZivHopfen_Artur,

Это же сплошной table scan....
Тут даже нечего оптимизировать
авторитетненько, ещё тезисы будут? :)
...
Рейтинг: 0 / 0
04.09.2019, 08:43
    #39856932
Hopfen_Artur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Получилось уменьшить, поэксперементировал с порядком JION

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 730 мс, затраченное время = 206 мс.
...
Рейтинг: 0 / 0
04.09.2019, 08:57
    #39856940
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
Hopfen_ArturПолучилось уменьшить, поэксперементировал с порядком JION

(затронуто строк: 4)

Время работы SQL Server:
Время ЦП = 730 мс, затраченное время = 206 мс.

Икспериментатор, видно по нему.

У тя, страдалец, под группировкой, как минимум, две лишние таблицы торчат.
А группировка, страдалец, это тяжело.
...
Рейтинг: 0 / 0
04.09.2019, 21:52
    #39857554
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как то оптимизировать запрос?
интересно бы увидеть план: справился ли оптимизатор с таким оригинальным представлением хотелок автора
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как то оптимизировать запрос? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]