|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Есть большая таблица около 500 млн записей вида: CREATE TABLE SEGMENTS (LOAD_DTTM DATE, CD VARCHAR2(30 BYTE), AP NUMBER(18,3), CHAR_PARAM_1 VARCHAR2(200 CHAR), CHAR_PARAM_2 VARCHAR2(200 CHAR), CHAR_PARAM_3 VARCHAR2(200 CHAR), CHAR_PARAM_4 VARCHAR2(200 CHAR), CHAR_PARAM_5 VARCHAR2(200 CHAR), NUM_PARAM_1 NUMBER, NUM_PARAM_2 NUMBER, NUM_PARAM_3 NUMBER, NUM_PARAM_4 NUMBER, NUM_PARAM_5 NUMBER); и индекс на ней CREATE INDEX SEGMENTS$AP_CD ON SEGMENTS (AP, CD); Независимые друг от друга процессы обновляют в течении дня данные в этой таблице. Обновление в рамках каждого процесса идет по одному CD. Обновление происходит в рамках одной транзакции: сначала идет DELETE FROM SEGMENTS WHERE CD='AAA' затем INSERT для CD='AAA' и потом COMMIT. Количество записей для одной транзакции (одного значения CD) разное и колеблется от сотен тысяч записей до десятков миллионов. В один момент времени может работать несколько процедур обновления по разным значениям CD. К таблице идут постоянные запросы со стороны приложения по связкам CD+AP или просто по AP, до сотен в секунду, т.е. таблица должна быть всегда доступна. За одни сутки в целом обновляются все записи в таблице. Каким образом можно ускорить процесс обновления данных, т.к. на текущий момент идет прирост количества записей и скорость обновления уже становится достаточно долгой. Есть мысль сделать партиционирование по CD и в рамках обновления работать только с конкретной партицией, но возникает вопрос доступности данных, если делать truncate partition то пока не пройдет insert фактически приложение не сможет работать с этим куском данных и непонятно как быть с индексом... Кроме обновления существующих данных, возможно появление новых пачек записей с новым CD. ORACLE 12c, какие есть гениальные мысли? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:27 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets сначала идет DELETE FROM SEGMENTS WHERE CD='AAA' затем INSERT для CD='AAA' и потом COMMIT. какие есть гениальные мысли? :-) использовать update :D ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:40 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Надфиль Dimets сначала идет DELETE FROM SEGMENTS WHERE CD='AAA' затем INSERT для CD='AAA' и потом COMMIT. какие есть гениальные мысли? :-) использовать update :D не подходит, данные меняются ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:44 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets не подходит, данные меняются а апдейт для чего? напомни ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:48 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Надфиль Dimets не подходит, данные меняются а апдейт для чего? напомни обновляются в смысле меняются связки AP в привязке к CD, сохраняются/добавляются/удаляются AP ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:51 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
замени удаление на "пометку на удаление" флажком каким нибудь. потом пересоздавай табличку когда окошко есть.... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 20:52 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Надфиль замени удаление на "пометку на удаление" флажком каким нибудь. потом пересоздавай табличку когда окошко есть.... а чем update будет быстрее идти? и табличке обращение идет 24х7 за чтением данных ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:11 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets а чем update будет быстрее идти? и табличке обращение идет 24х7 за чтением данных ну думаю раз в 10 быстрей будет. апдейт данных вместо удаления и вставки.. хотя варианты конечно возможны. индексы/триггеры и прочее... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:12 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:16 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:23 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
iOracleDev единственно, merge не удалит ненужные записи, которых нет во временной табличке, но есть в исходной, а это нужно ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:40 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
сколько уникальных CD и AP? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:46 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
кит северных морей сколько уникальных CD и AP? непредсказуемо, постоянно появляются новые CD, в целом AP уникальных около 100 млн, AP меняются между CD и могут входить в несколько CD ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:49 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
кит северных морей сколько уникальных CD и AP? сейчас уникальных CD около 100 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:50 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets сейчас уникальных CD около 100 будет быстро, но не смасштабируется до ситуации, когда CD станет миллион. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 21:58 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
кит северных морей Dimets сейчас уникальных CD около 100 будет быстро, но не смасштабируется до ситуации, когда CD станет миллион. ок, хорошая мысль, CD нет станет миллион, от силы сотни ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2019, 22:10 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets К таблице идут постоянные запросы со стороны приложения по связкам CD+AP или просто по AP, до сотен в секунду боюсь, эксчендж партишн может не подойти... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 02:22 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
проходил мимо... боюсь, эксчендж партишн может не подойти... Эксчендж нет, но при наличии достаточного дискового пространства в таблицу добавляется поле типа timespamp по которому cоздаютcя subpartitions. Кроме того создается тaблица-карта subpartitions. Транзакции обновлeния просто создают subpartition в который заливают данные и обновляют соответствующую запись в тaблицe-картe. Транзакции чтения находят из тaблицы-карты текущий subpartition для данного CD и работают только с этим subpartition. В определенное врямя выполняется garbage collector удаляющий уже ненужные subpartitions. Такая архитектура очень ускоряет процесс чтения так как исчезают очень существенные накладные расходы на чтение UNDO. Ну и желательно отказаться от global indexes. SY. P.S. Да, в поле типа timespamp пишем значения в UTC чтобы не нарываться/заморачиватся с DST. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 05:22 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
В данной ситуации в приложении, которое читает данные придётся каждый раз генерировать динамически запрос из нужной subpartition, возможность внесения изменений в код приложения, к сожалению, отсутствует, т.к. это вендорское решение. Кроме того, от global index не получится скорее всего отказаться, т.к. часть запросов идёт просто по AP без конкретного CD по всей таблице целиком. SY проходил мимо... боюсь, эксчендж партишн может не подойти... Эксчендж нет, но при наличии достаточного дискового пространства в таблицу добавляется поле типа timespamp по которому cоздаютcя subpartitions. Кроме того создается тaблица-карта subpartitions. Транзакции обновлeния просто создают subpartition в который заливают данные и обновляют соответствующую запись в тaблицe-картe. Транзакции чтения находят из тaблицы-карты текущий subpartition для данного CD и работают только с этим subpartition. В определенное врямя выполняется garbage collector удаляющий уже ненужные subpartitions. Такая архитектура очень ускоряет процесс чтения так как исчезают очень существенные накладные расходы на чтение UNDO. Ну и желательно отказаться от global indexes. SY. P.S. Да, в поле типа timespamp пишем значения в UTC чтобы не нарываться/заморачиватся с DST. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 07:44 |
|
Delete и insert в большой таблице
|
|||
---|---|---|---|
#18+
Dimets В данной ситуации в приложении, которое читает данные придётся каждый раз генерировать динамически запрос из нужной subpartition Зачем? Как уже было сказано "Транзакции чтения находят из тaблицы-карты текущий subpartition для данного CD и работают только с этим subpartition": Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Dimets Кроме того, от global index не получится скорее всего отказаться, т.к. часть запросов идёт просто по AP без конкретного CD по всей таблице целиком. Global index не помеха - используем UPDATE GLOBAL INDEXES. Просто это накладные расходы. А "часть запросов идёт просто по AP без конкретного CD" преобразуется в: Код: plsql 1.
Dimets возможность внесения изменений в код приложения, к сожалению, отсутствует, т.к. это вендорское решение. Ну тогда при согласии вендора все тоже только без партицирования + RLS. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:25 |
|
|
start [/forum/topic.php?fid=52&fpage=58&tid=1881755]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 187ms |
0 / 0 |