powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как то оптимизировать запрос?
17 сообщений из 17, страница 1 из 1
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #39856502
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKFochaпропущено...

оконные функции
https://docs.microsoft.com/ru-RU/sql/t-sql/queries/select-over-clause-transact-sql?view=aps-pdw-2016
ухты
ну вдруг он не поймет
...
Рейтинг: 0 / 0
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #39856511
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было

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

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

Стало

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

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

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

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

Стало

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

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

это вообще-то подозрительно
...
Рейтинг: 0 / 0
Можно ли как то оптимизировать запрос?
    #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
Можно ли как то оптимизировать запрос?
    #39856665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_Artur,

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

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

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

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

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

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

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

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


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