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

Запрос читает события в БД, где заведены события по выводу в ремонт генераторов. Затем он их нехитро обрабатывает, готовит матрицу и ставит в нее маркер, когда завтра оборудование будет в ремонте (по часам завтрашних суток).
Все прекрасно работает, но долго (30 сек).
В каком направлении оптимизировать? Видимо, дело в моем безумном объявлении таблицы с LEFT JOIN по "1=1"?

Заранее спасибо за помощь?

Код: 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.
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.
WITH queryTarget AS (SELECT 'Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21' AS target FROM RDB$DATABASE)

,freshId As (SELECT max(Id) Id, taskId, max(Ts2) maxTs2 FROM RECORDS GROUP BY taskId)

,freshIdWithTarget AS (SELECT Id, taskId, maxTs2 FROM freshId LEFT JOIN queryTarget ON 1=1)

,freshEventList As
(
SELECT taskId, folderId,
    DATEADD(hour, 5, tS1) beginDt, DATEADD(hour, 5, dueDate) endDate, Description dscr, impact, status
FROM RECORDS 
WHERE Id IN (SELECT Id FROM freshIdWithTarget) AND left(Description,14) ='Вывод в ремонт' AND status<>9
ORDER BY taskId
)

,inDayEventList As
(
SELECT fEl.*, 1 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, fEl.folderId, fEl.beginDt, NULL endDate, fEl.dscr, fEl.impact, fEl.status, 2 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, fEl.folderId, NULL beginDt, fEl.endDate, fEl.dscr, fEl.impact, fEl.status, 3 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 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, fLd.Name, eL.dscr, eL.beginDt, eL.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) hBegin, EXTRACT(hour FROM tElWo.endDate) hEnd FROM eventListWithObj tElWo)

,correctHours AS
(
SELECT grp, Name, beginDt, endDate,
    CASE WHEN hBegin = 0 THEN 24 WHEN hBegin = 1 THEN 25 ELSE hBegin END hBegin,
    CASE WHEN hEnd = 0 THEN 24 WHEN hEnd = 1 THEN 25 ELSE hEnd END 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 LEFT JOIN baseProf ON 1 = 1)

,connTab AS
(
SELECT fC.hNum, fC.hConn, fC.objName, fC.code + fC.codeAdd code, fC.tagCode, tAdC.grp, tAdC.hBegin, tAdC.hEnd
FROM fullCombin fC
LEFT JOIN correctHours tAdC ON fC.objName=tAdC.Name
)

SELECT * from connTab
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121312
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные таблицы, их DDL, включая индексы.
Количество записей в исходных таблицах.
План запроса.
Статистика запроса.

В каком инструменте отлаживаешь запрос?
Версия сервера Firebird.

Пробовал отключать запрос частями?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121317
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441,
Перемести содержимое юнионов в соответствующие таблички. Само по себе это, может быть, и не ускорит запрос, но поднимет общую культуру разработки и создаст почву для дальнейшей оптимизации.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121326
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F, спасибо!
Можно попросить пример? Я не разобрался, к сожалению, как это правильно сделать, хоьть и думал в этом направлении
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121329
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отформатировал запрос что бы было понятнее что там есть

Код: 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.
-- https://www.sql.ru/forum/1340973/proshu-sovet-po-optimizacii-zaprosa

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

WITH
--====================================================================================================
 queryTarget         AS (
------------------------------------------------------------------------------------------------------
SELECT
  'Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21' as target
FROM RDB$DATABASE
)
--====================================================================================================
,freshId             AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================
,freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  Id       as Id,
  taskId   as taskId,
  maxTs2   as maxTs2
FROM freshId
  LEFT JOIN queryTarget ON (1 = 1)
)
--====================================================================================================
,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 (Id IN (SELECT Id FROM freshIdWithTarget))
  and (left(Description,14) = 'Вывод в ремонт')
  and (status <> 9)
ORDER BY taskId
)
--====================================================================================================
,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 endDate      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 beginDt      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
  LEFT JOIN baseProf on (1 = 1)
)
--====================================================================================================
,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)
)
--====================================================================================================

SELECT * FROM connTab



Налицо:
  • 1. Явное злоупотебление LEFT JOIN baseProf on (1 = 1) . Если не ошибаюсь в Fibird это пишется как CROSS JOIN baseProf но я сам никогда этим не пользовался, за отсутствием надобности.
  • 2. Излишнее раскладывание запроса по кусочкам, без попытки посмотреть на шаг вперед. Это видимо соответствует каким-то методикам и букварям, но усложняет конструкцию и снижает эффективность.
  • 3. Злоупотребление UNION ALL . Непонятно, есть ли реальная нужда собирать псевдотаблицы из констант в запросе. Почему бы не хранить это в реальных таблицах? Речь про baseProf, baseObjList и вытекающий из них fullCombin .
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121330
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое количество записей в RECORS и FOLDERS?
Каковы их DDL?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121331
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассмотрим первые 3 части запроса.

Код: 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.
WITH
--====================================================================================================
 queryTarget         AS (
------------------------------------------------------------------------------------------------------
SELECT
  'Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21' as target
FROM RDB$DATABASE
)
-- получили псевдотаблицу из одного поля и одной записи
-- непонятно для чего.
-- ниже эта queryTarget используется только один раз, в freshIdWithTarget,
-- но при этом непонятно для чего
--  - join с ней ничего не изменяет, количество записей как было так и осталось
--  - а то единственное поле которое могли бы при этом джойне взять - не берем
--  - и нафига такая таблица?
--====================================================================================================
,freshId             AS (
------------------------------------------------------------------------------------------------------
SELECT
  max(Id)  as Id,
  taskId   as taskId,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
-- получили из реальной таблицы данные,
-- сгруппированные по taskId и для каждой найдено max(Id) и max(Ts2)
-- тут возникают вопрос по оптимизации - насколько эффективно он работает?
-- Тем более что именно эта часть выполняется совершенно автономно
--====================================================================================================
,freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  Id       as Id,
  taskId   as taskId,
  maxTs2   as maxTs2
FROM freshId
  LEFT JOIN queryTarget ON (1 = 1)
)
-- судя по названию "freshIdWithTarget" мы должны были соединить результаты
-- "freshId" и "queryTarget"
-- Результаты запроса "freshId" мы получаем 1:1 а из таблицы "queryTarget" ничео не берем
-- Тогда зачем это всё?
--====================================================================================================



В результате вышепроцитированное заменяется на полностью аналогичное:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH
--====================================================================================================
,freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  taskId   as taskId,
  --
  max(Id)  as Id,
  max(Ts2) as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================



Либо такое, если поле target нам все-так нужно:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH
--====================================================================================================
,freshIdWithTarget   AS (
------------------------------------------------------------------------------------------------------
SELECT
  'Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21' as target,
  taskId                                           as taskId,
  --
  max(Id)                                          as Id,
  max(Ts2)                                         as maxTs2
FROM RECORDS
GROUP BY taskId
)
--====================================================================================================
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121334
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Vlad F, спасибо!
Можно попросить пример? Я не разобрался, к сожалению, как это правильно сделать, хоьть и думал в этом направлении


Это сделать примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table baseProf (
  code  integer not null primary key,
  hNum  integer not null,
  hConn integer not null
);

insert into baseProf(code, hNum, hConn) values (8890100002, 2, 2);
insert into baseProf(code, hNum, hConn) values (8890100003, 3, 3);
...
insert into baseProf(code, hNum, hConn) values (8890100025, 1, 25);
commit;



Но тут так же возникает масса вопросов.

  • 1. Есть ли у тебя право создавать таблицы в этой базе.
  • 2. Кто будет следить за актуальностью данных в этой таблице. Если у вас эти записи непостоянны - то кто-то должен их туда добавить, и вовремя. Причем в самом запросе этого не будет видно.
  • 3. Возможно я неправильно определил что у вас является первичным ключом для этой таблицы.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121335
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто автор исходного запроса?
Ты сам, или просто "досталось по наследству"?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121336
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Автор исходного запроса я((
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121337
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Этот запрос засовывается в информационную Систему. Комментарии из запросов прихродится удалять, с ними не работает.
таких запросос там много и, чтобы не запутаться, я придумал удобную штуку - в начале каждого запроса вставлять псевдотаблицу из одной строки, в которой пишу информацию о запросе. В данном случае - 'Генерация.Профиль на +1 сутки.Рев.2.2 19.12.21'
Она функционально не нужна, но служит в качестве удобного заголовка запроса.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121338
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
База закрытая. Теоретически можно попробовать согласовать доступ, но мне пока не хотелось бы. Можно попросить пока попробовать оптимизировать запрос исходя из того, что доступа на созданию таблицы нет?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121341
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Вот это я увидел во ФлеймРобин на вкладках DDL:

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TABLE RECORDS
(
  ID integer NOT NULL,
  TS1 timestamp NOT NULL,
  TS2 timestamp NOT NULL,
  "TYPE" smallint NOT NULL,
  TASKID integer NOT NULL,
  FOLDERID integer NOT NULL,
  CRITICALITY smallint NOT NULL,
  STATUS smallint NOT NULL,
  DUEDATE timestamp,
  DURATION integer,
  INSERVICE smallint,
  IMPACT float,
  AUDIT smallint,
  HOST varchar(255),
  USERNAME varchar(255),
  DESCRIPTION varchar(8190),
  FILTERLIST varchar(1024),
  LINKID integer,
  CONSTRAINT INTEG_4 PRIMARY KEY (ID)
);
CREATE INDEX IX_FOLDER_ID ON RECORDS (FOLDERID);
CREATE DESCENDING INDEX IX_TASKID ON RECORDS (TASKID);
CREATE INDEX IX_TS ON RECORDS (TS1);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
ON RECORDS TO  SYSDBA WITH GRANT OPTION;



CREATE TABLE FOLDERS
(
  UID integer NOT NULL,
  NAME varchar(256),
  PATH varchar(4096),
  LIBTYPE varchar(256),
  LIBCAT varchar(256),
  CONSTRAINT INTEG_2 PRIMARY KEY (UID)
);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
ON FOLDERS TO  SYSDBA WITH GRANT OPTION;



Надеюсь, это именно то, что Вы мне сказали направить.
Если нет, то уточните, пож-та, что это.

Кол-во записей смешное:
FOLDERS - 50
RECORDS - 500

FireBird 2.5.6
Flime Robin 0.9.3
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121344
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
fraks,
Этот запрос засовывается в информационную Систему. Комментарии из запросов приходится удалять, с ними не работает.


  • А как пробовал делать комментарии?
  • "С ними не работает" - как проявляется?

Begimot441
таких запросос там много и, чтобы не запутаться, я придумал удобную штуку - в начале каждого запроса вставлять псевдотаблицу из одной строки, в которой пишу информацию о запросе.


Я у себя использую именование так - первой строкой запроса, в комментарии пишется имя формы и имя компонента с запросом.
Ниже - комментарии. Использую для того что бы при просмотре запросов через таблицы мониторинга было понятно куда идти разбираться с запросом.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- FrmSklInv.QSel_DD
--
-- Товары одного документа
--

select
  btov.id    as btov_id,
  btov.idtov as id, 
  sa.name    as name,
  bost.ost   as ost,
  btov.kol   as kol,
  bpos.posit as posit
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121346
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
fraks,
База закрытая. Теоретически можно попробовать согласовать доступ, но мне пока не хотелось бы.
Можно попросить пока попробовать оптимизировать запрос исходя из того, что доступа на созданию таблицы нет?

Можно и так.
А не проще было бы спросить эти вопросы у "старших товарищей" - есть же кто-то кто занимается разработкой и обслуживанием этой базы?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121347
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
fraks,
Вот это я увидел во ФлеймРобин на вкладках DDL:

Код: sql
1.
2.
CREATE TABLE RECORDS
...



Надеюсь, это именно то, что Вы мне сказали направить.
Если нет, то уточните, пож-та, что это.

Да, это оно.

Begimot441
Кол-во записей смешное:
FOLDERS - 50
RECORDS - 500

Да, 30 секунд на обработку этих записей - очень дофига.

Можно ли получить эти записи в виде insert-скрипта что бы создать себе стенд для отладки?
Без данных оптимизировать сложнее, а напихивать туда левые данные совершенно нет охоты.

Можно какие-то данные обфусцировать, и брать только те поля которые фигурируют в запросе.

Begimot441
FireBird 2.5.6
Flime Robin 0.9.3

А почему FlameRobin а не IBExpert?
Вы не в России?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121349
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

Я то в России, но Система, с которой я работаю, разработана за океаном. Видимо, поэтому такой выбор.

Данные я могу предоставить. Они не содержат никакой ценности.
Только вот я не нашел, как сделать приличный экспорт.
А вас не устроит, если я выгружу полный SELECT из этих таблиц?
(если нет, то сделаю INSERT на базе выгрузки....как нибудь)
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121350
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441А вас не устроит, если я выгружу полный SELECT из этих таблиц?

Нас устроит заполненный https://dbfiddle.uk/?rdbms=firebird_3.0
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121351
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Begimot441А вас не устроит, если я выгружу полный SELECT из этих таблиц?

Нас устроит заполненный https://dbfiddle.uk/?rdbms=firebird_3.0

Лично не понял про что это :)
А версия сервера автором топика тут была сообщена.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121353
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksЛично не понял про что это :)

Это место, куда ТС может загнать свои данные чтобы позволить остальным испытать
на них свои варианты запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121354
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Поясни чуть подробнее.
Фидл - это имитатор БД, насколько я понял.
Нужно, чтобы я заполнил его реальными данными?
Если да, то для этого надо написать скрипт, который создает таблицы и заполняет ее реальными данными?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121355
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
fraks,

Я то в России, но Система, с которой я работаю, разработана за океаном. Видимо, поэтому такой выбор.

Данные я могу предоставить. Они не содержат никакой ценности.
Только вот я не нашел, как сделать приличный экспорт.

IBExpert умеет в приличный экспорт :)
Для компов с кодовой страницей 1251 он бесплатен.
Буржуям из бесплатного - на FlamerRobin, а ты если будешь и дальше заниматься Firebird - бери IBExpert.

Begimot441
А вас не устроит, если я выгружу полный SELECT из этих таблиц?
(если нет, то сделаю INSERT на базе выгрузки....как нибудь)

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

Это не ко мне а к Сибирякову, он этот вариант предложил.
я им не пользовался, ничего сказать не могу.
И разбираться с этим сервисом желания нету.
Тем более что ХЗ как он там запросы обрабатывает и насколько это сопоставимо с реальным сервером.
Тем более что твоего Firebird 2.5.6 там нету. Там только FB3.0 что не совсем одно и то же.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121359
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Направляю полную выгрузку двух таблиц.
Заранее благодарю!
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121360
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441Запрос читает события в БД, где заведены события по выводу в ремонт генераторов.
Затем он их нехитро обрабатывает, готовит матрицу и ставит в нее маркер, когда
завтра оборудование будет в ремонте (по часам завтрашних суток).

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

При этом у тебя нет таблицы с текущим состоянием оборудования, а только таблица
с историей его изменения, да и та недокументирована и неформализована, а
заполняется от руки.

Я правильно понял задачу?

PS: Хотя глядя на таблицу RECORDS у меня закрадывается впечатление, что вся твоя
портянка сворачивается до тривиального "where INSERVICE=1 AND tomorrow between
DUEDATE and DUEDATE+DURATION".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #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
Прошу совет по оптимизации запроса
    #40121569
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

авторЕсть еще какие-то конкретные вопросы?

Если ДЛЯ ДАННОЙ КОНКРЕТНОЙ КОНФИГУРАЦИИ более рекомендаций не дашь, то огромное тебе спасибо!
13 сек - это вполне приемлимо в моем случае.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121584
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Если ДЛЯ ДАННОЙ КОНКРЕТНОЙ КОНФИГУРАЦИИ более рекомендаций не дашь

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

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

авторРезультаты этого запроса в следующую систему каким образом попадают?
Через файл xls или иным способом?
В Системе есть возможность подключаться к ODBC-коннектам и вставлять в Систему SQL-запросы.
Этот запрос ты и оптимизируешь.
Расшифровка результатов запроса происходит по внутреннему механизму по тем покам, которые я там в запросе присваиваю.



авторЧто там с вопросами на счет допустимости каментов в запросе?
Как пробовал, что значит "с комментариями не работает"?
Я пробовал заводить запросы с комментариями. С комментариями они не функционируб\ют. Не помню, какая ошибка при этом в логе. С корректным определением ошибки в логах у нас тоже не айс.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121663
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441Оборудование перечислено в теблице *FOLDERS*. Но там оно не все. Если по
оборудованию еще не было отключений, оно туда еще и не попало.

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

Справичник оборудования (59 строк) и часов (24 строки) несут в себе коды. По этим кодам БД-приемник (куда я все это в итоге направляю) помещает данные по нужным тегам. (Это специализированная БД, менять я там ничего не могу)


авторЗачем эта информация без смысла, в дальнейшей обработке?
Если вопрос в том, зачем столько информации, в которой нули, то они нужны. Они ставят нули там, где вчера были единички.

Если нули нужны только для того что бы занулять некое табло, то можно просто разделить эти две манипуляциии.

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

Я пробовал заводить запросы с комментариями. С комментариями они не функционируб\ют. Не помню, какая ошибка при этом в логе. С корректным определением ошибки в логах у нас тоже не айс.
Вангую следующее.

Ты попробовал вместо комментария сделать псевдотаблицу, и нигде ее не использовать.
Тот сервер который у тебя (2.5.6) на такое ругается.

ДокументацияДо Firebird 2.5.8 если CTE объявлен, то он должен быть обязательно использован, в
противном случае возникает ошибка "CTE <cte> is not used in query". Начиная с Firebird 2.5.8
вместо ошибки выдаётся предупреждение;

Поэтому ты использовал этот target в следующем джойне, без всякого смысла, только что бы заткнуть ошибку.

Это у тебя отложилось как "нельзя писать комментарии", хотя наверняка можно.

В Firebird комментарии могут быть двух синтаксисов:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select -- все что правее двух минусов в текуще строке - комментарий

/* комментарий заключенный в такие парные ограничения */

select 
  /*
  в отличии от первого вида, 
  может быть многострочным
  */
...
Рейтинг: 0 / 0
Прошу совет по оптимизации запроса
    #40121831
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
--====================================================================================================
,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'   )
)



Мне думается что можно сделать так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--====================================================================================================
,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 (fLd.LIBTYPE = 'Генератор')
)



Либо вообще не ставить условия.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--====================================================================================================
,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)
)


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

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


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