Oracle 10G: правильно с использованием ORA_ROWSCN для обнаружения изменений строки таблицы (то есть вставки, обновления, удаления)

dba.stackexchange https://dba.stackexchange.com/questions/5061

Вопрос

Некоторые исследования проверки, когда записи таблицы были в последний раз обновлены, изменены или удалены, привели меня к псевдо столбцу, известному как ORA_ROWSCN.

Сначала я делаю это:

select max(ora_rowscn) from tablename;

Я принимаю к сведению номер. Затем я делаю вставку, обновление и удаление, проверяю это максимальное значение до и после каждого. Похоже, что увеличение для каждого типа изменения.

Если вам интересно, почему я это делаю, мы кэшируем список объектов в нашей службе C# Windows. Эта служба работает на двух сбалансированных серверах, поэтому есть отдельный экземпляр каждого запуска. Когда на сервере A происходит обновление, сервер B должен знать об этом. Я хочу сделать Cache Max (ORA_ROWSCN) в переменную. Каждый раз, когда наше приложение идет, чтобы вставить, обновлять или удалять запись, оно получит новый макс из базы данных. Если значение отличается, он, очевидно, знает, что необходимо получить новый список из базы данных.

Итак, мой фактический вопрос заключается в следующем: есть ли какие -либо другие загромождения, о которых я должен знать, которые могут привести к вставке, обновлению или удалению записи, не увеличивающей это значение?

Редактировать: Может кто -нибудь добавить ora_rowscn как тег?

Это было полезно?

Решение

Есть ли какие -либо другие ловушки, которые я должен знать, которые могут привести к вставке, обновлению или удалению записи, не увеличивающей это значение?

ora_rowscn является всегда увеличивается при изменении строки - но в конфигурации по умолчанию она также может быть увеличена Когда ряд не меняется

Если вам нужно проверить всю таблицу для Udates, один из методов - это Используйте аудит. Анкет С другой стороны, если вам нужно только проверить строку, которую вы пытаетесь обновить для конфликтов, ora_rowscn с rowdependencies Идеально.

Другие советы

Получение MAX (ORA_ROWSCN) потребует полного сканирования таблицы каждый раз, когда вы это делаете. Это может быть быстрее, чтобы каждый раз обновлять весь кэш.

Похоже, вам нужен способ уведомить другую услугу о том, что произошли изменения и каковы были изменения. Вы можете поддерживать таблицу журналов с столбцом, который указывает, какая система должна потреблять изменение. Столбец может иметь два индекса на основе функций по одному для каждой службы, так что каждый индекс содержит только те записи, которые необходимо использовать. Затем, когда они потребляются, они могут сделать значение нулю, чтобы удалить его из индекса.

Или вы можете просто использовать Oracle's Усовершенствованные очереди.

Как отметил @leigh Riffel, выбранная макс (ORA_ROWSCN) приведет к полному сканированию таблицы. Альтернатива состоит в том, чтобы иметь столбец TimeStamp (мы будем называть SYS_TS для этого примера), который заполняется временем выполнения операторов (что не совпадает с обязательством оператора, которое происходит, когда SCN генерируется/заполняется). Индекс в столбце sys_ts позволит вам взглянуть на самые последние ряды x (скажем, 25), чтобы найти Max ORA_ROWSCN только из этих рядов.

Самым простым способом сделать это было бы использовать Rownum для ограничения результатов, как описано в этом [1] СПАСИТЕ СТАТЬЯ:

select *
from (select sys_ts, ora_rowscn
from table order by SYS_TS desc) where rownum < 25;

К сожалению, это также приводит к полному сканированию таблицы (по крайней мере, в Oracle 11.2.0.3). Об этом сообщалось в Oracle, но решило не быть дефектом (ошибка 17347125).

Это требует немного большей работы для эффективного достижения того же результата:

select b.sys_ts,b.ora_rowscn from
    (select rid from 
        (select rowid as rid from table order by sys_ts desc) 
    where rownum <= 25) a, table b
where a.rid = b.rowid;

[1] - http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top