Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 25 сообщений из 40, страница 1 из 2
07.07.2017, 09:12
    #39484223
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
пишу вот такой вот запрос:
Код: 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.
select o.operation_id,
       o.copied_from#operation_id,
       t.operation_id,
       t.copied_from#operation_id,
       o.schedule_specifier, 
       o.is_template,        
       o.operation_type_id,  
       o.status_type_id,     
       o.created,            
       case when t.is_template    = 'Y'   then 1 
            when t.status_type_id = 90    then 1 
            when (t.is_template   = 'N'
                   and t.schedule_specifier in ('O','P')) 
                                          then 2 
            when t.operation_type_id = 40 then 2 
            when t.status_type_id = 94    then 2 
         end as flag_tamplate_auto_payment
    from operation o
         left join (select ot.operation_id
                           ,ot.operation_type_id
                           ,ot.is_template
                           ,ot.schedule_specifier
                           ,ot.status_type_id
                           ,ot.copied_from#operation_id
                           from operation ot
                           where ot.is_template = 'Y'    
                   ) t on o.copied_from#operation_id=t.operation_id
    where o.copied_from#operation_id is not null


План выполнения запроса прикреплён в картинке
По полю copied_from#operation_id уже есть индекс,
но всё равно показывает TABLE ACCESS FULL
Почему так? В чем может быть тут причина?
...
Рейтинг: 0 / 0
07.07.2017, 09:24
    #39484228
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

Статистику давно собирали?
...
Рейтинг: 0 / 0
07.07.2017, 09:36
    #39484237
left join (...)
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Ну, а тут where ot.is_template = 'Y' индекс есть?
...
Рейтинг: 0 / 0
07.07.2017, 09:40
    #39484241
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
left join (...)Ну, а тут where ot.is_template = 'Y' индекс есть?
Да, проглядел, признаю,
вот результаты после добавления нового индекса
Возможно ли их ещё как-то улучшить?
...
Рейтинг: 0 / 0
07.07.2017, 10:02
    #39484261
left join (...)
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Для полного счастья должно быть, как минимум, 3 индекса по полям:
copied_from#operation_id
operation_id
is_template
...
Рейтинг: 0 / 0
07.07.2017, 10:06
    #39484263
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
left join (...)Для полного счастья должно быть, как минимум, 3 индекса по полям:

А для счастья абсолютного - по индексу на каждое поле таблицы в отдельности и на каждое сочетание.
Да?
...
Рейтинг: 0 / 0
07.07.2017, 10:41
    #39484296
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
andrey_anonymousleft join (...)Для полного счастья должно быть, как минимум, 3 индекса по полям:

А для счастья абсолютного - по индексу на каждое поле таблицы в отдельности и на каждое сочетание.
Да?
Не ну это же не справочник ))))
...
Рейтинг: 0 / 0
07.07.2017, 10:42
    #39484298
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
left join (...)Для полного счастья должно быть, как минимум, 3 индекса по полям:
copied_from#operation_id
operation_id
is_template

Первый TABLE ACCESS FULL меня смущает, можно ли как-то от него избавиться? ))
...
Рейтинг: 0 / 0
07.07.2017, 10:51
    #39484306
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

покажи план через explain plan c filter/access predicates
...
Рейтинг: 0 / 0
07.07.2017, 10:53
    #39484311
Pavel_PV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015 прежде чем избавляться от фулл скана подумай сколько это будет стоить? Одноблочное и многоблочное чтение не зря придумано. Это не считая расходов на вставку при наличии индексов.
По твоему вопросу какой % в operation данных у которых o.copied_from#operation_id is not null? Отсюда и ответ будет.
...
Рейтинг: 0 / 0
07.07.2017, 11:06
    #39484333
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Pavel_PVRMagistr2015 прежде чем избавляться от фулл скана подумай сколько это будет стоить? Одноблочное и многоблочное чтение не зря придумано. Это не считая расходов на вставку при наличии индексов.
По твоему вопросу какой % в operation данных у которых o.copied_from#operation_id is not null? Отсюда и ответ будет.
25%
...
Рейтинг: 0 / 0
07.07.2017, 11:09
    #39484336
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015Pavel_PVRMagistr2015 прежде чем избавляться от фулл скана подумай сколько это будет стоить? Одноблочное и многоблочное чтение не зря придумано. Это не считая расходов на вставку при наличии индексов.
По твоему вопросу какой % в operation данных у которых o.copied_from#operation_id is not null? Отсюда и ответ будет.
25%
25>7 => FTS
...
Рейтинг: 0 / 0
07.07.2017, 14:36
    #39484577
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

Странно или я чтот не понял или если данные есть в t таблице а у нее is_template = 'Y' то
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
case when t.is_template    = 'Y'   then 1 
            when t.status_type_id = 90    then 1 
            when (t.is_template   = 'N'
                   and t.schedule_specifier in ('O','P')) 
                                          then 2 
            when t.operation_type_id = 40 then 2 
            when t.status_type_id = 94    then 2 
         end as flag_tamplate_auto_payment


будет срабатывать всегда верхний и на выходе будет 1 и как следствие его вообще можно убрать написав простенький decode на 1 поле, т.е. нашел данные или нет.

t.copied_from#operation_id - а не просветите по поводу знака '#' а то както раньше не всречал
...
Рейтинг: 0 / 0
07.07.2017, 15:33
    #39484657
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

Ок, кажется понял, copied_from#operation_id - просто спицефическое имя поля.


А не подскажите еще может ли быть к одному значению o.copied_from#operation_id несколько записей с таким t.operation_id в таблице
from operation ot where ot.is_template = 'Y') t или это связь всегда 1 к 1 и может ли быть 1 к 0?
...
Рейтинг: 0 / 0
10.07.2017, 07:36
    #39485447
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
MaximaXXLRMagistr2015,

Ок, кажется понял, copied_from#operation_id - просто спицефическое имя поля.


А не подскажите еще может ли быть к одному значению o.copied_from#operation_id несколько записей с таким t.operation_id в таблице
from operation ot where ot.is_template = 'Y') t или это связь всегда 1 к 1 и может ли быть 1 к 0?
Тут таблица соединяется сама с собой, для отоброжения дочерних связей, для одного operation_id может бфть много copied_from#operation_id, и условия разные, может быть как is_tempalte = 'Y' так и is_template = 'N' and t.schedule_specifier in ('O','P')
Блин, тело подзапроса привел неправильно, вот его нормальный вид:
Код: 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.
select o.operation_id,
       o.copied_from#operation_id,
       t.operation_id,
       t.copied_from#operation_id,
       o.schedule_specifier, 
       o.is_template,        
       o.operation_type_id,  
       o.status_type_id,     
       o.created,            
       case when t.is_template    = 'Y'   then 1 
            when t.status_type_id = 90    then 1 
            when (t.is_template   = 'N'
                   and t.schedule_specifier in ('O','P')) 
                                          then 2 
            when t.operation_type_id = 40 then 2 
            when t.status_type_id = 94    then 2 
         end as flag_tamplate_auto_payment
    from operation o
         left join (select ot.operation_id
                           ,ot.operation_type_id
                           ,ot.is_template
                           ,ot.schedule_specifier
                           ,ot.status_type_id
                           ,ot.copied_from#operation_id
                           from operation ot
                           where ot.is_template = 'Y'    
                           and (ot.is_template   = 'N'
                                    and ot.schedule_specifier in ('O','P'))
                           and ot.operation_type_id in (40,94)
                   ) t on o.copied_from#operation_id=t.operation_id
...
Рейтинг: 0 / 0
10.07.2017, 10:15
    #39485522
Оптимизация запроса
RMagistr2015
Код: plsql
1.
2.
3.
                           where ot.is_template = 'Y'    
                           and (ot.is_template   = 'N'
                                    and ot.schedule_specifier in ('O','P'))


И что, работает?

...зачем вообще это самосоединение надо? Аналитикой/иерархическим запросом/pattern matching не решается?
...
Рейтинг: 0 / 0
10.07.2017, 12:03
    #39485643
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Пузырь-волшебникRMagistr2015
Код: plsql
1.
2.
3.
                           where ot.is_template = 'Y'    
                           and (ot.is_template   = 'N'
                                    and ot.schedule_specifier in ('O','P'))


И что, работает?

...зачем вообще это самосоединение надо? Аналитикой/иерархическим запросом/pattern matching не решается?
Например?
...
Рейтинг: 0 / 0
10.07.2017, 12:34
    #39485671
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,
Пример

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with operation as (select 'Y' is_template, 'O' schedule_specifier from dual union all
select 'N' is_template, 'O' schedule_specifier from dual)

select ot.*
from operation ot
where ot.is_template = 'Y'    
and (ot.is_template   = 'N' and ot.schedule_specifier in ('O','P'))



no data found

Никак не работает
...
Рейтинг: 0 / 0
10.07.2017, 12:38
    #39485675
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
MaximaXXLRMagistr2015,
Пример

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with operation as (select 'Y' is_template, 'O' schedule_specifier from dual union all
select 'N' is_template, 'O' schedule_specifier from dual)

select ot.*
from operation ot
where ot.is_template = 'Y'    
and (ot.is_template   = 'N' and ot.schedule_specifier in ('O','P'))



no data found

Никак не работает
Простите, не совсем ясно что вы хотите сказать )
...
Рейтинг: 0 / 0
10.07.2017, 12:45
    #39485680
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with operation as (select 'Y' is_template, 'O' schedule_specifier from dual union all
select 'N' is_template, 'O' schedule_specifier from dual)

select ot.*
from operation ot
where ot.is_template = 'Y'    
and (ot.is_template   = 'N' and ot.schedule_specifier in ('O','P'))



не может поле is_template быть в 2-х состояниях одновременно для одной строки.
А это значит там стоит или "or" или этот селект ничего не вернет в 100% случаев
...
Рейтинг: 0 / 0
10.07.2017, 12:48
    #39485682
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
MaximaXXLRMagistr2015,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with operation as (select 'Y' is_template, 'O' schedule_specifier from dual union all
select 'N' is_template, 'O' schedule_specifier from dual)

select ot.*
from operation ot
where ot.is_template = 'Y'    
and (ot.is_template   = 'N' and ot.schedule_specifier in ('O','P'))



не может поле is_template быть в 2-х состояниях одновременно для одной строки.
А это значит там стоит или "or" или этот селект ничего не вернет в 100% случаев
Да, вы правы, там стоит OR, пойду попью кофе (((
...
Рейтинг: 0 / 0
10.07.2017, 13:01
    #39485694
Запузырим
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015там стоит OR, пойду попью кофе (((
Кофе - это хорошо.
Но еще лучше показать, как именно "там стоит OR".
...
Рейтинг: 0 / 0
10.07.2017, 13:05
    #39485702
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
ЗапузыримRMagistr2015там стоит OR, пойду попью кофе (((
Кофе - это хорошо.
Но еще лучше показать, как именно "там стоит OR".
Код: 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.
select o.operation_id,
       o.copied_from#operation_id,
       t.operation_id,
       t.copied_from#operation_id,
       o.schedule_specifier, 
       o.is_template,        
       o.operation_type_id,  
       o.status_type_id,     
       o.created,            
       case when t.is_template    = 'Y'   then 1 
            when t.status_type_id = 90    then 1 
            when (t.is_template   = 'N'
                   and t.schedule_specifier in ('O','P')) 
                                          then 2 
            when t.operation_type_id = 40 then 2 
            when t.status_type_id = 94    then 2 
         end as flag_tamplate_auto_payment
    from operation o
         left join (select ot.operation_id
                           ,ot.operation_type_id
                           ,ot.is_template
                           ,ot.schedule_specifier
                           ,ot.status_type_id
                           ,ot.copied_from#operation_id
                           from operation ot
                           where ot.is_template = 'Y'    
                           OR (ot.is_template   = 'N'
                                    and ot.schedule_specifier in ('O','P'))
                           OR ot.operation_type_id in (40,94)
                   ) t on o.copied_from#operation_id=t.operation_id
...
Рейтинг: 0 / 0
10.07.2017, 13:16
    #39485716
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Странная ошибка появилась при выполнении этого запроса. Он находится у меня в пакете в процедуре, и при вызове этой процедуры, происходит ошибка, типо нет такого пакета, хотя этого пакета среди невалидных нет. А при перекомпиляции этого пакета выходит следующее сообщение (приведено в скриншоте):
...
Рейтинг: 0 / 0
10.07.2017, 13:26
    #39485728
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
RMagistr2015,

а это условие недокопироно?
Код: plsql
1.
    where o.copied_from#operation_id is not null


или его нет/не было вообще?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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