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

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

Заранее благодарен.
...
Рейтинг: 0 / 0
27.12.2002, 19:37
    #32085389
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
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
27.12.2002, 19:50
    #32085393
[i] AndRew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
> Order by ???
Не-а. Зачем тогда я по-вашему табличку сортировал?
Чтобы потом из неё записи по порядку и вылеали!
А операция Order by в этом случае не применима - слишком долго.
...
Рейтинг: 0 / 0
27.12.2002, 19:59
    #32085396
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
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
27.12.2002, 20:01
    #32085397
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
union all v etom sluchae nado primeniat.
...
Рейтинг: 0 / 0
28.12.2002, 01:58
    #32085421
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
>Объясните мне пожалуйста, может я как-то не так JOINю? Вообще, какие
>могут быть варианты? Слева, справа, Inner, т.д. - в чём разница?

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

(2) AndRew : кстати - что значит "отсортированная таблица" ?
...
Рейтинг: 0 / 0
31.12.2002, 21:26
    #32085921
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
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
09.01.2003, 11:19
    #32087964
[i] AndRew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
2 Silver: кстати - что значит "отсортированная таблица" ?

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

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

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

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

записи пораспихает сказать заранее нельзя. Может все подряд положит, а может и нет.
...
Рейтинг: 0 / 0
09.01.2003, 18:51
    #32088475
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
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
09.01.2003, 19:40
    #32088499
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
Гена,

в пункте 1.2 к списку freelist обращаются серверные (shadow) процессы. DBWR ничего не знает о freelists.
...
Рейтинг: 0 / 0
09.01.2003, 20:16
    #32088516
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок записей после Join'а
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок записей после Join'а / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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