powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / order by inside view
4 сообщений из 4, страница 1 из 1
order by inside view
    #39541567
Kido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Вопрос насколько рукожопно опасно использовать сортировку внутри представления?
Код: 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
order by inside view
    #39541600
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
у оракла есть механизм 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
order by inside view
    #39541657
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kido,

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

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

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


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