Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / rowid в запросе / 25 сообщений из 28, страница 1 из 2
09.11.2020, 15:47
    #40016544
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Насколько безопасно использовать rowid в рамках одного запроса (передавать из одного подзапроса в другой)?
Свои внутренние "TABLE ACCESS BY INDEX ROWID" Oracle обработает корректно даже при move online таблицы.
А явное использование, никто не сталкивался с проблемами?
...
Рейтинг: 0 / 0
09.11.2020, 16:14
    #40016557
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
"А это вы жалуетесь или хвастаетесь?"
Внутри одного SQL-запроса, думаю, точно безболезненно
А так, даже без страшного админского MOVE, может проявиться и простой переезд между секциями от соседней сессии
Но ведь для этого и существуют просчеты рисков, а то, так-то и Нибиру может...
Хранить, да, весьма нежелательно, а внутри достаточно быстрого блока -- почему бы и нет
...
Рейтинг: 0 / 0
09.11.2020, 16:29
    #40016568
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
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
09.11.2020, 16:30
    #40016569
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
AlexFF__|,

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

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

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

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

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

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

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

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


AFAIK Вроде Oracle Forms если явно не задан key для блока (т.е. в большинстве случаев), так же записи по ROWID идентифицирует.
...
Рейтинг: 0 / 0
09.11.2020, 16:46
    #40016578
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
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
09.11.2020, 16:50
    #40016580
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Коллеги, всем спасибо, но повторюсь.
Мне не нужны примеры использования и разные полезности.
Мне нужны баги )
...
Рейтинг: 0 / 0
19.12.2020, 21:53
    #40029334
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Подглядел, что SQL Developer при редактировании данных в гриде обновляет их таким образом:
Код: plsql
1.
update ... where rowid = ... and ora_rowscn = ...


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


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


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

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

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


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


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

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

.....
stax

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


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

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

.....
stax

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



в 10-ке rowdependencies был?

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

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

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

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


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

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

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

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

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

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


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

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

Ну а баги они в любом месте могут случиться.
...
Рейтинг: 0 / 0
22.12.2020, 02:15
    #40030004
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Внимательней читай
...
Рейтинг: 0 / 0
13.03.2021, 13:42
    #40053136
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
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
13.03.2021, 13:52
    #40053138
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
При этом если сделать запрос
Код: plsql
1.
select * from "BM_TARIFF_" WHERE ROWID = 'AABulRAAKAAD64dABI' AND ORA_ROWSCN = '13866267714'


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

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

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
13.03.2021, 15:01
    #40053150
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Alibek B.
Или в Oracle возможна ситуация, когда в рамках одной сессии, транзакции, при отсутствии DDL или даже DML, у строки может изменяться SCN?
22251322 читал?
...
Рейтинг: 0 / 0
13.03.2021, 15:19
    #40053155
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Да, поэтому и написал про отсутствие DML/DDL.
Или имелось ввиду задать rowdependencies для таблицы bm_tariff_ ?
...
Рейтинг: 0 / 0
13.03.2021, 15:30
    #40053157
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rowid в запросе
Видимо имелось ввиду это ?
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / rowid в запросе / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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