powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации запроса
25 сообщений из 59, страница 2 из 3
Прошу совет по оптимизации запроса
    #40121364
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Ты почти все верно понял.
Но нужна немного иная таблица.
Для каждого из 59 единиц оборудования нужно 24 строки. Каждая строка - час завтрашних суток.
Если в ремонте, то ставлю маркер.

Вот окончание запроса, которое я отрезал

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
,markHours AS
(
SELECT cT.*, 
    CASE WHEN grp=1 and hBegin<=hConn and hConn<= hEnd THEN 1 ELSE 0 END mrk1,
    CASE WHEN grp=2 and hBegin<=hConn THEN 1 ELSE 0 END mrk2,
    CASE WHEN grp=3 and hConn<= hEnd THEN 1 ELSE 0 END mrk3,
    CASE WHEN grp=4 THEN 1 ELSE 0 END mrk4
FROM connTab cT
)

,commMarkHours AS
(
SELECT hNum, hConn, objName, code,  tagCode, mrk1 + mrk2 + mrk3 + mrk4 mrk
FROM markHours
ORDER BY objName, hConn
)

SELECT 'skv' Type, code IdObj, tagCode TypDat,  mrk, cast('NOW' as timestamp), 192 Qvt FROM commMarkHours ORDER BY code



Далее эти 59х24 строки поступают на вход Системы, которая уже их обрабатывает нужным образом.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441Вот окончание запроса, которое я отрезал

Вот поэтому-то и надо с данным вопросом идти не на форум, а к старшим товарищам,
которые знают конкретную базу конкретной системы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121374
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

А что эти товарищи могут сказать? Чем помочь?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121378
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расскажут как и из каких таблиц правильно доставать нужную информацию. Хотя бы
для того чтобы не хардкодить в запросе список оборудования и не доставать
операцию из описания.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121388
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что, начнем оптимизацию :)

Я целиком ЗА обращение к старшим товарищам, ибо как именно задумана структура данных иначе маловероятно получить,
тем более что структура хоть и не самая плохая, но теми же FK - не страдает. Судя по показанным тут DDL

Но чисто из любопытства попробую показать процесс оптимизации для начинающих :)

Берем начало и смотрим статистику.

Код: plsql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
Query
------------------------------------------------
WITH
--====================================================================================================
 freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================
,freshEventList      AS (
------------------------------------------------------------------------------------------------------
SELECT
  taskId                    as taskId,
  folderId                  as folderId,
  DATEADD(hour, 5, tS1    ) as beginDt,
  DATEADD(hour, 5, dueDate) as endDate,
  Description               as dscr,
  impact                    as impact,
  status                    as status
FROM RECORDS
WHERE (1=1)
  and (Id IN (SELECT Id FROM freshIdWithTarget))
  and (left(Description,14) = '&#194;&#251;&#226;&#238;&#228; &#226; &#240;&#229;&#236;&#238;&#237;&#242;')
  and (status <> 9)
ORDER BY taskId
)

/***********************/
select * from freshEventList
/***********************/


Plan
------------------------------------------------
PLAN SORT ((FRESHEVENTLIST FRESHIDWITHTARGET RECORDS NATURAL))
PLAN SORT ((FRESHEVENTLIST RECORDS NATURAL))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 265,00 ms
Avg fetch time: 9,46 ms

Memory
------------------------------------------------
Current: 35 055 680
Max    : 39 248 192
Buffers: 2 048

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 429 173
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|RECORDS                        |         0 |         0 |      210222 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+



Получить на 458 записей 210 тысяч чтений - это круто. Но это явно херня.

Конструкция and (Id IN (SELECT Id FROM freshIdWithTarget)) явно не для этих случаев.
Однако, у нас же псевдотаблица, чего мы с ней по человечески, джойном, не работаем??

Код: plsql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Query
------------------------------------------------
WITH
--====================================================================================================
 freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================
,freshEventList      AS (
------------------------------------------------------------------------------------------------------
SELECT
  RECORDS.taskId                    as taskId,
  RECORDS.folderId                  as folderId,
  DATEADD(hour, 5, RECORDS.tS1    ) as beginDt,
  DATEADD(hour, 5, RECORDS.dueDate) as endDate,
  RECORDS.Description               as dscr,
  RECORDS.impact                    as impact,
  RECORDS.status                    as status
FROM RECORDS
  inner join freshIdWithTarget on (RECORDS.id = freshIdWithTarget.id)

WHERE (1=1)
--  and (Id IN (SELECT Id FROM freshIdWithTarget))
  and (left(RECORDS.Description,14) = '&#194;&#251;&#226;&#238;&#228; &#226; &#240;&#229;&#236;&#238;&#237;&#242;')
  and (RECORDS.status <> 9)
--ORDER BY RECORDS.taskId -- сортировка нафиг не нужна, все равно потом все переколбасится
)

/***********************/
select * from freshEventList
/***********************/

Plan
------------------------------------------------
PLAN JOIN (SORT (FRESHEVENTLIST FRESHIDWITHTARGET RECORDS NATURAL), FRESHEVENTLIST RECORDS INDEX (RDB$PRIMARY1))

Adapted Plan
------------------------------------------------
PLAN JOIN (SORT (FRESHEVENTLIST FRESHIDWITHTARGET RECORDS NATURAL), FRESHEVENTLIST RECORDS INDEX (INTEG_12))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 0,00 ms
Avg fetch time: 0,00 ms

Memory
------------------------------------------------
Current: 35 055 616
Max    : 39 248 192
Buffers: 2 048

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 1 587
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|RECORDS                        |         0 |       161 |         458 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+




И вместо 210 тысяч чтений мы получаем 458 штук натуралом + 161 штуку через индекс. Уже лучше чем было.

Если что - исходный запрос с данными, я вообще не дождался окончания выполнения, срубил его :)
Если у тебя он выполняется за 30 секунд - у вас очень хороший сервер. Или ты чего-то не договариваешь. Предоставляешь не ту инфу с которой работаешь сам.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121397
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя.
Последний join
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
--====================================================================================================
,connTab             AS (
------------------------------------------------------------------------------------------------------
SELECT
  fC.hNum              as hNum,
  fC.hConn             as hConn,
  fC.objName           as objName,
  fC.code + fC.codeAdd as code,
  fC.tagCode           as tagCode,
  tAdC.grp             as grp,
  tAdC.hBegin          as hBegin,
  tAdC.hEnd            as hEnd
FROM fullCombin fC
--  LEFT JOIN correctHours tAdC on (fC.objName = tAdC.Name)
  FULL JOIN correctHours tAdC on (fC.objName = tAdC.Name)
)

--====================================================================================================

SELECT * FROM connTab


fullCombin (1416 записей, )
correctHours (4 записей, 1832+696 чтений)
дает 1416 записей при (ni=2 360 760 + i=980 280) чтений.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121413
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks, спасибо!

Я применил первую рекомендации + убрал кое-что лишлее и полный запрос вместо минуты стал работать 20 сек.

По поводу "недоговариваешь". Я могу что-то путать по неопытности, но не вру. См. картинку.

Старшие товарищи....Хорошо звучит, но плохо работает. Тот, кто работал в иностранной компании меня поймет. Есть Система. Она разработана для многих проектов. Я веду несколько длоков нашего русского проекта. По моим блоков есть ряд запросов, которые я должен выполнить на базе Системы. Если я обращаюсь к старшим товарищам за океан с просьбой что-то доделать или пояснить, то они мне вежливо объясняют, что мы тут русские идиоты, ничего не понимаем, что сами хотим, что у нас шаловливые ручки и т.п. А задачу, которая конкретно поставлена в проекте, надо делать мне и я за нее отвечаю премией. Поэтому сомое приемлимое в моем случае - найти способ использовать те системные ресурсы, что есть, для достижения того, что надо.... Вот так и живу. Спасибо, что помогаешь мне!
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121417
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441они мне вежливо объясняют, что мы тут русские идиоты, ничего не понимаем, что
сами хотим, что у нас шаловливые ручки и т.п.

Это явно свидетельствует, что ты не сумел правильно задать вопрос, вляпался в
ситуацию XYZ и действительно не понимаешь что и зачем от тебя требуют.

Обращения должны быть конкретны и недвусмысленны. Например, предоставить
документ с описанием всех таблиц в БД и информации хранящейся в их полях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121423
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замена fullCombin на физическую таблицу ничего не дает.

Begimot441
Вот окончание запроса, которое я отрезал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
,markHours AS
(
SELECT cT.*, 
    CASE WHEN grp=1 and hBegin<=hConn and hConn<= hEnd THEN 1 ELSE 0 END mrk1,
    CASE WHEN grp=2 and hBegin<=hConn THEN 1 ELSE 0 END mrk2,
    CASE WHEN grp=3 and hConn<= hEnd THEN 1 ELSE 0 END mrk3,
    CASE WHEN grp=4 THEN 1 ELSE 0 END mrk4
FROM connTab cT
)

,commMarkHours AS
(
SELECT hNum, hConn, objName, code,  tagCode, mrk1 + mrk2 + mrk3 + mrk4 mrk
FROM markHours
ORDER BY objName, hConn
)

SELECT 'skv' Type, code IdObj, tagCode TypDat,  mrk, cast('NOW' as timestamp), 192 Qvt FROM commMarkHours ORDER BY code



Далее эти 59х24 строки поступают на вход Системы, которая уже их обрабатывает нужным образом.

Это "окончание запроса" должно быть не в конце запроса.

Ибо результат "correctHours" - всего 4 записи в которых есть информация,
а после соединения с "fullCombin" образуется 1416 записей, из которых только те 4 имеют смысловую нагрузку и те поля которые используются в том окончании запроса.

Огромный вопрос - зачем присоединять типа справочник, причем непонятно чего, что бы чего-то там дальше что-то обрабатывало?
Зачем эта информация без смысла, в дальнейшей обработке?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121425
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В результате
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
--====================================================================================================
,fullCombin          AS (
------------------------------------------------------------------------------------------------------
SELECT
  *
FROM baseObjList
  CROSS JOIN baseProf
)


получается некий набор данных, не имеющий первичного ключа.

А потом мы его джойним с
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
--====================================================================================================
,connTab             AS (
------------------------------------------------------------------------------------------------------
SELECT
  fC.hNum              as hNum,
  fC.hConn             as hConn,
  fC.objName           as objName,
  fC.code + fC.codeAdd as code,
  fC.tagCode           as tagCode,
  --
  tAdC.grp             as grp,
  tAdC.hBegin          as hBegin,
  tAdC.hEnd            as hEnd
FROM fullCombin fC
  LEFT JOIN correctHours tAdC on (fC.objName = tAdC.Name)
)


по полю, не являщимся первичным ключом. Физический смысл этого действа?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121427
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Для каждого из 59 единиц оборудования нужно 24 строки.

В какой таблице список этих единиц?
Какой первичный ключ?
Каким образом таблица RECORDS ссылается на единицу оборудования?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121429
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Begimot441Вот окончание запроса, которое я отрезал

Вот поэтому-то и надо с данным вопросом идти не на форум, а к старшим товарищам,
которые знают конкретную базу конкретной системы.

Похоже что все старшие товарищи сидят где-то в америках/индиях/итп, а мы общаемся с самым старшим из тех что есть тут.
При этом этот старший может быть вообще, менеджером по продажам :)
Знаком с подобными ситуациями :)
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121430
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Далее эти 59х24 строки поступают на вход Системы, которая уже их обрабатывает нужным образом.

Что такое Система, есть ли там документированное API?
Или это так же творчество каких-то местных товарищей?
Ну или не местных. Короче, не авторов системы.

Типа мы тут вяжем веники, но попалась какая-то оглобля которая весь веник ломает. Как эту оглоблю правильно привязать?

IMHO проблема кроется несколько выше чем вы пытаетесь ее решить.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121431
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
--====================================================================================================
 freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================


Что такое задачи (task)?
Зачем рассматриваем все таски, почему не отсеиваем закрытые?
Почему думаем что максимальный RECORDS.ID имеет отнощение к ремонту?
Почему думаем что max(RECODS.Ts2) имеет отношение к max(RECODS.Id)?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121434
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
--====================================================================================================
,freshEventList      AS (
------------------------------------------------------------------------------------------------------
SELECT
  RECORDS.taskId                    as taskId,
  RECORDS.folderId                  as folderId,
  DATEADD(hour, 5, RECORDS.tS1    ) as beginDt,
  DATEADD(hour, 5, RECORDS.dueDate) as endDate,
  RECORDS.Description               as dscr,
  RECORDS.impact                    as impact,
  RECORDS.status                    as status
FROM RECORDS
  inner join freshIdWithTarget on (RECORDS.id = freshIdWithTarget.id)

WHERE (1=1)
  and (left(RECORDS.Description,14) = 'Вывод в ремонт')
  and (RECORDS.status <> 9)
)
--====================================================================================================


Что такое RECORDS.status?
Почему он не коррелирует с RECORDS.Description?
DATEADD(hour, 5, - это смещение на местный часовой пояс, система пишет дату-время в GMT?


Абстрактно.
В таких запросах нехорошо писать

Код: plsql
1.
2.
SELECT
  fEl.*                    ,


лучше писать все поля полностью, это дает возможность нормально проследить/(прогрепать) откуда оно взялось.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121456
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тут получилось радикально ускорить последний джойн
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
--====================================================================================================
,connTab             AS (
------------------------------------------------------------------------------------------------------
SELECT
  fC.hNum              as hNum,
  fC.hConn             as hConn,
  fC.objName           as objName,
  fC.code + fC.codeAdd as code,
  fC.tagCode           as tagCode,
  tAdC.grp             as grp,
  tAdC.hBegin          as hBegin,
  tAdC.hEnd            as hEnd
FROM fullCombin fC
  LEFT JOIN correctHours tAdC on (fC.objName = tAdC.Name) -- кстати, через LEFT меньше чтений чем через FULL
---  FULL JOIN correctHours tAdC on (fC.objName = tAdC.Name)
)

--====================================================================================================

SELECT * FROM connTab


но тут я натолкнулся на ограничение Firebird - максимум 255 конекстов в одном запросе.
т.е. делать псевдотаблицы через UNION ALL чревато еще и этим.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121460
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт реализации таблицы fullCombin в виде физической таблицы.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121464
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизированный запрос, с использованием физической fullCombin

Использовать псевдотаблицы в данном случае не получится, наткнемся на ошибку
  • "Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255."
Код: plsql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
-- https://www.sql.ru/forum/1340973/proshu-sovet-po-optimizacii-zaprosa

-- исходные таблицы с данными:
--   RECORDS
--   FOLDERS

-- Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21
WITH
--====================================================================================================
 freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================
,freshEventList      AS (
------------------------------------------------------------------------------------------------------
SELECT
  RECORDS.taskId                    as taskId,
  RECORDS.folderId                  as folderId,
  DATEADD(hour, 5, RECORDS.tS1    ) as beginDt,
  DATEADD(hour, 5, RECORDS.dueDate) as endDate,
  RECORDS.Description               as dscr,
  RECORDS.impact                    as impact,
  RECORDS.status                    as status
FROM RECORDS
  inner join freshIdWithTarget on (RECORDS.id = freshIdWithTarget.id)

WHERE (1=1)
  and (left(RECORDS.Description,14) = 'Вывод в ремонт')
  and (RECORDS.status <> 9)
)
--====================================================================================================
,inDayEventList      AS (
------------------------------------------------------------------------------------------------------
SELECT
  fEl.*                    ,
  1                 as grp
FROM freshEventList fEl
WHERE (beginDt >= DATEADD(day,1, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (endDate <  DATEADD(day,2, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
)

--====================================================================================================
,startFirstDayEvList AS (
------------------------------------------------------------------------------------------------------
SELECT
  fEl.taskId        as taskId  ,
  fEl.folderId      as folderId,
  fEl.beginDt       as beginDt ,
  NULL              as endDate ,
  fEl.dscr          as dscr    ,
  fEl.impact        as impact  ,
  fEl.status        as status  ,
  2                 as grp
FROM freshEventList fEl
WHERE (beginDt >= DATEADD(day,1, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (beginDt <  DATEADD(day,2, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (endDate >= DATEADD(day,2, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
)
--====================================================================================================
,endLastDayEvList    AS (
------------------------------------------------------------------------------------------------------
SELECT
  fEl.taskId        as taskId   ,
  fEl.folderId      as folderId ,
  NULL              as beginDt  ,
  fEl.endDate       as endDate  ,
  fEl.dscr          as dscr     ,
  fEl.impact        as impact   ,
  fEl.status        as status   ,
  3                 as grp
FROM freshEventList fEl
WHERE (beginDt <  DATEADD(day,1, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (endDate >= DATEADD(day,1, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (endDate <  DATEADD(day,2, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
)
--====================================================================================================
,crossDayEventList   AS (
------------------------------------------------------------------------------------------------------
SELECT
  fEl.*                    ,
  4                 as grp
FROM freshEventList fEl
WHERE (beginDt < DATEADD(day,1, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
  and (endDate > DATEADD(day,2, (DATEADD(hour, 2,(cast(CURRENT_DATE as timestamp))))))
)
--====================================================================================================
,comEvents           AS (
------------------------------------------------------------------------------------------------------
SELECT * FROM inDayEventList      UNION ALL
SELECT * FROM startFirstDayEvList UNION ALL 
SELECT * FROM endLastDayEvList    UNION ALL
SELECT * FROM crossDayEventList
)
--====================================================================================================
,eventListWithObj    AS (
------------------------------------------------------------------------------------------------------
SELECT
  eL.grp            as grp,
  fLd.Name          as Name,
  eL.dscr           as dscr,
  eL.beginDt        as beginDt,
  eL.endDate        as endDate
FROM comEvents eL
  LEFT JOIN FOLDERS fLd ON (eL.folderId = fLd.UID)
WHERE (left(fLd.Name, 7) = 'ЮП ГТЭС'      )
   or (left(fLd.Name,13) = 'ГПЭС Аггреко-')
   or (left(fLd.Name,11) = 'ГПЭС Зимнее'  )
   or (left(fLd.Name,10) = 'ГПЭС КНС-2'   )
-- ORDER BY beginDt -- сортировка раньше времени - не нужна
)
--====================================================================================================
,addClearHour        AS (
------------------------------------------------------------------------------------------------------
SELECT
  tElWo.*,
  EXTRACT(hour FROM tElWo.beginDt) as hBegin,
  EXTRACT(hour FROM tElWo.endDate) as hEnd
FROM eventListWithObj tElWo
)
--====================================================================================================
,correctHours        AS (
------------------------------------------------------------------------------------------------------
SELECT
  grp                                                                  as grp,
  Name                                                                 as Name,
  beginDt                                                              as beginDt,
  endDate                                                              as endDate,
  CASE WHEN hBegin = 0 THEN 24 WHEN hBegin = 1 THEN 25 ELSE hBegin END as hBegin,
  CASE WHEN hEnd   = 0 THEN 24 WHEN hEnd   = 1 THEN 25 ELSE hEnd   END as hEnd
FROM addClearHour
)
/*
--====================================================================================================
,baseProf            AS (
------------------------------------------------------------------------------------------------------
SELECT  2 hNum,   2 hConn, 8890100002 code FROM RDB$DATABASE UNION ALL
SELECT  3 hNum,   3 hConn, 8890100003 code FROM RDB$DATABASE UNION ALL
SELECT  4 hNum,   4 hConn, 8890100004 code FROM RDB$DATABASE UNION ALL
SELECT  5 hNum,   5 hConn, 8890100005 code FROM RDB$DATABASE UNION ALL
SELECT  6 hNum,   6 hConn, 8890100006 code FROM RDB$DATABASE UNION ALL
SELECT  7 hNum,   7 hConn, 8890100007 code FROM RDB$DATABASE UNION ALL
SELECT  8 hNum,   8 hConn, 8890100008 code FROM RDB$DATABASE UNION ALL
SELECT  9 hNum,   9 hConn, 8890100009 code FROM RDB$DATABASE UNION ALL
SELECT 10 hNum,  10 hConn, 8890100010 code FROM RDB$DATABASE UNION ALL  
SELECT 11 hNum,  11 hConn, 8890100011 code FROM RDB$DATABASE UNION ALL 
SELECT 12 hNum,  12 hConn, 8890100012 code FROM RDB$DATABASE UNION ALL 
SELECT 13 hNum,  13 hConn, 8890100013 code FROM RDB$DATABASE UNION ALL 
SELECT 14 hNum,  14 hConn, 8890100014 code FROM RDB$DATABASE UNION ALL 
SELECT 15 hNum,  15 hConn, 8890100015 code FROM RDB$DATABASE UNION ALL 
SELECT 16 hNum,  16 hConn, 8890100016 code FROM RDB$DATABASE UNION ALL  
SELECT 17 hNum,  17 hConn, 8890100017 code FROM RDB$DATABASE UNION ALL 
SELECT 18 hNum,  18 hConn, 8890100018 code FROM RDB$DATABASE UNION ALL  
SELECT 19 hNum,  19 hConn, 8890100019 code FROM RDB$DATABASE UNION ALL 
SELECT 20 hNum,  20 hConn, 8890100020 code FROM RDB$DATABASE UNION ALL 
SELECT 21 hNum,  21 hConn, 8890100021 code FROM RDB$DATABASE UNION ALL 
SELECT 22 hNum,  22 hConn, 8890100022 code FROM RDB$DATABASE UNION ALL 
SELECT 23 hNum,  23 hConn, 8890100023 code FROM RDB$DATABASE UNION ALL 
SELECT 24 hNum,  24 hConn, 8890100024 code FROM RDB$DATABASE UNION ALL 
SELECT  1 hNum,  25 hConn, 8890100025 code FROM RDB$DATABASE
)
--====================================================================================================
,baseObjList         AS (
------------------------------------------------------------------------------------------------------
SELECT 'ЮП ГТЭС ЭБ-1'          objName,  10100 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-2'          objName,  10200 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-3'          objName,  10300 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-4'          objName,  10400 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-5'          objName,  10500 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-6'          objName,  10600 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-7'          objName,  10700 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ЮП ГТЭС ЭБ-8'          objName,  10800 codeAdd,  980 tagCode FROM RDB$DATABASE UNION ALL

SELECT 'ГПЭС КНС-2 ГПУ-М1.1'   objName,  21100 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М1.2'   objName,  21200 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М1.3'   objName,  21300 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М1.4'   objName,  21400 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М1.5'   objName,  21500 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М2.1'   objName,  22100 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М2.2'   objName,  22200 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М2.3'   objName,  22300 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М2.4'   objName,  22400 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС КНС-2 ГПУ-М2.5'   objName,  22500 codeAdd,  981 tagCode FROM RDB$DATABASE UNION ALL

SELECT 'ГПЭС Зимнее ГПГУ-1'    objName,  30100 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-2'    objName,  30200 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-3'    objName,  30300 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-20'   objName,  32000 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-21'   objName,  32100 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-22'   objName,  32200 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-23'   objName,  32300 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-24'   objName,  32400 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Зимнее ГПГУ-25'   objName,  32500 codeAdd,  982 tagCode FROM RDB$DATABASE UNION ALL

SELECT 'ГПЭС Аггреко-1 ГПУ-1'  objName,  40100 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-2'  objName,  40200 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-3'  objName,  40300 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-4'  objName,  40400 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-5'  objName,  40500 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-6'  objName,  40600 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-7'  objName,  40700 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-8'  objName,  40800 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-9'  objName,  40900 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-10' objName,  41000 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-11' objName,  41100 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-12' objName,  41200 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-13' objName,  41300 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-14' objName,  41400 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-15' objName,  41500 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-1 ГПУ-16' objName,  41600 codeAdd,  983 tagCode FROM RDB$DATABASE UNION ALL

SELECT 'ГПЭС Аггреко-2 ГПУ-1'  objName,  50100 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-2'  objName,  50200 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-3'  objName,  50300 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-4'  objName,  50400 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-5'  objName,  50500 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-6'  objName,  50600 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-7'  objName,  50700 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-8'  objName,  50800 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-9'  objName,  50900 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-10' objName,  51000 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-11' objName,  51100 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-12' objName,  51200 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-13' objName,  51300 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-14' objName,  51400 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-15' objName,  51500 codeAdd,  984 tagCode FROM RDB$DATABASE UNION ALL
SELECT 'ГПЭС Аггреко-2 ГПУ-16' objName,  51600 codeAdd,  984 tagCode FROM RDB$DATABASE
)
--====================================================================================================
,fullCombin          AS (
------------------------------------------------------------------------------------------------------
SELECT
  *
FROM baseObjList
  CROSS JOIN baseProf
)
*/
--====================================================================================================
,connTab0           AS (
------------------------------------------------------------------------------------------------------
SELECT
  fC.hNum              as hNum,
  fC.hConn             as hConn,
  fC.objName           as objName,
  fC.code + fC.codeAdd as code,
  fC.tagCode           as tagCode,
  --
  tAdC.grp             as grp,
  tAdC.hBegin          as hBegin,
  tAdC.hEnd            as hEnd
FROM correctHours tAdC
  LEFT JOIN fullCombin fC on (fC.objName = tAdC.Name)

union all

SELECT
  fC.hNum              as hNum,
  fC.hConn             as hConn,
  fC.objName           as objName,
  fC.code + fC.codeAdd as code,
  fC.tagCode           as tagCode,
  --
  NULL                  as grp,
  NULL                  as hBegin,
  NULL                  as hEnd
FROM fullCombin fC
)
--====================================================================================================
,connTab           AS (
------------------------------------------------------------------------------------------------------
SELECT
  connTab0.hNum                    as hNum,    -- 1
  connTab0.hConn                   as hConn,   -- 2
  connTab0.objName                 as objName, -- 3
  connTab0.code                    as code,    -- 4
  connTab0.tagCode                 as tagCode, -- 5
  --
  max(connTab0.grp   )             as grp,
  max(connTab0.hBegin)             as hBegin,
  max(connTab0.hEnd  )             as hEnd

FROM connTab0
group by 1, 2, 3, 4, 5
)

SELECT *
FROM connTab



План, время выполнения.
Код: plsql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Plan
------------------------------------------------
PLAN JOIN (JOIN (JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL INDAYEVENTLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL INDAYEVENTLIST FEL RECORDS INDEX (RDB$PRIMARY1))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL STARTFIRSTDAYEVLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL STARTFIRSTDAYEVLIST FEL RECORDS INDEX (RDB$PRIMARY1))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL ENDLASTDAYEVLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL ENDLASTDAYEVLIST FEL RECORDS INDEX (RDB$PRIMARY1))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL CROSSDAYEVENTLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL CROSSDAYEVENTLIST FEL RECORDS INDEX (RDB$PRIMARY1)), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO FLD INDEX (RDB$PRIMARY2), CONNTAB CONNTAB0 FC INDEX (IDX_FULLCOMBIN_OBJNAME)), CONNTAB CONNTAB0 FC NATURAL)

Adapted Plan
------------------------------------------------
PLAN JOIN (JOIN (JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL INDAYEVENTLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL INDAYEVENTLIST FEL RECORDS INDEX (INTEG_12))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL STARTFIRSTDAYEVLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL STARTFIRSTDAYEVLIST FEL RECORDS INDEX (INTEG_12))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL ENDLASTDAYEVLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL ENDLASTDAYEVLIST FEL RECORDS INDEX (INTEG_12))
PLAN JOIN (SORT (CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL CROSSDAYEVENTLIST FEL FRESHIDWITHTARGET RECORDS NATURAL), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO EL CROSSDAYEVENTLIST FEL RECORDS INDEX (INTEG_12)), CONNTAB CONNTAB0 TADC ADDCLEARHOUR TELWO FLD INDEX (INTEG_21), CONNTAB CONNTAB0 FC INDEX (IDX_FULLCOMBIN_OBJNAME)), CONNTAB CONNTAB0 FC NATURAL)

Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 46,00 ms
Avg fetch time: 0,03 ms

Memory
------------------------------------------------
Current: 35 597 256
Max    : 36 662 416
Buffers: 2 048

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 9 583
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|FOLDERS                        |         0 |         3 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
|FULLCOMBIN                     |         0 |        72 |        1416 |       0 |       0 |       0 |        0 |        0 |        0 |
|RECORDS                        |         0 |       696 |        1832 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+



Фишка ускорения - мы не делаем полного джойна.
Сначала тянем записи с данными + джойн справочника. Это быстро.
Потом через UNION ALL тянем весь справочник, без данных.
Зная что записей данными у нас только по одной, делаем group by по полям справочника (= первичный ключ справочника, если бы он был) а по полям с данными можно делать хоть что, к примеру max() - там покажет либо NULL где были только записи из справочника, либо некие данные если по этим полям ПК справочника были записи не только справочника.

Выполняется за 46ms.

Сравнить выдаваемые результаты мне не с чем - исходный запрос у меня уходит в бесконечность.

В любом случае - это неправильный путь решения задачи.
Нужно делать по другому.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121468
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипты таблиц + данные для тестирования.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121529
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
авторОгромный вопрос - зачем присоединять типа справочник, причем непонятно чего, что бы чего-то там дальше что-то обрабатывало?
Справичник оборудования (59 строк) и часов (24 строки) несут в себе коды. По этим кодам БД-приемник (куда я все это в итоге направляю) помещает данные по нужным тегам. (Это специализированная БД, менять я там ничего не могу)


авторЗачем эта информация без смысла, в дальнейшей обработке?
Если вопрос в том, зачем столько информации, в которой нули, то они нужны. Они ставят нули там, где вчера были единички.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121531
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

авторФизический смысл этого действа?

Смысл в том, что сначала я подготовил полную таблицу, где на на каждое из 59 единиц оборудование заводится 24 часа (59х24). Это как бы вся развертка. Затем я присоединяю к ней полезную информацию, чтобы указать в какой час завтрашних будет ремонт, а в какой нет.
Для этого я рассматриваю варианты:
1. Завтра ремонт целые сутки, тогда все 24 часа ставлю маркер 1;
2. Завтра, например в 9 утра, начало ремонта. Тогда я помечаю маркером все часы начиная с 9 до конца суток;
3. Завтра, например в 13 дня, завершение ремонта. Тогда я, соответственно с первого часа да 13 ставлю маркер;
4. Завтра, например, короткий ремонт с 10 до 18. Тогда маркеры с 10 до 18, остальные нули.

Плюс еще особенность, что сутки начинаются с 2 часов. Завод в Сибири, а отчитывается по времени Москвы.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121533
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

авторПохоже что все старшие товарищи сидят где-то в америках/индиях/итп, а мы общаемся с самым старшим из тех что есть тут.
При этом этот старший может быть вообще, менеджером по продажам :)
Знаком с подобными ситуациями :)

Я не настолько умен, чтобы быть менеджером по продажам.))
Я уже сказал, кто я. Я технический руководитель нескольких блоков.
Вы сразу поняли, что я не настоящий программист и не лютый спец по SQL. Это верно.
Я специалист по автоматизации технологического оборудования, а подобные вещи, как SQL-запросы, вынужден применять.
Прекрасно понимаю, что мне не хватает знаний в этом направлении. Поэтому у вас и учусь. И вы мне в этом здорово помогаете, за что спасибо!
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121542
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

авторВ какой таблице список этих единиц?
Оборудование перечислено в теблице FOLDERS . Но там оно не все. Если по оборудованию еще не было отключений, оно туда еще и не попало.
С другой стороны, полный перечень оборудования в моей псевдотаблице baseObjeclList . В ней я указываю codeAdd - это прибавка для формирования кода оборудования для целевой записи.

авторКакой первичный ключ?
Первичный ключ в таблице FOLDERS - видимо UID . Тут я плохо разбираюсь, а тебе я направлял DDL. Проверь сам, пож-та

авторКаким образом таблица RECORDS ссылается на единицу оборудования?
Посредством поля FOLDERID
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121564
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще какие-то конкретные вопросы?
Заставлять тебя разбираться в твоей системе, кучей наводящих вопросов, уже что-то надоело.
Просто читать лекции - как бы не мне оно надо.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121566
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

авторЧто такое задачи (task)?
Зачем рассматриваем все таски, почему не отсеиваем закрытые?

TaskId - это идентификатор группы записей. Когда событие корректируется, то прибавляется новая запись с новыми данными, но с тем же TaskId. Я уже сам понял, что я не отсеивал устаревшие данные. А устаревшие данные - это те, у которых время окончания события раньше, чем текущее время запроса. Это можно добавить в начало. Я у себя добавил, время запроса уменьшилось с 20 сек до 13 сек.


авторПочему думаем что максимальный RECORDS.ID имеет отнощение к ремонту?
Почему думаем что max(RECODS.Ts2) имеет отношение к max(RECODS.Id)?
Это у меня осталось в виде мусора, сорри. Это можно удалить.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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