Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать ужасный запрос / 14 сообщений из 14, страница 1 из 1
29.09.2016, 03:16:10
    #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
29.09.2016, 11:54:01
    #39317688
Guest7776
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать ужасный запрос
Hrundel,

Хоть бы один Ваш способ увидеть, а то получается, что нужно сделать Вашу работу за бесплатно
...
Рейтинг: 0 / 0
29.09.2016, 12:00:06
    #39317698
Переписать ужасный запрос
regexpr
...
Рейтинг: 0 / 0
29.09.2016, 12:25:48
    #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
30.09.2016, 12:01:18
    #39318500
Hrundel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать ужасный запрос
Guest7776,

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

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

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

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

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

Все тяжко, так как нет людей, кто создал отчет. И никто его трогать не хочет
...
Рейтинг: 0 / 0
30.09.2016, 12:12:31
    #39318512
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать ужасный запрос
Hrundelctf_record очень длинная текстовая строка.
Строка может быть и длинная. но используется только 125 первых символов.
...
Рейтинг: 0 / 0
30.09.2016, 12:15:09
    #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
30.09.2016, 13:05:25
    #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
30.09.2016, 13:27:22
    #39318605
Переписать ужасный запрос
А зачем запрос отрабатывает 30000 раз? Куда дели системного архитектора?
...
Рейтинг: 0 / 0
30.09.2016, 14:10:32
    #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
30.09.2016, 14:41:46
    #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
04.10.2016, 02:44:54
    #39319987
Hrundel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать ужасный запрос
SQL*Plus,

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


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