powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / rowid в запросе
25 сообщений из 28, страница 1 из 2
rowid в запросе
    #40016544
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько безопасно использовать rowid в рамках одного запроса (передавать из одного подзапроса в другой)?
Свои внутренние "TABLE ACCESS BY INDEX ROWID" Oracle обработает корректно даже при move online таблицы.
А явное использование, никто не сталкивался с проблемами?
...
Рейтинг: 0 / 0
rowid в запросе
    #40016557
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"А это вы жалуетесь или хвастаетесь?"
Внутри одного SQL-запроса, думаю, точно безболезненно
А так, даже без страшного админского MOVE, может проявиться и простой переезд между секциями от соседней сессии
Но ведь для этого и существуют просчеты рисков, а то, так-то и Нибиру может...
Хранить, да, весьма нежелательно, а внутри достаточно быстрого блока -- почему бы и нет
...
Рейтинг: 0 / 0
rowid в запросе
    #40016568
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|
Насколько безопасно использовать rowid в рамках одного запроса (передавать из одного подзапроса в другой)?
Свои внутренние "TABLE ACCESS BY INDEX ROWID" Oracle обработает корректно даже при move online таблицы.
А явное использование, никто не сталкивался с проблемами?

вот здесь xtender дает мастер-класс дает по явному использованию:

https://www.sql.ru/forum/1321768/index-range-scan-in-parallel

В принципе, неплохо работает, но современный оптимизатор сильно умничает,
и без принуждения хинтами, обычно, даёт что-то на своё усмотрение.

Иногда страсть как хочется к такой механике сортировку по файлам/блокам приделать...
Иногда весьма недурственным конкурентом показанной там старой технике является
KEEP (DENSE_RANK LAST ORDER BY ...) или что-то аналогично соответствующее случаю.
При наличии "идеально подходящего" индекса rowid последним вариантом превосходится.
При наличии "умеренно подходящего" - они хорошие конкуренты с выбором по обстоятельствам...
...
Рейтинг: 0 / 0
rowid в запросе
    #40016569
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,

перечислить когда меняется ровид

если ети случаи исключены, то зависит от "важности/критичности" приложения

ps
насколько помню current of основан на использовании ровида,
так что и оракля юзала ровид в своих целях

.....
stax
...
Рейтинг: 0 / 0
rowid в запросе
    #40016575
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров

Внутри одного SQL-запроса, думаю, точно безболезненно

Я тоже так думаю, но за спрос не бьют в нос.
Я ни разу не встречал при перемещениях срок различий между
TABLE ACCESS BY INDEX ROWID
TABLE ACCESS BY USER ROWID

Однако, может кто что имеет.
...
Рейтинг: 0 / 0
rowid в запросе
    #40016576
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

так что и оракля юзала ровид в своих целях


AFAIK Вроде Oracle Forms если явно не задан key для блока (т.е. в большинстве случаев), так же записи по ROWID идентифицирует.
...
Рейтинг: 0 / 0
rowid в запросе
    #40016578
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|

Однако, может кто что имеет.


один из древних вариантов удаления дублей
Код: plsql
1.
2.
3.
SQL> delete emp where rowid not in (select min(rowid) from emp group by ename);

0 rows deleted.



если оракля материализует select min(rowid) from emp group by ename,
возможны ли проблемы с дублями?

.....
stax
...
Рейтинг: 0 / 0
rowid в запросе
    #40016580
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, всем спасибо, но повторюсь.
Мне не нужны примеры использования и разные полезности.
Мне нужны баги )
...
Рейтинг: 0 / 0
rowid в запросе
    #40029334
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подглядел, что SQL Developer при редактировании данных в гриде обновляет их таким образом:
Код: plsql
1.
update ... where rowid = ... and ora_rowscn = ...


Можно ли считать это сочетание уникальным и постоянным в рамках сессии?
...
Рейтинг: 0 / 0
rowid в запросе
    #40029634
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Подглядел, что SQL Developer при редактировании данных в гриде обновляет их таким образом:
Код: plsql
1.
update ... where rowid = ... and ora_rowscn = ...


Можно ли считать это сочетание уникальным и постоянным в рамках сессии?


Таблица партицированная? Таблицу часто перемещают/пересоздают?

ps
в общем случае ответ нет, но в 99% случаев ...

.....
stax
...
Рейтинг: 0 / 0
rowid в запросе
    #40029637
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
Alibek B.
Подглядел, что SQL Developer при редактировании данных в гриде обновляет их таким образом:
Код: plsql
1.
update ... where rowid = ... and ora_rowscn = ...


Можно ли считать это сочетание уникальным и постоянным в рамках сессии?


Таблица партицированная? Таблицу часто перемещают/пересоздают?

ps
в общем случае ответ нет, но в 99% случаев ...

.....
stax

Тут все зависит от rowdependencies и при включении опции все будет работать корректно.
...
Рейтинг: 0 / 0
rowid в запросе
    #40029651
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swsov
Stax
пропущено...


Таблица партицированная? Таблицу часто перемещают/пересоздают?

ps
в общем случае ответ нет, но в 99% случаев ...

.....
stax

Тут все зависит от rowdependencies и при включении опции все будет работать корректно.



в 10-ке rowdependencies был?

ora_rowscn тем более в сессии не постоянный

....
stax
...
Рейтинг: 0 / 0
rowid в запросе
    #40029663
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

ora_rowscn тем более в сессии не постоянный
stax

По моему, ты не понимаешь, что такое ora_rowscn.
Он относится не к сессии, а к строке/блоку и содержит system change number последнего изменения строки/блока.
...
Рейтинг: 0 / 0
rowid в запросе
    #40029672
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Подглядел, что SQL Developer при редактировании данных в гриде обновляет их таким образом:
Код: plsql
1.
update ... where rowid = ... and ora_rowscn = ...


Можно ли считать это сочетание уникальным и постоянным в рамках сессии?

безусловно нет.

это специфическая форма защиты от потери чужих обновлений при использовании схемы "оптимистической блокировки".
...
Рейтинг: 0 / 0
rowid в запросе
    #40029684
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял, спасибо.
Иногда SQL Developer не мог применить изменения в гриде, видимо по этой причине.
...
Рейтинг: 0 / 0
rowid в запросе
    #40029696
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Понял, спасибо.
Иногда SQL Developer не мог применить изменения в гриде, видимо по этой причине.

в этом вся соль и смысл - сказать клиенту, что такой строки, которую я читал - больше нет .
Мне без перечитывания больше нечего обновлять.

В данном конкретном случае проблема в том, что "автоматически" хорошо такой заход будет работать
только при включенном rowdependency, иначе у клиента будут инвалидироваться все строки
одного блока при изменении любой строки в нём.
...
Рейтинг: 0 / 0
rowid в запросе
    #40029925
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров

А так, даже без страшного админского MOVE, может проявиться и простой переезд между секциями от соседней сессии


Запрос со всеми подзапросами видит замороженный и согласованный образ данных. Так что даже если строка переедет, по ROWID всё равно будет найден её первоначальный образ.

В рамках запроса изменение записи может произойти только один раз. Так что даже если запись переедет, СУБД к ней всё равно уже не будет обращаться до завершения запроса.

Ну а баги они в любом месте могут случиться.
...
Рейтинг: 0 / 0
rowid в запросе
    #40030004
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внимательней читай
...
Рейтинг: 0 / 0
rowid в запросе
    #40053136
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

в этом вся соль и смысл - сказать клиенту, что такой строки, которую я читал - больше нет .
Мне без перечитывания больше нечего обновлять.

А из-за чего может возникать такая ситуация?
Сейчас столкнулся тем, что не могу обновить данные в гриде в SQL Developer 20.
Есть таблица, которая мало используется и уж точно не обновляется.
Открываю грид с этом таблицей, кликаю на определенную строку, удаляю данные из ячейки. Нажимаю commit и получаю сообщение об ошибке:
Код: plaintext
1.
2.
3.
4.
UPDATE "BM_TARIFF_" SET DATA = '' WHERE ROWID = 'AABulRAAKAAD64dABI' AND ORA_ROWSCN = '13866267714'

One error saving changes to table "BM_TARIFF_":
Row 5: Data got committed in another/same session, cannot update row.
Между обновлением грида и применением изменений прошло максимум 5 секунд. И в этом интервале гарантированно никто эту строку (или всю таблицу) не редактировал.
Причем такое стабильно случается с этой конкретной строкой, другие строки обновляются без проблем.
...
Рейтинг: 0 / 0
rowid в запросе
    #40053138
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом если сделать запрос
Код: plsql
1.
select * from "BM_TARIFF_" WHERE ROWID = 'AABulRAAKAAD64dABI' AND ORA_ROWSCN = '13866267714'


то я получаю именно ту строку, которую хочу изменить.
...
Рейтинг: 0 / 0
rowid в запросе
    #40053144
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, иногда rowscn изменяется, даже в пределах сессии и транзакции.
rowid при этом не меняется, даже при переподключении (новой сессии).

И подобные проблемные строки всегда одни и те же.
...
Рейтинг: 0 / 0
rowid в запросе
    #40053147
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного поизучал, что и как получается.

SQL Developer, при открытии грида, делает примерно такой запрос:
Код: plsql
1.
2.
3.
4.
5.
select /*+ no_parallel(sub1) */  * from (
select  * from (
SELECT ROWID "ROWID", ORA_ROWSCN "ORA_ROWSCN", TARIFF_ID TARIFF_ID, ... FROM "BILLING"."BM_TARIFF_"
 )  WHERE category!='***' and data is not null --здесь добавляется фильтр, заданный пользователем
 ) sub1 order by 3 asc


Полученные значения rowid и ora_rowscn сохраняет где-то в гриде, чтобы использовать их при редактировании.
Когда я редактирую грид и делаю коммит, то SQL Developer использует эти сохраненные значения и выполняет примерно такой запрос:
Код: plsql
1.
UPDATE "BILLING"."BM_TARIFF_" SET DATA = '' WHERE ROWID = 'AABulRAAKAAD64dABI' AND ORA_ROWSCN = '13870008488'



Есть некоторые строки, на которых при этом возникает ошибка сохранения данных (Data got committed in another/same session, cannot update row.).

Если в рамках этой же сессии в SQL Developer выполнить такой запрос:
Код: plsql
1.
select rowid, ORA_ROWSCN, t.* from "BILLING"."BM_TARIFF_" t WHERE ROWID = 'AABulRAAKAAD64dABI'


то в полученном результате будет ORA_ROWSCN=13870030810.

Однако если грид обновить и снова попытаться изменить эту же строку, то в логах снова возникает ошибка и тексте запроса снова фигурирует ORA_ROWSCN=13870008488
И эти значения 13870008488 и 13870030810 так и фигурируют далее; в гриде используется первое, хотя фактическое значение другое.

И даже если использовать исходный запрос:
Код: plsql
1.
2.
3.
4.
5.
select /*+ no_parallel(sub1) */  * from (
select  * from (
SELECT ROWID "ROWID", ORA_ROWSCN "ORA_ROWSCN", TARIFF_ID TARIFF_ID, ... FROM "BILLING"."BM_TARIFF_"
 )  WHERE category!='***' and data is not null
 ) sub1 where ROWID = 'AABulRAAKAAD64dABI' order by 3 asc


(то есть использовать подзапрос, как это делает SQL Developer), то в полученном результате все равно ORA_ROWSCN=13870030810.

Откуда в SQL Developer может браться значение ORA_ROWSCN=13870008488?
Это какой-то программный баг/глюк самого SQL Developer?
Или в Oracle возможна ситуация, когда в рамках одной сессии, транзакции, при отсутствии DDL или даже DML, у строки может изменяться SCN?
...
Рейтинг: 0 / 0
rowid в запросе
    #40053150
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Или в Oracle возможна ситуация, когда в рамках одной сессии, транзакции, при отсутствии DDL или даже DML, у строки может изменяться SCN?
22251322 читал?
...
Рейтинг: 0 / 0
rowid в запросе
    #40053155
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, поэтому и написал про отсутствие DML/DDL.
Или имелось ввиду задать rowdependencies для таблицы bm_tariff_ ?
...
Рейтинг: 0 / 0
rowid в запросе
    #40053157
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо имелось ввиду это ?
One thing to note, by default Oracle will not track SCN's at the row level in a table, so you need to enable row level dependency tracking by using the ROWDEPENDENCIES keyword in the CREATE TABLE command.
This rowdependencies clause changes the default behavior of Oracle to put an SCN on every row within the tables, and not just one SCN for every physical data block.

Правда этот атрибут можно задать только при (пере)создании таблицы.
То есть причина в том, что в Oracle 10g SCN для строки может быть неправильным?
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / rowid в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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