|
|
|
Фильтрация данных в GoldenGate
|
|||
|---|---|---|---|
|
#18+
Необходимо отфильтровать одинаковые строки при репликации с помощью OGG. То есть суть задачи: На источнике ходит стандартный job учетной системы, который каждые пять минут обновляет бОльшую часть строк в таблице "фиктивно" (изменяется только одно поле с датой изменения строки, остальные строки не меняются). GG обрабатывает строки в режиме хранения истории изменений с помощью параметра GETUPDATEBEFORES в экстракте и INSERTUPDATES, INSERTDELETES в репликате. В итоге мы имеем огромное количество строк в таблице приемнике, которые отличаются одна от другой только временем изменения (в рамках первичного ключа). Я попробовал отфильтровать такие строки с помощью функции FILTER для репликата, но так как среди полей есть nullable поля, то сравнение этих значений не работает. А расширять проверкой на null не хочется, из-за ограничений "The maximum size of the filter clause is 5,000 bytes." Фильтр выглядит следующим образом FILTER(@BEFORE (INVENTORY_LOCATION_ID) <> INVENTORY_LOCATION_ID OR @BEFORE (ORGANIZATION_ID) <> ORGANIZATION_ID OR @BEFORE (LAST_UPDATED_BY) <> LAST_UPDATED_BY OR @BEFORE (CREATION_DATE) <> CREATION_DATE OR @BEFORE (CREATED_BY) <> CREATED_BY OR @BEFORE (LAST_UPDATE_LOGIN) <> LAST_UPDATE_LOGIN OR @BEFORE (DESCRIPTION) <> DESCRIPTION OR @BEFORE (DESCRIPTIVE_TEXT) <> DESCRIPTIVE_TEXT OR @BEFORE (DISABLE_DATE) <> DISABLE_DATE OR @BEFORE (INVENTORY_LOCATION_TYPE) <> INVENTORY_LOCATION_TYPE OR @BEFORE (PICKING_ORDER) <> PICKING_ORDER OR @BEFORE (PHYSICAL_LOCATION_CODE) <> PHYSICAL_LOCATION_CODE OR @BEFORE (LOCATION_MAXIMUM_UNITS) <> LOCATION_MAXIMUM_UNITS OR @BEFORE (SUBINVENTORY_CODE) <> SUBINVENTORY_CODE OR @BEFORE (LOCATION_WEIGHT_UOM_CODE) <> LOCATION_WEIGHT_UOM_CODE OR @BEFORE (MAX_WEIGHT) <> MAX_WEIGHT OR @BEFORE (VOLUME_UOM_CODE) <> VOLUME_UOM_CODE OR @BEFORE (MAX_CUBIC_AREA) <> MAX_CUBIC_AREA OR @BEFORE (X_COORDINATE) <> X_COORDINATE OR @BEFORE (Y_COORDINATE) <> Y_COORDINATE OR @BEFORE (Z_COORDINATE) <> Z_COORDINATE OR @BEFORE (INVENTORY_ACCOUNT_ID) <> INVENTORY_ACCOUNT_ID OR @BEFORE (SEGMENT1) <> SEGMENT1 OR @BEFORE (SEGMENT2) <> SEGMENT2 OR @BEFORE (SEGMENT3) <> SEGMENT3 OR @BEFORE (SEGMENT4) <> SEGMENT4 OR @BEFORE (SEGMENT5) <> SEGMENT5 OR @BEFORE (SEGMENT6) <> SEGMENT6 OR @BEFORE (SEGMENT7) <> SEGMENT7 OR @BEFORE (SEGMENT8) <> SEGMENT8 OR @BEFORE (SEGMENT9) <> SEGMENT9 OR @BEFORE (SEGMENT10) <> SEGMENT10 OR @BEFORE (SEGMENT11) <> SEGMENT11 OR @BEFORE (SEGMENT12) <> SEGMENT12 OR @BEFORE (SEGMENT13) <> SEGMENT13 OR @BEFORE (SEGMENT14) <> SEGMENT14 OR @BEFORE (SEGMENT15) <> SEGMENT15 OR @BEFORE (SEGMENT16) <> SEGMENT16 OR @BEFORE (SEGMENT17) <> SEGMENT17 OR @BEFORE (SEGMENT18) <> SEGMENT18 OR @BEFORE (SEGMENT19) <> SEGMENT19 OR @BEFORE (SEGMENT20) <> SEGMENT20 OR @BEFORE (SUMMARY_FLAG) <> SUMMARY_FLAG OR @BEFORE (ENABLED_FLAG) <> ENABLED_FLAG OR @BEFORE (START_DATE_ACTIVE) <> START_DATE_ACTIVE OR @BEFORE (END_DATE_ACTIVE) <> END_DATE_ACTIVE OR @BEFORE (ATTRIBUTE_CATEGORY) <> ATTRIBUTE_CATEGORY OR @BEFORE (ATTRIBUTE1) <> ATTRIBUTE1 OR @BEFORE (ATTRIBUTE2) <> ATTRIBUTE2 OR @BEFORE (ATTRIBUTE3) <> ATTRIBUTE3 OR @BEFORE (ATTRIBUTE4) <> ATTRIBUTE4 OR @BEFORE (ATTRIBUTE5) <> ATTRIBUTE5 OR @BEFORE (ATTRIBUTE6) <> ATTRIBUTE6 OR @BEFORE (ATTRIBUTE7) <> ATTRIBUTE7 OR @BEFORE (ATTRIBUTE8) <> ATTRIBUTE8 OR @BEFORE (ATTRIBUTE9) <> ATTRIBUTE9 OR @BEFORE (ATTRIBUTE10) <> ATTRIBUTE10 OR @BEFORE (ATTRIBUTE11) <> ATTRIBUTE11 OR @BEFORE (ATTRIBUTE12) <> ATTRIBUTE12 OR @BEFORE (ATTRIBUTE13) <> ATTRIBUTE13 OR @BEFORE (ATTRIBUTE14) <> ATTRIBUTE14 OR @BEFORE (ATTRIBUTE15) <> ATTRIBUTE15 OR @BEFORE (REQUEST_ID) <> REQUEST_ID OR @BEFORE (PROGRAM_APPLICATION_ID) <> PROGRAM_APPLICATION_ID OR @BEFORE (PROGRAM_ID) <> PROGRAM_ID OR @BEFORE (PROGRAM_UPDATE_DATE) <> PROGRAM_UPDATE_DATE OR @BEFORE (PROJECT_ID) <> PROJECT_ID OR @BEFORE (TASK_ID) <> TASK_ID OR @BEFORE (PHYSICAL_LOCATION_ID) <> PHYSICAL_LOCATION_ID OR @BEFORE (PICK_UOM_CODE) <> PICK_UOM_CODE OR @BEFORE (DIMENSION_UOM_CODE) <> DIMENSION_UOM_CODE OR @BEFORE (LENGTH) <> LENGTH OR @BEFORE (WIDTH) <> WIDTH OR @BEFORE (HEIGHT) <> HEIGHT OR @BEFORE (LOCATOR_STATUS) <> LOCATOR_STATUS OR @BEFORE (STATUS_ID) <> STATUS_ID OR @BEFORE (CURRENT_CUBIC_AREA) <> CURRENT_CUBIC_AREA OR @BEFORE (AVAILABLE_CUBIC_AREA) <> AVAILABLE_CUBIC_AREA OR @BEFORE (CURRENT_WEIGHT) <> CURRENT_WEIGHT OR @BEFORE (AVAILABLE_WEIGHT) <> AVAILABLE_WEIGHT OR @BEFORE (LOCATION_CURRENT_UNITS) <> LOCATION_CURRENT_UNITS OR @BEFORE (LOCATION_AVAILABLE_UNITS) <> LOCATION_AVAILABLE_UNITS OR @BEFORE (INVENTORY_ITEM_ID) <> INVENTORY_ITEM_ID OR @BEFORE (SUGGESTED_CUBIC_AREA) <> SUGGESTED_CUBIC_AREA OR @BEFORE (SUGGESTED_WEIGHT) <> SUGGESTED_WEIGHT OR @BEFORE (LOCATION_SUGGESTED_UNITS) <> LOCATION_SUGGESTED_UNITS OR @BEFORE (EMPTY_FLAG) <> EMPTY_FLAG OR @BEFORE (MIXED_ITEMS_FLAG) <> MIXED_ITEMS_FLAG OR @BEFORE (DROPPING_ORDER) <> DROPPING_ORDER OR @BEFORE (AVAILABILITY_TYPE) <> AVAILABILITY_TYPE OR @BEFORE (INVENTORY_ATP_CODE) <> INVENTORY_ATP_CODE OR @BEFORE (RESERVABLE_TYPE) <> RESERVABLE_TYPE OR @BEFORE (ALIAS) <> ALIAS OR @BEFORE (AREA_ROW_ID) <> AREA_ROW_ID OR @BEFORE (INV_DOCK_DOOR_ID) <> INV_DOCK_DOOR_ID OR @BEFORE (INV_ORG_ID) <> INV_ORG_ID ) Может есть еще какие-нибудь способы реализации такой фильтрации с помощью OGG? А то таблица с одинаковыми данными на таргете переросла за 3 млрд строк, из которых уникальна по всем полям в лучшем случае треть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 18:12 |
|
||
|
Фильтрация данных в GoldenGate
|
|||
|---|---|---|---|
|
#18+
rzrz, у меня планируется аналогичная задача. Хочу такой вариант: в отдельной табличке хранится набор полей , по которым осуществляется сверка (в виде varchar2/clob). В репликате первая строка вставляет запись. Вторая строка вызывает процедуру, которая через динамический запрос SELECT COUNT(*) FROM (select последняя строка MINUS select предпоследняя) по выбранным полям возвращает 0 или 2. Если 0 , то последнюю строку удаляем. Да, не очень эффективно, на производительность не проверял...но вроде должно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 10:53 |
|
||
|
Фильтрация данных в GoldenGate
|
|||
|---|---|---|---|
|
#18+
GOSP, . у меня сейчас сделано примерно подобный образом. Не устраивает меня время работы процедуры, поэтому и хочу переложить на GG. Было бы здорово сделать это на источнике, но к сожалению это стандартная процедура и править её не разрешают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 13:48 |
|
||
|
|

start [/forum/topic.php?fid=52&gotonew=1&tid=1887020]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 558ms |

| 0 / 0 |
