Есть ли способ выбрать только новые/измененные строки без столбца даты или зависимости строки в Oracle?

Как бы вы это сделали?

Я выполняю процесс ETL для баз данных, в которых в настоящее время нет столбца Date_added/Date_updated. Администратор базы данных не хочет добавлять столбец «Дата» в таблицы, поэтому мне нужно найти альтернативный способ выбора только новых/измененных записей для ночных извлечений. Базы данных огромны, поэтому решение должно быть эффективным с точки зрения пространства/времени, если это возможно.

Решение некоторых дополнительных вопросов:

** В таблицах НЕ включена зависимость от строк.

1) в таблице есть ПК? Да, каждая таблица имеет ПК, уникальный только внутри себя.

2) Огромные БД - это.... миллиарды, миллионы? 10 миллионов записей в самой большой таблице прямо сейчас

3) размер подмножества данных новых/измененных записей для ночных извлечений? Я предполагаю, что около 2000 строк на клиента, умноженные на 100 клиентов, дают 200000.

4) какие-то уникальные значения в ночных добычах? В каждой схеме есть уникальные значения.


person user3808188    schedule 14.07.2014    source источник
comment
Какие колонки у вас уже есть? Кроме того, противится ли администратор базы данных только новому столбцу типа date или новым столбцам как таковым?   -  person shree.pat18    schedule 14.07.2014
comment
В вашем вопросе слишком много неизвестных: 1) есть ли в таблице ПК? 2) Огромные БД - это.... миллиарды, миллионы? 3) размер подмножества данных новых/измененных записей для ночных извлечений? 4) какие-то уникальные значения в ночных добычах? 5) ваше определение пространства/времени эффективно по отношению к ночному извлечению   -  person MathCurious    schedule 14.07.2014
comment
Рассматривали ли вы базовое сжатие таблиц? Если это процесс ETL, то даты должны быть очень похожими, а новые столбцы должны хорошо сжиматься.   -  person Jon Heller    schedule 15.07.2014


Ответы (3)


Если вы настроили свою базу данных для функции Oracle Flashback Transaction Query, вы можете запросить базу данных на прошлую дату, как показано ниже:

SELECT * 
FROM mytable
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

Таким образом, изо дня в день вы можете видеть изменения, используя МИНУС, т.к.

SELECT *
FROM mytable
MINUS
SELECT * 
FROM mytable
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

Ссылка:

Использование технологии Oracle Flashback в Oracle® Database Advanced Application Developer's Guide< /а>

person Joseph B    schedule 14.07.2014
comment
Является ли это по существу сохранением резервной копии данных из разных времен? Насколько большим это будет? - person user3808188; 14.07.2014
comment
@user3808188 user3808188 Да, это похоже на сохранение резервной копии данных. Oracle делает это автоматически для всех изменений, если вы не используете вставки прямого пути (например, /*+ APPEND */). По умолчанию параметр UNDO_RETENTION установлен на 15 минут, изменение его на день может потребовать или не потребовать больше места. Кроме того, существует отдельная настройка хранения для больших объектов, и перезапуск сервера приведет к потере информации об отмене. Чтобы сделать эту функцию надежной, вам необходимо тесно сотрудничать с вашим администратором баз данных. - person Jon Heller; 14.07.2014

Вы можете посмотреть ora_rowscn, который является системным номером изменения (SCN) самого последнего изменения строки:

CREATE TABLE bla (foo NUMBER NOT NULL) ROWDEPENDENCIES;

INSERT INTO bla VALUES (1);
COMMIT;

SELECT ORA_ROWSCN, foo FROM bla;
--10832905928770

INSERT INTO bla VALUES (2);
COMMIT;

SELECT ORA_ROWSCN, foo FROM bla;
--10832905928770    1
--10832905928816    2

SELECT ORA_ROWSCN, foo FROM bla where ora_rowscn > 10832905928770;
--10832905928816    2

В зависимости от параметра создания таблицы ROWDEPENDENCIES или NOROWDEPENDENCIES (по умолчанию), ORA_ROWSCN работает на уровне строк или блоков. Уровень строки, вероятно, лучше всего подходит для вашей цели, но его нельзя изменить после создания таблицы, поэтому потребуется некоторое резервное копирование данных, удаление таблицы, воссоздание таблицы с зависимостями строк, восстановление данных...

Подробнее здесь: http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns007.htm#SQLRF50953

person wolφi    schedule 14.07.2014
comment
Спасибо, но в моей таблице нет зависимостей строк. - person user3808188; 14.07.2014

Если ваш PK числовой, И генерируется из последовательности в возрастающем порядке, вы можете записать время начала и окончания и идентификатор в контрольной таблице. Управляющая таблица будет иметь диапазон первичных ключей пакета. В контрольной таблице могут быть даты, имя таблицы (если вы хотите применить этот дизайн для нескольких заданий), статус и т. д.

person MathCurious    schedule 14.07.2014