powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок записей после Join'а
15 сообщений из 15, страница 1 из 1
Порядок записей после Join'а
    #32085386
Фотография [i] AndRew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый народ!!!
Прошу вашего участия в решении проблемы:
Есть табличка1 , отсортированная по полю1 . Если я делаю SELECT FROM табличка1 JOIN табличка2 то в результате получаются данные, уже не отсортированные по полю1 , что очень печально.

Объясните мне пожалуйста, может я как-то не так JOINю? Вообще, какие могут быть варианты? Слева, справа, Inner, т.д. - в чём разница?

Заранее благодарен.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085389
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Order by ... stavitsia v konce vseh Union.
Mogno ssilatsia po # polia. Primer:

Код: plaintext
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.
SQL> select table_name, 'TABLE' tp from user_tables where rownum< 5 
union
select index_name, 'INDEX' id from user_indexes where rownum< 5 
order by  1  desc;

TABLE_NAME		       TP
 ------------------------------ -----
 
C_APP_PK		       INDEX
C3_OBJECT_UN		       INDEX
C1_OBJECT_UN		       INDEX
C1_OBJECT_PK		       INDEX
BIN_TREE		       TABLE
A_TREE			       TABLE
A_M_TREE		       TABLE
ABC			       TABLE

 8  rows selected.

SQL> select table_name, 'TABLE' tp from user_tables where rownum< 5 
union
select index_name, 'INDEX' id from user_indexes where rownum< 5 
order by  1 ;

TABLE_NAME		       TP
 ------------------------------ -----
 
ABC			       TABLE
A_M_TREE		       TABLE
A_TREE			       TABLE
BIN_TREE		       TABLE
C1_OBJECT_PK		       INDEX
C1_OBJECT_UN		       INDEX
C3_OBJECT_UN		       INDEX
C_APP_PK		       INDEX

 8  rows selected.

...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085393
Фотография [i] AndRew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Order by ???
Не-а. Зачем тогда я по-вашему табличку сортировал?
Чтобы потом из неё записи по порядку и вылеали!
А операция Order by в этом случае не применима - слишком долго.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085396
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poluchi recept, esly nuzno ostabit staruyu sortirovku.

Код: plaintext
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.
SQL> select * from (
select table_name, 'TABLE' tp from user_tables
order by table_name desc)
where rownum< 5 
union
select * from (
select index_name, 'INDEX' id from user_indexes
order by index_name asc)
where rownum< 5 
;

TABLE_NAME		       TP
 ------------------------------ -----
 
C1_OBJECT_PK		       INDEX
C1_OBJECT_UN		       INDEX
C3_OBJECT_UN		       INDEX
C_APP_PK		       INDEX
XR_ROLE_DEP		       TABLE
XR_ROLE_JOB		       TABLE
XR_ROLE_PERM		       TABLE
XR_ROLE_PRJ		       TABLE

 8  rows selected.

SQL> select * from (
select table_name, 'TABLE' tp from user_tables
order by table_name desc)
where rownum< 5 
union all
select * from (
select index_name, 'INDEX' id from user_indexes
order by index_name asc)
where rownum< 5 
;

TABLE_NAME		       TP
 ------------------------------ -----
 
XR_ROLE_PRJ		       TABLE
XR_ROLE_PERM		       TABLE
XR_ROLE_JOB		       TABLE
XR_ROLE_DEP		       TABLE
C1_OBJECT_PK		       INDEX
C1_OBJECT_UN		       INDEX
C3_OBJECT_UN		       INDEX
C_APP_PK		       INDEX

 8  rows selected.


...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085397
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
union all v etom sluchae nado primeniat.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085421
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Объясните мне пожалуйста, может я как-то не так JOINю? Вообще, какие
>могут быть варианты? Слева, справа, Inner, т.д. - в чём разница?

это вообще какой-то странный подход к составлению sql запросов. Покажите мне, пожалуйста хоть один источник, где написано, что операция join должна сохранять сортировку в выходных данных.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085737
Фотография [i] AndRew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а про варианты Join-a так никто и не объяснил...
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085843
fraer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используй hint в select
select /*+INDEX имя*/ ...
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085916
Silver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(2) fraer: а вот и не факт что в таблице используется индекс :)

(2) AndRew : кстати - что значит "отсортированная таблица" ?
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32085921
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egeli posmotret na LUBOI select, v kotorom ucpolzuetsiy UNION to vidno chto
poslednim shagom EXECUTION PLAN vsegda budet shag sortirovki-sliyaniya (SORT-MERGE).
Poetomu primeniyaem mi index v hint ili ne primeniaem eto nikogo, i osobenno Oracle ne interesuet.

Dlya sohraneniya poriadka zapicey KAK EST nugno primeniat UNION ALL a ne union.
V etom sluchae Oracle otmeniaet shag sortirovki-sliyaniya. No nugno apriory smiritsia s
vozmognostiu poyavleniya dubliruusch stok v rezultate zaprosa.
Eto pokazano escho raz na primere nige:

Код: plaintext
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.
SQL> create table chk_union as
select object_id, object_name, object_type
from all_objects
where rownum <  6 ;

Table created.

SQL> select * from
(select * from chk_union order by object_id)
union
select * from
(select * from chk_union order by object_name);

 OBJECT_ID OBJECT_NAME			  OBJECT_TYPE
 ---------- ------------------------------ ------------------
 
	 89  ACCESS$			  TABLE
       1162  ALL_CATALOG			  VIEW
       1244  ALL_ARGUMENTS		  VIEW
       1283  ALL_ALL_TABLES		  VIEW
       1506  ALL_ASSOCIATIONS		  VIEW

SQL> select * from
(select * from chk_union order by object_id)
union all
select * from
(select * from chk_union order by object_name);

 OBJECT_ID OBJECT_NAME			  OBJECT_TYPE
 ---------- ------------------------------ ------------------
 
	 89  ACCESS$			  TABLE
       1162  ALL_CATALOG			  VIEW
       1244  ALL_ARGUMENTS		  VIEW
       1283  ALL_ALL_TABLES		  VIEW
       1506  ALL_ASSOCIATIONS		  VIEW
	 89  ACCESS$			  TABLE
       1283  ALL_ALL_TABLES		  VIEW
       1244  ALL_ARGUMENTS		  VIEW
       1506  ALL_ASSOCIATIONS		  VIEW
       1162  ALL_CATALOG			  VIEW

 10  rows selected.

...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32087964
Фотография [i] AndRew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Silver: кстати - что значит "отсортированная таблица" ?

Я всегда думал, что если заполнить таблицу вот так:
Код: plaintext
insert into table1 (поля, поля...) select (поля, поля...) from table2 order by ПОЛЕ1 desc

То потом, когда я буду из этой таблицы простым datasetом (select * from table1) данные тянуть, то они полезут строго order by ПОЛЕ1 desc.

Разве не так? Разве ораклу пополам, как заполнялась таблица, и данные он будет отгружать как захочет?
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32088455
олег1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В реляционных БД данные хранятся неупорядоченно по определению.
Если Ораклу не указывать явно как сортировать селект, он вроде бы по ROWID сортирует - адрес блока + адрес строки в нём. А по каким блокам

insert into table1 (поля, поля...) select (поля, поля...) from table2 order by ПОЛЕ1 desc

записи пораспихает сказать заранее нельзя. Может все подряд положит, а может и нет.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32088475
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) Oleg1

Этот Insert в общем случае не гарантирует упроядоченности записей в таблице.
1 Вариант - таблица 1 уже cодержит записи
1.1 - для таблицы установлен freelists = 1, HWM показывает на последний заполненный блок и
во freelist нет промежуточных блоков в середине табличного(ных) экстента
-- наиболее вероятно что записи будут упорядоченны

1.2. - для таблицы установлен freelists > 1 - потенциально порядок записей
(а точнее порядок прохождения отдельных freelists) произвольный, как решит DBRW
в каком порядке он будет проходить "грязные блоки" в db cache

2. Таблица не содержит записей - зависит от freelists (>1 или =1) соответственно
потенциально неупорядоченно или упорядоченно.

Кроме того нужно всегда иметь ввиду дополнительные параметры системы:
-- количество процессоров (и CPU_COUNT в init.ora)
-- количество процессов DBRW
-- наличие и "работоспособность" ASYNC_IO для OS
...

Так что ответ об упорядонности записей в общем случае неопределенный.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32088499
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гена,

в пункте 1.2 к списку freelist обращаются серверные (shadow) процессы. DBWR ничего не знает о freelists.
...
Рейтинг: 0 / 0
Порядок записей после Join'а
    #32088516
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 killed

Soversehho soglasen.
No ya imel vvidu kak raz to chto bloki (pri freelists>1) prakticheski garantirovanno popadut v raznie uchastli db cache
(pri nalichii bolee chem 1 aktivnoy sessii)
i kogda dbrw budet pisat 'dirty blocks' obratno to on budet perocodit
v sootvetstbii so svoim predstavleinem o posledovatelnosti zapici.
t.e -- on skaniruet LRU (ili neskolko LRU) kak ustanovlenno, posledowatelno v sootvetctvii s
poriadkom blockv ne v db cache a v sootvetstvii s poriadkom ukazateley v LRU
i peremeschaet ih v LRUW, a DBRW(s) prosto ih posledovatelno pishet iz LRUW(s) v faili dannih
(pravda opiat ge posle markirowki etih blockov LGRW)

iskluchene sostavliaut tolko zapis v TRANSACTION SPECIFIC global temporary tables.
poskolku NOLOGGING otmenaet zapis v log no ne v fail dannih, a session specific GTT imeut
vnutrennuu strukturu ochen pohoguu na obichie tablici.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок записей после Join'а
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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