ORA_ROWSCN - старые/восстановленные блоки не имеют реального SCN?

Мы используем псевдоколонку ORA_ROWSCN, чтобы находить недавно измененные строки в целях репликации выбранных деталей в другой источник данных. Мы знаем о "приблизительном" характере этого столбца, что целые партии строк внутри блока помечены SCN, если изменилась только одна строка в блоке, и мы в порядке с этим, относительно небольшие партии ложных срабатываний не проблема.

Однако мы наблюдаем большое количество строк, которые, как представляется, имеют "плавающее" значение ORA_ROWSCN. Это миллионы строк, которые, конечно же, не меняются вообще, однако каждый раз, когда мы начинаем новый сеанс консоли с Oracle, блок строк получает новый, последний SCN каждый раз. Ниже проиллюстрировано три отдельных сеанса консоли в течение нескольких минут:

Сессия № 1 - 4 миллиона строк под SCN 27501512:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501512

Сессия № 2 - 4 миллиона строк под SCN 27501522:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501522

Сессия № 3 - 4 миллиона строк под SCN 27501528:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501528

Это тестовая база данных, и никакие другие процессы не изменяют строки. Наша теория состоит в том, что строки в этом блоке из четырех миллионов по какой-то причине не имеют выделенного "SCN", поскольку эти строки были перенесены в эту базу данных с помощью инструмента Oracle Data Pump, возможно, блоки, содержащие их, не имеют надлежащего назначенный SCN. Oracle тогда не имеет другого выбора, кроме как дать нам максимально возможный SCN для этих строк, соответствующий текущему значению SCN, возможно, поскольку нет другого доступного значения. Когда мы ОБНОВЛЯЕМ эти строки, даже бессмысленно, они выходят из блока из 4 миллионов "плавающих" SCN и получают фиксированный номер SCN. Остальные строки продолжают перемещаться.

Может кто-то подтвердить, что A. это на самом деле то, что мы видим, B. возможно, если это известный эффект утилиты Oracle Pump и C., если мы просто помечаем эти строки новым UPDATE, постоянно ли выходить из "плавающего" SCN, тем самым решая нашу проблему?

Примечания:

  • Мы знаем, что SCN не точны и являются блочными.

  • У нас нет интереса к "почему бы вам не использовать альтернативную технику X?" ответы, мы знаем другие методы, и мы будем использовать их, если решим, мы просто пытаемся понять это точное поведение.

Ответ 1

A) То, что вы видите, это настоящая проблема, с которой столкнулись другие. B) Эта проблема возникает не только от Data Pump. C) UPDATE поможет решить проблему, но вы не можете полагаться на нее, которая всегда работает.

ORA_ROWSCN является неточным и непоследовательным. 10g documention упоминает неточность. 11g документация дает понять, насколько плохо подходит ORA_ROWSCN для того, что вы пытаетесь сделать:

Если блок запрашивается дважды, то возможно значение ORA_ROWSCN для изменения между запросами, даже если строки не имеют обновлялось за время между запросами.

Я не уверен, что вызывает изменение ORA_ROWSCN между сеансами, но я не думаю, что это связано только с Data Pump. Когда я впервые столкнулся с этой проблемой около 5 лет назад, мы никогда не находили шаблон, и если я правильно помню, мы даже не использовали Data Pump.

Наша проблема была конкретно в Oracle SQL Developer, которая использует ORA_ROWSCN для оптимистической блокировки. Эта ошибка была невероятно раздражающей. Пользователи вносили изменения, и когда они пошли, чтобы совершить это, они неправильно сказали, что кто-то еще уже изменил строку. Как и сейчас, мы обнаружили, что если бы мы применили какие-либо изменения к строкам, проблема исчезла бы. Я не могу вспомнить, насколько хорошо это сработало, но вы не должны предполагать, что он будет работать в 100% случаев.

Насколько я знаю, никто не может точно объяснить, как ORA_SCN установлен и что он вернет. Он не должен использоваться, когда вам нужны точные или повторяемые результаты.