Мы используем псевдоколонку 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?" ответы, мы знаем другие методы, и мы будем использовать их, если решим, мы просто пытаемся понять это точное поведение.