Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / order by inside view / 4 сообщений из 4, страница 1 из 1
25.10.2017, 11:49
    #39541567
Kido
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by inside view
Всем привет!
Вопрос насколько рукожопно опасно использовать сортировку внутри представления?
Код: 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.
-- исходные данные
with t as (
  select '1-805I7KV' agr_id, '1-7W28OLR' phone_id, 1 thread_number, 'L1' logic_type, 8 weight  from dual union all
  select '1-805I7KV' agr_id, '1-7W24FP6' phone_id, 1 thread_number, 'L1' logic_type, 5 weight  from dual union all
  select '1-805I7KV' agr_id, '1-7W291V1' phone_id, 1 thread_number, 'L1' logic_type, 7 weight  from dual union all
  select '1-805I7KV' agr_id, '1-805AC9N' phone_id, 1 thread_number, 'L1' logic_type, 3 weight  from dual union all
  select '1-9A8H8V1' agr_id, '1-7W24F76' phone_id, 1 thread_number, 'L1' logic_type, 5 weight  from dual union all
  select '1-9A8H8V1' agr_id, '1-7W28O5R' phone_id, 1 thread_number, 'L1' logic_type, 8 weight  from dual union all
  select '1-9A8H8V1' agr_id, '1-7WSF1V1' phone_id, 1 thread_number, 'L1' logic_type, 7 weight  from dual union all
  select '1-9A8H8V1' agr_id, '1-805ACZN' phone_id, 1 thread_number, 'L1' logic_type, 3 weight  from dual union all
  select '1-805I123' agr_id, '1-7W291V1' phone_id, 1 thread_number, 'L2' logic_type, 7 weight  from dual union all
  select '1-805I456' agr_id, '1-805AC9N' phone_id, 1 thread_number, 'L2' logic_type, 3 weight  from dual union all
  select '1-9A8H654' agr_id, '1-7W24F76' phone_id, 1 thread_number, 'L2' logic_type, 5 weight  from dual union all
  select '1-9A82351' agr_id, '1-7W28O5R' phone_id, 1 thread_number, 'L2' logic_type, 8 weight  from dual union all
  select '1-258H8V1' agr_id, '1-7WSF1V1' phone_id, 1 thread_number, 'L2' logic_type, 7 weight  from dual union all
  select '1-658H8V1' agr_id, '1-805ACZN' phone_id, 1 thread_number, 'L2' logic_type, 3 weight  from dual 
),
 
-- так будет выглядеть view 
-- create view view_name as 
  L1 as (
    select agr_id, phone_id, thread_number, logic_type, weight 
    from t 
    where logic_type = 'L1'
    ORDER BY max(t.weight) over(partition by t.agr_id) desc, T.agr_id 
  ), 
  L2 as (
    select agr_id, phone_id, thread_number, logic_type, weight 
    from t 
    where logic_type = 'L2'
    /* тут могут быть дополнительные join-ы, которые применимы только для logic_type = 'L2'*/
    order by weight
  ) 
  select * from L1 
  union all
  select * from L2



Вычитвыться она будет следующим образом
Код: plsql
1.
select * from view_name where thread_number = :thread_number 



Из поиска: тут говорят, что не рекомендуют, потому как запрос, котороый будет получать данные из view может иметь собственный order by. Но мой не будет :)

тут отвечающий говорит, что оптимизитор может подумать, что эта сортировка не нужна авторIf it knows your query doesn't have an ORDER BY clause, it's free to ignore row order in order (cough) to return rows more quickly.
и проигнорировать её

Главный вопрос - что может произойти такого, что возвращаемый набор данных будет не в том порядке в котором оказано во view?

Знаю что полагаться на порядок строк из таблицы нельзя без явной сортировки, но про представления не слышал.
Спасибо
...
Рейтинг: 0 / 0
25.10.2017, 12:29
    #39541600
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by inside view
у оракла есть механизм order-by-elimination, поэтому он может спокойно выкидать сортировку из inline view.

Смотри этот параметр и хинты:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> @param_ %order%elim%

NAME                                     VALUE        DEFLT        TYPE         DESCRIPTION
---------------------------------------- ------------ ------------ ------------ ------------------------------------------------------------
_optimizer_order_by_elimination_enabled  TRUE         TRUE         boolean      Eliminates order bys from views before query transformation

SQL> @hint elim%oby

NAME                           SQL_FEATURE                         CLASS                          VERSION              INVERSE
------------------------------ ----------------------------------- ------------------------------ -------------------- ------------------------------
ELIMINATE_OBY                  QKSFM_OBYE                          ELIMINATE_OBY                  10.2.0.1             NO_ELIMINATE_OBY
NO_ELIMINATE_OBY               QKSFM_OBYE                          ELIMINATE_OBY                  10.2.0.1             ELIMINATE_OBY
...
Рейтинг: 0 / 0
25.10.2017, 13:04
    #39541657
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by inside view
Kido,

я сортировку в подзапросах(вью) использовал только для топ-н
там опртимизатор обязан ее выполнить
как тут не уверен,
по идее можно заставить не игнорировать ордер бай указав rownum<xxx

главный минус для л1
не протолкнется thread_number = :thread_number во внутрь вью

....
stax
...
Рейтинг: 0 / 0
25.10.2017, 14:11
    #39541755
Kido
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by inside view
xtender, Stax, большое спасибо!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / order by inside view / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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