Има ли някакъв метод за избиране само на нови/променени редове без колона с дата или зависимост на ред в Oracle?

Как бихте направили това?

Извършвам ETL процес на бази данни, които в момента нямат колона Date_added/Date_updated. DBA не иска да добави колона за дата към таблиците, така че трябва да намеря някакъв алтернативен начин за избор само на нови/променени записи за нощни извличания. Базите данни са огромни, така че решението трябва да бъде пространствено/времево ефективно, ако е възможно.

Разглеждане на някои последващи въпроси:

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

1) масата има ли PK? Да, всяка таблица има PK, който е уникален само в себе си.

2) Огромната база данни е... милиарди, милиони? 10 милиона записа в най-голямата таблица в момента

3) размер на поднабор от данни на нови/променени записи за нощни извличания? Бих предположил около 2000 реда на клиент, умножени по 100 клиента, за да дадем 200 000.

4) някакви уникални стойности при нощни екстракции? Във всяка схема има уникални стойности.


person user3808188    schedule 14.07.2014    source източник
comment
Какви колони вече имате? Освен това DBA противопоставя ли се само на нова колона от тип date или на нови колони като такива?   -  person shree.pat18    schedule 14.07.2014
comment
Вашият въпрос има твърде много неизвестни: 1) таблицата има ли PK? 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 Разширено ръководство за разработчици на приложения

person Joseph B    schedule 14.07.2014
comment
Това по същество ли поддържа резервно копие на данни от различни времена? Колко голямо би било това? - person user3808188; 14.07.2014
comment
@user3808188 Да, подобно е на запазването на резервно копие на данни. Oracle прави това автоматично за всички промени, освен ако не използвате вмъквания по директен път (напр. /*+ APPEND */). По подразбиране параметърът UNDO_RETENTION е зададен на 15 минути, промяната му на ден може или не може да изисква повече място. Освен това има отделна настройка за задържане за LOB и рестартирането на сървъра би загубило информацията за UNDO. Ще трябва да работите в тясно сътрудничество с вашия DBA, за да направите тази функция надеждна. - 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 е числово И, генерирано от последователност във възходящ ред, тогава можете да запишете началния и крайния час и ID в контролна таблица. Контролната таблица ще има набор от партидни първични ключове. Контролната таблица може да има дати, име на таблица (ако искате да приложите този дизайн за множество задачи), състояние и т.н.

person MathCurious    schedule 14.07.2014