powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать ужасный запрос
14 сообщений из 14, страница 1 из 1
Переписать ужасный запрос
    #39317398
Hrundel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

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

Запрос ужасный, исправить можно разными способами. Вот пытаюсь собрать различные способы.

Сам запрос. Он отрабатывает 30.000 раз. В таблице 90.000 строк Дисковый запросов под ноль, но жрет CPU 99.9%, что и ожидаемо.

ctf_record очень длинная текстовая строка.

Код: 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.
SELECT DISTINCT Substr(lz_vc_ndsi_job.ctf_record, 66, 7) 
FROM            cods_etl.lz_vc_ndsi_job 
WHERE           Substr(lz_vc_ndsi_job.ctf_record, 4, 1) IN ('0') 
AND             ( 
                                lz_vc_ndsi_job.tcr_number IN ('0')) 
AND             ( 
                                lz_vc_ndsi_job.transaction_code = '46') 
AND             ( ( 
                                                Substr(lz_vc_ndsi_job.ctf_record, 47, 3) IN ('001', 
                                                                                             '010') 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 56, 1) = '2' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '120' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' ' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 94, 3) = ' ' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 101, 1) IN ( 'Y', 
                                                                                              'N') 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 133, 2) = '10' ) 
                OR              ( 
                                                Rtrim(Ltrim(Substr(lz_vc_ndsi_job.ctf_record, 50, 3))) IN ('001', 
                                                                                                           '010') 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 53, 1) = '2' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '6' 
                                AND             substr(lz_vc_ndsi_j ob.ctf_record, 61, 3) = '900' 
                                AND             ltrim(rtrim(substr(lz_vc_ndsi_job.ctf_record, 64, 2))) = 'S' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 121, 2) = '06' ) 
                OR              ( 
                                                substr(lz_vc_ndsi_job.ctf_record, 47, 3) IN ('001', 
                                                                                             '010') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 56, 1) = '2' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '130' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' ' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 94, 3) = ' ' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 101, 1) IN ( 'Y', 
                                                                                              'N') ) 
                OR              ( 
                                                substr(lz_vc_ndsi_job.ctf_record, 47, 3) IN ('001') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 56, 1) = '2' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '210' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' ' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 94, 3) = ' ' 
                                AND             substr(lz_ vc_ndsi_job.ctf_record, 101, 1) IN ( 'Y', 
                                                                                               'N') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 133, 2) = '08' ) 
                OR              ( 
                                                substr(lz_vc_ndsi_job.ctf_record, 47, 3) IN ('001') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 56, 1) = '2' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '140' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' ' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 94, 3) IN ('011', 
                                                                                             '012') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 101, 1) IN ( 'Y', 
                                                                                              'N') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 133, 2) = '09' ) 
                OR              ( 
                                                substr(lz_vc_ndsi_job.ctf_record, 47, 3) IN ('001', 
                                                                                             '010') 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '2' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '110' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' ' 
                                AND             substr(lz_vc_ndsi_job.ctf_record, 94, 1) IN ('I', 
                                                                                             'F', 
                                                                                             'C', 
                                                                                             'T') ) )
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39317688
Guest7776
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hrundel,

Хоть бы один Ваш способ увидеть, а то получается, что нужно сделать Вашу работу за бесплатно
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39317698
regexpr
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39317720
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Количество substr сокращается элементарно, у вас множество условий на последовательные символы
2) # Он отрабатывает 30.000 раз.
За какой период?
3)
AND (
lz_vc_ndsi_job.tcr_number IN ('0'))
AND (
lz_vc_ndsi_job.transaction_code = '46')
насколько селективны эти условия? есть индексы?
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318500
Hrundel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest7776,

Я пока думал про регулярки уменьшить прогоны.

Я не прошу работу сделать. Я просто хочу посмотреть куда можно еще копать

Другие способы

1. Функциональные индексы
2. Перегрупировка условий
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318505
Hrundel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cheese))),

Дело в том, что он отрабатывает 30000 раз но с разаными результатами. Как я понял, отчет что то обновляет в таблице и запускается заново.

Все тяжко, так как нет людей, кто создал отчет. И никто его трогать не хочет
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318512
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hrundelctf_record очень длинная текстовая строка.
Строка может быть и длинная. но используется только 125 первых символов.
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318516
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
AND Substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
AND Substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '120' 


=
Код: sql
1.
AND Substr(lz_vc_ndsi_job.ctf_record, 60, 4) = '4120' 



и т.д. и т.п.
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318586
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183
Код: sql
1.
2.
AND Substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
AND Substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '120' 


=
Код: sql
1.
AND Substr(lz_vc_ndsi_job.ctf_record, 60, 4) = '4120' 



и т.д. и т.п.
Код: plsql
1.
 Substr(lz_vc_ndsi_job.ctf_record, 60, 4) like '______...__4120____...___'
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318605
А зачем запрос отрабатывает 30000 раз? Куда дели системного архитектора?
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318661
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hrundel
Код: plsql
1.
2.
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' '
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 94, 3) = ' ' 

Если все такие мёртвые ветки выкинуть, то останется всего одна.
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39318706
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicHrundel
Код: plsql
1.
2.
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 64, 2) = ' '
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 94, 3) = ' ' 

Если все такие мёртвые ветки выкинуть, то останется всего одна.
+ еще мелочевку дошлифовать, уменьшив число SUBSTR и сравнений, заменой
Код: plsql
1.
2.
3.
4.
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 60, 1) = '4' 
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 61, 3) = '120' 
 


на
Код: plsql
1.
                                AND             Substr(lz_vc_ndsi_job.ctf_record, 59, 5) = 'V4120' 
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39319987
Hrundel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

А что насчет регуляки? Одна регулярка на одно условие? Просто пытаюсь понять стоимость регулярки против нескольких substr
...
Рейтинг: 0 / 0
Переписать ужасный запрос
    #39320100
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТС, неужели настолько лень самому "вынести за скобки" кучу дублирующихся условий
типа Substr(lz_vc_ndsi_job.ctf_record, 59, 1) = 'V' и т.п.? )
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать ужасный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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