|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Доброго дня господа ! Имею простой запрос Код: plsql 1. 2. 3. 4. 5. 6.
Как в таком представлении увидеть И ИСПОЛЬЗОВАТЬ !!!! в последующих предикатах RowId таблицы T1 Использовать это select С.*,C.Rowid from V1 C where C.RowId='AAAmmm+TTTdd' И чтобы план запроса давал именно ссылку на Rowid таблицы ( это НЕ ПОЛЕ образованное из RowID !!!! ) Спасибо . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 19:46 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Какую задачу вы хотите решить в конечном итоге? Сформулируйте, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 20:09 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
SQL*Plus, У меня есть набор пользовательских представлений (доступ к базовым таблицам запрещен) Объем каждого 20 млн-400 млн. записей. Хочу создать набор таблиц с RowID необходимых записей этих представлений. Это сократит объем до 10 тыс - 200 тыс по каждой (на манер доменного индекса) И работать через такие указатели - доп. объем на диске увеличиться незначительно Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 20:29 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
HOME_X, Ну, ты же в курсе, что rowid иногда меняется? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 23:15 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
oragraf HOME_X, Ну, ты же в курсе, что rowid иногда меняется? Спасибо за вопрос - задумаюсь !!!!! Сейчас бы хотелось проясни можно ли получить RowId в сложных представлениях Если представление ложиться на одну таблицу - RowId получаем автоматически ... А если в условиях со связью можете сказать как реализовать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 23:37 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
HOME_X Сейчас бы хотелось проясни можно ли получить RowId в сложных представлениях Если представление ложиться на одну таблицу - RowId получаем автоматически ... А если в условиях со связью можете сказать как реализовать ? Так в чём проблема? Можно получить столько rowid, сколько сджойнено таблиц. Просто для каждой нужно указать свой алиас таблицы и свой алиас этого псевдополя. Правда, если джойн OUTER, то не понятен смысл действа, ведь будут пустышки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 00:48 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Правильный Вася Можно получить столько rowid, сколько сджойнено таблиц. Просто для каждой нужно указать свой алиас таблицы и свой алиас этого псевдополя. HOME_X И чтобы план запроса давал именно ссылку на Rowid таблицы ( это НЕ ПОЛЕ образованное из RowID !!!! ) Здесь важна не визуализация - а возможность быстрого доступа ! Получиться ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 09:14 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 11:27 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
oragraf HOME_X, Ну, ты же в курсе, что rowid иногда меняется? Имеется ввиду при удалении/инсерте записи вновь? Или, что будет для меня откровением, rowid записи может поменяться и без никаких dml над записью? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 21:03 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Master_Detail oragraf HOME_X, Ну, ты же в курсе, что rowid иногда меняется? Или, что будет для меня откровением, rowid записи может поменяться и без никаких dml над записью? ROWID - это всего лишь адрес записи во внутренних структурах хранения Оракла. Поскольку они внутренние, то Оракл вправе их менять как ему нравится. Например, при MOVE таблицы или при SHRINK секции. В некоторых случаях имеет значение, как установлен признак ROW MOVEMENT у таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 00:10 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Правильный Вася 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 00:49 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
SQL*Plus Oracle самостоятельно ("по своему хотению") не перемещает строки в таблицах. Разве я где-то сказал, что он это делает? 1. Я написал "как ему нравится", а не "когда ему нравится". Т.е. алгоритм перемещения записей с изменением адреса - это внутреннее дело. 2. Я написал "вправе" с указанием примеров, а не "делает всегда". Т.е. даже в этих случаях он может переместить только некоторые записи, изменив им адреса, а остальные оставить на прежних местах. P.S. Но зарекаться не стоит. Раз этот механизм внутренний, ничто не мешает разработчикам встроить в код "утрамбовку" данных без уведомления, упомянув разве только, что в периоды простоя возможны операции по оптимизации структур хранения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 01:20 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 01:20 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
SQL*Plus, Извините господа, малость выпал из диалога Спасибо Ваш код будет реализован Насчет изменений RowId - принято к доп. исследованию У меня возникла некоторая непонятка Вот Ваш код Вы вывели RowId основной таблицы как поле, можно на него ссылаться в дальнейшем Код: plsql 1. 2. 3. 4. 5. 6.
Все предельно ЯСНО !! Поле A_rowid = 'ddddfff+kk' Но в меня в продуктивных представлениях (имею в виду эти объекты давно и надежно работают) есть абсолютна аналогичная архитектура - т.е. две большие таблицы со связью типа LEFT RowID в качестве поля View - не представлено !? (Точно проверял много раз) Но при вызове представление можно писать непосредственно RowID (не ПОЛЕ A_rowid !!!!) И это ТОЖЕ работает - почему и как не могу понять Т.е. писано так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Могу переслать код - (он прост - но полей много) - могу переслать скрин результата Но не могу понять почему это работает ? (странный вопрос - ПОЧЕМУ РАБОТАЕТ ?) Может были такие экстраординарные случаи ? Или можите прояснить Заранее благодарен ! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 00:22 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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.
Но с "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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 02:27 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
HOME_X RowID в качестве поля View - не представлено !? (Точно проверял много раз) Но при вызове представление можно писать непосредственно RowID (не ПОЛЕ A_rowid !!!!) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 02:30 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
Sayan Malakshinov alter table t add constraint t_pk primary key (id); Вы правы - наличие уникального ключа (уникальный индекс тоже) в присоединяемой таблице дает возможность видить RowId родительской таблицы Спасибо ! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 14:53 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
HOME_X Sayan Malakshinov alter table t add constraint t_pk primary key (id); Вы правы - наличие уникального ключа (уникальный индекс тоже) в присоединяемой таблице дает возможность видить RowId родительской таблицы Спасибо ! интересно, где-то в доке оговорено что ето RowId именно родительской таблицы? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 15:10 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 20:57 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
HOME_X, А если, например так: Код: plsql 1. 2. 3. 4. 5.
Тогда в Код: plsql 1.
чей ROWID будет в результате? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 22:18 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 23:07 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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 таблицы (эквивалентные по сути) местами поменять? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 23:14 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
ASNexus, Честно говоря - не понял смысла Зачем ? Если поменять значимость - главная и второстепенная - RowId показет главную ... (мне в принципе нужна именно главная) Но уточните Ваш вопрос на примере ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 21:35 |
|
Row_ID базовой таблицы в View
|
|||
---|---|---|---|
#18+
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)? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 22:46 |
|
|
start [/forum/topic.php?fid=52&msg=40134676&tid=1879494]: |
0ms |
get settings: |
15ms |
get forum list: |
7ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
73ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
418ms |
get tp. blocked users: |
0ms |
others: | 2543ms |
total: | 3062ms |
0 / 0 |