Запланированные снимки таблицы в оракуле? - PullRequest
1 голос
/ 17 марта 2011

У меня есть таблица, находящаяся в интенсивной рабочей нагрузке, скажем, T1 (около 100 обновлений в секунду, около 300 тыс. Строк)

А во второй таблице T2 я хотел бы обновить строки, основываясь на их состояниив T1 я знаю, что это легко сделать с помощью триггеров, но в моем сценарии триггеры оказывают огромное влияние на производительность и снижают производительность T1 примерно до 10 обновлений в секунду ...

Теперь я создал временную таблицу T3и я ВЫБИРАЮ В него состояние T1, после чего я делаю MERGE INTO T1, ИСПОЛЬЗУЯ T3.

Но все же временная таблица SELECT INTO слишком дорого стоит.мой сценарий без значительного сокращения операций обновления на T1?

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

В общем, у меня возникнут вопросы по поводу модели данных, если вы обнаружите, что регулярно обновляете T2 на основе данных в T1, что звучит как система очень OLTP-типа. Это подразумевает отсутствие нормализации, которая касается. У вас может быть совершенно веская причина иметь отдельную таблицу T2, которая реплицирует некоторые данные в T1 (т.е. вы пытаетесь поддерживать запросы типа DSS с денормализованным объектом в дополнение к запросам типа OLTP с нормализованными объектами) в этом случае было бы полезно понять деловую цель T2.

Если это случай попытки поддержки запросов типа DSS с денормализованным объектом, который объединяет данные из нескольких нормализованных таблиц, моей первой мыслью было бы создать T2 как материализованное представление, а не как таблицу. Ваше материализованное представление может постепенно обновляться через запланированный интервал (оно также может обновляться при фиксации изменений, но, поскольку это происходит синхронно, это может замедлить вставку сеансов). Вам потребуются материализованные журналы представлений в базовых таблицах, которые добавят некоторые накладные расходы к операциям DML, но это будет меньше, чем накладные расходы для триггера, особенно если каждое обновление обновляет 300-рядные строки (при условии, что 300k - это число строки обновляются для 100 обновлений в секунду).

Вы также можете использовать потоки для поддержки T2. Это существенно устранит накладные расходы на отслеживание изменений в операциях DML, потому что Streams просто читает данные повтора. Вам придется включить дополнительное ведение журнала, если оно еще не включено, что может незначительно увеличить объем данных, записываемых для восстановления, но маловероятно, что это будет заметно. Однако для настройки потоков будет немного больше работы - вам нужно написать собственный обработчик применения, который будет принимать изменения из T1 и обновлять T2. И T2 всегда будет отставать от T1 хотя бы на несколько секунд.

0 голосов
/ 17 марта 2011

Если вы заинтересованы в измененных данных и не хотите, чтобы триггер регистрировал их, взгляните на Change Data Capture, Streams или, возможно, Golden Gate.Может все представить вам записи логических изменений.Для этого вы читаете редолог и не мешаете процессам переднего плана, нажимая на них триггером.Другим вариантом может быть очень хороший взгляд на ваши столы и посмотреть, сможете ли вы их переставить.Как только вы можете определить большую часть таблицы как историческую (и статическую), у вас появляется гораздо больше возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...