Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Row_ID базовой таблицы в View / 25 сообщений из 27, страница 1 из 2
08.02.2022, 19:46
    #40132649
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Доброго дня господа !

Имею простой запрос
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace view V1 as 
 select A.*
   from T1 A
     left join T2 B
       on (    B.F1=A.F1
           )  



Как в таком представлении увидеть И ИСПОЛЬЗОВАТЬ !!!! в последующих предикатах RowId таблицы T1

Использовать это
select С.*,C.Rowid from V1 C where C.RowId='AAAmmm+TTTdd'

И чтобы план запроса давал именно ссылку на Rowid таблицы ( это НЕ ПОЛЕ образованное из RowID !!!! )

Спасибо .
...
Рейтинг: 0 / 0
08.02.2022, 20:09
    #40132656
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Какую задачу вы хотите решить в конечном итоге?
Сформулируйте, пожалуйста.
...
Рейтинг: 0 / 0
08.02.2022, 20:29
    #40132662
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
SQL*Plus,

У меня есть набор пользовательских представлений (доступ к базовым таблицам запрещен)
Объем каждого 20 млн-400 млн. записей.
Хочу создать набор таблиц с RowID необходимых записей этих представлений.
Это сократит объем до 10 тыс - 200 тыс по каждой (на манер доменного индекса)
И работать через такие указатели - доп. объем на диске увеличиться незначительно

Спасибо
...
Рейтинг: 0 / 0
08.02.2022, 23:15
    #40132699
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X,

Ну, ты же в курсе, что rowid иногда меняется?
...
Рейтинг: 0 / 0
08.02.2022, 23:37
    #40132707
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
oragraf
HOME_X,

Ну, ты же в курсе, что rowid иногда меняется?


Спасибо за вопрос - задумаюсь !!!!!

Сейчас бы хотелось проясни можно ли получить RowId в сложных представлениях

Если представление ложиться на одну таблицу - RowId получаем автоматически ...
А если в условиях со связью можете сказать как реализовать ?
...
Рейтинг: 0 / 0
09.02.2022, 00:48
    #40132719
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X

Сейчас бы хотелось проясни можно ли получить RowId в сложных представлениях

Если представление ложиться на одну таблицу - RowId получаем автоматически ...
А если в условиях со связью можете сказать как реализовать ?

Так в чём проблема?
Можно получить столько rowid, сколько сджойнено таблиц. Просто для каждой нужно указать свой алиас таблицы и свой алиас этого псевдополя.

Правда, если джойн OUTER, то не понятен смысл действа, ведь будут пустышки.
...
Рейтинг: 0 / 0
09.02.2022, 09:14
    #40132747
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Правильный Вася

Можно получить столько rowid, сколько сджойнено таблиц.
Просто для каждой нужно указать свой алиас таблицы и свой алиас этого псевдополя.


HOME_X

И чтобы план запроса давал именно ссылку на Rowid таблицы ( это НЕ ПОЛЕ образованное из RowID !!!! )


Здесь важна не визуализация - а возможность быстрого доступа !
Получиться ?
...
Рейтинг: 0 / 0
09.02.2022, 11:27
    #40132764
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X
Правильный Вася

Можно получить столько rowid, сколько сджойнено таблиц.
Просто для каждой нужно указать свой алиас таблицы и свой алиас этого псевдополя.


HOME_X

И чтобы план запроса давал именно ссылку на Rowid таблицы ( это НЕ ПОЛЕ образованное из RowID !!!! )


Здесь важна не визуализация - а возможность быстрого доступа !
Получиться ?

Попробуйте.

Вот смастерил пример из "подручных материалов". :-)

Автономная база данных Always Free 21c в облаке (workload type = Data Warehouse).
Хинт NO_RESULT_CACHE добавлен, чтобы отключить использование Result Cache
(по умолчанию установлено RESULT_CACHE_MODE = FORCE)

Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
SQL> SET ECHO ON;

SQL> SELECT banner_full FROM v$version;

BANNER_FULL                                                                                                                       
----------------------------------------------------------------------------------------------------------------------------------
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.2.0.0.0

SQL> SELECT rowid, A.* FROM dept A;

ROWID                  DEPTNO DNAME          LOC          
------------------ ---------- -------------- -------------
AAATpCAAAAAAASmAAA         10 ACCOUNTING     NEW YORK     
AAATpCAAAAAAASmAAB         20 RESEARCH       DALLAS       
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAD         40 OPERATIONS     BOSTON       

SQL> create or replace view killme_V1 as 
  2   select A.rowid AS A_rowid, A.*
  3     from dept A
  4       left join emp B
  5         on (A.deptno = B.deptno);
View KILLME_V1 created.

SQL> SELECT /*+ NO_RESULT_CACHE */ * FROM killme_V1
  2  WHERE a_rowid = 'AAATpCAAAAAAASmAAC';

A_ROWID                DEPTNO DNAME          LOC          
------------------ ---------- -------------- -------------
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
AAATpCAAAAAAASmAAC         30 SALES          CHICAGO      
6 rows selected. 

SQL> EXPLAIN PLAN FOR
  2  SELECT /*+ NO_RESULT_CACHE */ * FROM killme_V1
  3  WHERE a_rowid = 'AAATpCAAAAAAASmAAC';
Explained.

SQL> SET LINESIZE 130
SQL> SET PAGESIZE 1000
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT                                                                                                                 
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 887371018
 
------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     4 |    92 |     1   (0)| 00:00:01 |
|   1 |  NESTED LOOPS OUTER         |            |     4 |    92 |     1   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY USER ROWID| DEPT       |     1 |    20 |     1   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN          | EMP#R#DEPT |     4 |    12 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("A"."DEPTNO"="B"."DEPTNO"(+))
 
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of no expensive parallel operation

19 rows selected. 
...
Рейтинг: 0 / 0
09.02.2022, 21:03
    #40132946
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
oragraf
HOME_X,

Ну, ты же в курсе, что rowid иногда меняется?

Имеется ввиду при удалении/инсерте записи вновь? Или, что будет для меня откровением, rowid записи может поменяться и без никаких dml над записью?
...
Рейтинг: 0 / 0
10.02.2022, 00:10
    #40132974
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Master_Detail
oragraf
HOME_X,
Ну, ты же в курсе, что rowid иногда меняется?

Или, что будет для меня откровением, rowid записи может поменяться и без никаких dml над записью?

ROWID - это всего лишь адрес записи во внутренних структурах хранения Оракла. Поскольку они внутренние, то Оракл вправе их менять как ему нравится.
Например, при MOVE таблицы или при SHRINK секции.
В некоторых случаях имеет значение, как установлен признак ROW MOVEMENT у таблицы.
...
Рейтинг: 0 / 0
10.02.2022, 00:49
    #40132979
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Правильный Вася
Master_Detail
пропущено...

Или, что будет для меня откровением, rowid записи может поменяться и без никаких dml над записью?

ROWID - это всего лишь адрес записи во внутренних структурах хранения Оракла. Поскольку они внутренние, то Оракл вправе их менять как ему нравится.
Например, при MOVE таблицы или при SHRINK секции.
В некоторых случаях имеет значение, как установлен признак ROW MOVEMENT у таблицы.

Oracle самостоятельно ("по своему хотению") не перемещает строки в таблицах.

Поэтому, ROWID строки не изменится, если вы не предпринимаете никаких действий,
вызывающих перемещение строк таблицы (MOVE, SHRINK и др.).

Однако, не стоит полагаться на то, что ROWID строки никогда не изменится.
Но уместно использовать в командах DML уникальность ROWID для каждой строки таблицы.
ROWID Data Type
The rows in heap-organized tables that are native to Oracle Database have row addresses
called rowids. You can examine a rowid row address by querying the pseudocolumn ROWID.

Values of this pseudocolumn are strings representing the address of each row. These strings
have the data type ROWID. You can also create tables and clusters that contain actual
columns having the ROWID data type. Oracle Database does not guarantee that the values of
such columns are valid rowids. Refer to Pseudocolumns for more information on the ROWID
pseudocolumn.

Rowids contain the following information:

• The data block of the data file containing the row. The length of this string depends on
your operating system.

• The row in the data block.

• The database file containing the row. The first data file has the number 1. The length of
this string depends on your operating system.

• The data object number , which is an identification number assigned to every database
segment. You can retrieve the data object number from the data dictionary views
USER_OBJECTS, DBA_OBJECTS, and ALL_OBJECTS. Objects that share the same segment
(clustered tables in the same cluster, for example) have the same object number.

Rowids are stored as base 64 values that can contain the characters A-Z, a-z, 0-9, and the
plus sign (+) and forward slash (/). Rowids are not available directly. You can use the supplied
package DBMS_ROWID to interpret rowid contents. The package functions extract and provide
information on the four rowid elements listed above.
...
Рейтинг: 0 / 0
10.02.2022, 01:20
    #40132981
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
SQL*Plus
Oracle самостоятельно ("по своему хотению") не перемещает строки в таблицах.

Разве я где-то сказал, что он это делает?

1. Я написал "как ему нравится", а не "когда ему нравится". Т.е. алгоритм перемещения записей с изменением адреса - это внутреннее дело.
2. Я написал "вправе" с указанием примеров, а не "делает всегда". Т.е. даже в этих случаях он может переместить только некоторые записи, изменив им адреса, а остальные оставить на прежних местах.

P.S.
Но зарекаться не стоит. Раз этот механизм внутренний, ничто не мешает разработчикам встроить в код "утрамбовку" данных без уведомления, упомянув разве только, что в периоды простоя возможны операции по оптимизации структур хранения.
...
Рейтинг: 0 / 0
11.02.2022, 01:20
    #40133355
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
row_movement_clauseThe row_movement_clause lets you specify whether the database can move a table row. It is
possible for a row to move, for example, during table compression or an update operation on
partitioned data.

• Specify ENABLE to allow the database to move a row, thus changing the rowid.
• Specify DISABLE if you want to prevent the database from moving a row, thus preventing a change of rowid.

If you omit this clause, then the database disables row movement.
...
Рейтинг: 0 / 0
16.02.2022, 00:22
    #40134410
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
SQL*Plus,

Извините господа, малость выпал из диалога
Спасибо Ваш код будет реализован
Насчет изменений RowId - принято к доп. исследованию

У меня возникла некоторая непонятка
Вот Ваш код
Вы вывели RowId основной таблицы как поле, можно на него ссылаться в дальнейшем
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace view killme_V1 as 
  select A.rowid AS A_rowid,  
            A.*
    from dept A
     left join emp B
     on (A.deptno = B.deptno);


Все предельно ЯСНО !!
Поле A_rowid = 'ddddfff+kk'

Но в меня в продуктивных представлениях (имею в виду эти объекты давно и надежно работают)
есть абсолютна аналогичная архитектура - т.е. две большие таблицы со связью типа LEFT

RowID в качестве поля View - не представлено !? (Точно проверял много раз)
Но при вызове представление можно писать непосредственно RowID (не ПОЛЕ A_rowid !!!!)
И это ТОЖЕ работает - почему и как не могу понять

Т.е. писано так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace view killme_V1 as 
  select  A.*,
            B.F1
    from dept A
     left join emp B
     on (A.deptno = B.deptno);

select  T.*,
           t.Rowid 
   from killme_V1 t



Могу переслать код - (он прост - но полей много) - могу переслать скрин результата
Но не могу понять почему это работает ? (странный вопрос - ПОЧЕМУ РАБОТАЕТ ?)
Может были такие экстраординарные случаи ? Или можите прояснить

Заранее благодарен !
...
Рейтинг: 0 / 0
16.02.2022, 02:27
    #40134417
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X,

В общем случае, никак из-за
ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table
Код: 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.
SQL> select * from t;

        ID DES
---------- ---
         1 aaa
         2 bbb
         3 eee
         4 xxx

SQL> create or replace view tv as select * from t;

View created.

SQL> select rowid from tv;

ROWID
------------------
AAATNbAAMAAARRDAAA
AAATNbAAMAAARRDAAB
AAATNbAAMAAARRDAAC
AAATNbAAMAAARRDAAD

SQL> create or replace view tv as select * from t, dual;

View created.

SQL> select rowid from tv;
select rowid from tv
                  *
ERROR at line 1:
ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table



Но с "key-preserved table"
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> create or replace view tv2 as select t.* from t join t t2 on t.id=t2.id;

View created.

SQL> select rowid from tv2;
select rowid from tv2
                  *
ERROR at line 1:
ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table

SQL> alter table t add constraint t_pk primary key (id);

Table altered.

SQL> select rowid from tv2;

ROWID
------------------
AAATNbAAMAAARRDAAA
AAATNbAAMAAARRDAAB
AAATNbAAMAAARRDAAC
AAATNbAAMAAARRDAAD

...
Рейтинг: 0 / 0
16.02.2022, 02:30
    #40134418
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X
RowID в качестве поля View - не представлено !? (Точно проверял много раз)
Но при вызове представление можно писать непосредственно RowID (не ПОЛЕ A_rowid !!!!)
rowid - это псевдостолбец , а не обычное поле таблицы
...
Рейтинг: 0 / 0
16.02.2022, 14:53
    #40134538
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Sayan Malakshinov

alter table t add constraint t_pk primary key (id);


Вы правы - наличие уникального ключа (уникальный индекс тоже) в присоединяемой таблице
дает возможность видить RowId родительской таблицы

Спасибо !
...
Рейтинг: 0 / 0
16.02.2022, 15:10
    #40134542
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X
Sayan Malakshinov

alter table t add constraint t_pk primary key (id);


Вы правы - наличие уникального ключа (уникальный индекс тоже) в присоединяемой таблице
дает возможность видить RowId родительской таблицы

Спасибо !


интересно, где-то в доке оговорено что ето RowId именно родительской таблицы?

.....
stax
...
Рейтинг: 0 / 0
16.02.2022, 20:57
    #40134647
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
Stax,

Родительской - проверил - соответствует !

create or replace view killme_V1 as
select A.*,
A.Rowid Row_A,
B.F1
from dept A
left join emp B
on (A.deptno = B.deptno);

select T.*,
t.Rowid
from killme_V1 t
...
Рейтинг: 0 / 0
16.02.2022, 22:18
    #40134667
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X,
А если, например так:
Код: plsql
1.
2.
3.
4.
5.
create table A as select level as id from dual connect by level<=5;
alter table A add primary key(id);
create table B as select level as id from dual connect by level<=5;
alter table B add primary key(id);
create view AB as select A.id as a_id, B.id as b_id from A join B on A.id = B.id;


Тогда в
Код: plsql
1.
select t.*, rowid from AB t


чей ROWID будет в результате?
...
Рейтинг: 0 / 0
16.02.2022, 23:07
    #40134674
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
ASNexus

чей ROWID будет в результате?


Это не сложно проверить

create or replace view killme_V1 as
select A.*,

A.Rowid Row_A,
B.Rowid Row_B,

B.F1
from dept A
left join emp B
on (A.deptno = B.deptno);

select T.*,
t.Rowid ROW_VIEW
from killme_V1 t

Сравните поле Row_A Row_B и Row_View
...
Рейтинг: 0 / 0
16.02.2022, 23:14
    #40134676
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X
ASNexus

чей ROWID будет в результате?


Это не сложно проверить

create or replace view killme_V1 as
select A.*,

A.Rowid Row_A,
B.Rowid Row_B,

B.F1
from dept A
left join emp B
on (A.deptno = B.deptno);

select T.*,
t.Rowid ROW_VIEW
from killme_V1 t

Сравните поле Row_A Row_B и Row_View

Проверить не сложно - я не об этом. Можно ли закладываться на именно такую логику? А если во view таблицы (эквивалентные по сути) местами поменять?
...
Рейтинг: 0 / 0
17.02.2022, 21:35
    #40134972
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
ASNexus,

Честно говоря - не понял смысла Зачем ?
Если поменять значимость - главная и второстепенная - RowId показет главную ...
(мне в принципе нужна именно главная)
Но уточните Ваш вопрос на примере
...
Рейтинг: 0 / 0
17.02.2022, 22:46
    #40134981
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
HOME_X
ASNexus,

Честно говоря - не понял смысла Зачем ?
Если поменять значимость - главная и второстепенная - RowId показет главную ...
(мне в принципе нужна именно главная)
Но уточните Ваш вопрос на примере


Я имел в виду, что в приведённом мной примере - во view соединение двух равнозначных таблиц. В запросе к этому view получаем некий rowid - это будет rowid "главной" таблицы. Пока всё ОК.

Как можно быть уверенным, какую из таблиц Oracle посчитает "главной" в каждом конкретном случае (HJ, NL, MJ)?

Если количество строк в любой из них станет в 20 раз больше, чем в другой? Если соединение идёт не "в лоб" по PK, а по другим полям, но уникальность строк каждой таблицы в результате обеспечивается (другими уникальными индексами)?

Тесткейс делать не охота, просто рассуждения - допустим оптимизатор выбирает hash join или nested loops и что в данном случае будет "главной" (для получения rowid из view) таблицей? В первом случае, вероятно, та, в которой меньше строк в данной момент, а во втором наоборот? Думаю, что можно это прибить хинтом leading, но не уверен. В любом случае нет никакой гарантии, что в другой версии Oracle это поведение не изменится.

Вы точно уверены, что нужно именно использование rowid из view, а не полей в самой view: rowidtochar(a.rowid) as a_rowid, rowidtochar(b.rowid) as b_rowid с последующим их конвертированием обратно chartorowid(a_rowid), chartorowid(b_rowid)?
...
Рейтинг: 0 / 0
17.02.2022, 23:00
    #40134984
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Row_ID базовой таблицы в View
ASNexus
но уникальность строк каждой таблицы в результате обеспечивается (другими уникальными индексами)?
Индексы никак не участвуют в key-preserved
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Row_ID базовой таблицы в View / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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