powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации запроса
25 сообщений из 59, страница 1 из 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
25 сообщений из 59, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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