Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Delete и insert в большой таблице / 20 сообщений из 20, страница 1 из 1
11.12.2019, 20:27
    #39901491
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Есть большая таблица около 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, какие есть гениальные мысли? :-)
...
Рейтинг: 0 / 0
11.12.2019, 20:40
    #39901498
Надфиль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets
сначала идет DELETE FROM SEGMENTS WHERE CD='AAA' затем INSERT для CD='AAA' и потом COMMIT.

какие есть гениальные мысли? :-)

использовать update :D
...
Рейтинг: 0 / 0
11.12.2019, 20:44
    #39901500
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Надфиль
Dimets
сначала идет DELETE FROM SEGMENTS WHERE CD='AAA' затем INSERT для CD='AAA' и потом COMMIT.

какие есть гениальные мысли? :-)

использовать update :D


не подходит, данные меняются
...
Рейтинг: 0 / 0
11.12.2019, 20:48
    #39901503
Надфиль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets

не подходит, данные меняются

а апдейт для чего? напомни
...
Рейтинг: 0 / 0
11.12.2019, 20:51
    #39901504
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Надфиль
Dimets

не подходит, данные меняются

а апдейт для чего? напомни


обновляются в смысле меняются связки AP в привязке к CD, сохраняются/добавляются/удаляются AP
...
Рейтинг: 0 / 0
11.12.2019, 20:52
    #39901506
Надфиль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
замени удаление на "пометку на удаление" флажком каким нибудь.
потом пересоздавай табличку когда окошко есть....
...
Рейтинг: 0 / 0
11.12.2019, 21:11
    #39901510
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Надфиль
замени удаление на "пометку на удаление" флажком каким нибудь.
потом пересоздавай табличку когда окошко есть....


а чем update будет быстрее идти? и табличке обращение идет 24х7 за чтением данных
...
Рейтинг: 0 / 0
11.12.2019, 21:12
    #39901511
Надфиль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets

а чем update будет быстрее идти? и табличке обращение идет 24х7 за чтением данных

ну думаю раз в 10 быстрей будет. апдейт данных вместо удаления и вставки.. хотя варианты конечно возможны. индексы/триггеры и прочее...
...
Рейтинг: 0 / 0
11.12.2019, 21:16
    #39901512
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets,

merge
...
Рейтинг: 0 / 0
11.12.2019, 21:23
    #39901514
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
iOracleDev
Dimets,

merge


спасибо, покурим эту тему)
...
Рейтинг: 0 / 0
11.12.2019, 21:40
    #39901520
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
iOracleDev
Dimets,

merge


единственно, merge не удалит ненужные записи, которых нет во временной табличке, но есть в исходной, а это нужно
...
Рейтинг: 0 / 0
11.12.2019, 21:46
    #39901523
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
сколько уникальных CD и AP?
...
Рейтинг: 0 / 0
11.12.2019, 21:49
    #39901525
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
кит северных морей
сколько уникальных CD и AP?


непредсказуемо, постоянно появляются новые CD, в целом AP уникальных около 100 млн, AP меняются между CD и могут входить в несколько CD
...
Рейтинг: 0 / 0
11.12.2019, 21:50
    #39901527
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
кит северных морей
сколько уникальных CD и AP?

сейчас уникальных CD около 100
...
Рейтинг: 0 / 0
11.12.2019, 21:58
    #39901532
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets
сейчас уникальных CD около 100
можно сделать partition by list(cd), обновление через insert-select в промежуточную таблицу с последующим exchange partition. над locality индекса надо подумать.
будет быстро, но не смасштабируется до ситуации, когда CD станет миллион.
...
Рейтинг: 0 / 0
11.12.2019, 22:10
    #39901534
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
кит северных морей
Dimets
сейчас уникальных CD около 100
можно сделать partition by list(cd), обновление через insert-select в промежуточную таблицу с последующим exchange partition. над locality индекса надо подумать.
будет быстро, но не смасштабируется до ситуации, когда CD станет миллион.


ок, хорошая мысль, CD нет станет миллион, от силы сотни
...
Рейтинг: 0 / 0
12.12.2019, 02:22
    #39901585
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets
К таблице идут постоянные запросы со стороны приложения по связкам CD+AP или просто по AP, до сотен в секунду

боюсь, эксчендж партишн может не подойти...
...
Рейтинг: 0 / 0
12.12.2019, 05:22
    #39901597
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
проходил мимо...

боюсь, эксчендж партишн может не подойти...


Эксчендж нет, но при наличии достаточного дискового пространства в таблицу добавляется поле типа 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.
...
Рейтинг: 0 / 0
12.12.2019, 07:44
    #39901622
Dimets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
В данной ситуации в приложении, которое читает данные придётся каждый раз генерировать динамически запрос из нужной 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.
...
Рейтинг: 0 / 0
12.12.2019, 15:25
    #39901930
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и insert в большой таблице
Dimets
В данной ситуации в приложении, которое читает данные придётся каждый раз генерировать динамически запрос из нужной subpartition


Зачем? Как уже было сказано "Транзакции чтения находят из тaблицы-карты текущий subpartition для данного CD и работают только с этим subpartition":

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
VARIABLE LOAD_DTTM_STR VARCHAR2(30)
BEGIN
    SELECT  TO_CHAR(LOAD_DTTM,'YYYY/MM/DD HH24:MI:SS')
      INTO  :LOAD_DTTM_STR
      FROM  SEGMENT_MAP
      WHERE CD = 'SOME CD';
END;
/
SELECT  *
  FROM  SEGMENTS
  WHERE CD = 'SOME CD'
    AND LOAD_DTTM = TO_DATE(:LOAD_DTTM_STR,'YYYY/MM/DD HH24:MI:SS')
/



Dimets

Кроме того, от global index не получится скорее всего отказаться, т.к. часть запросов идёт просто по AP без конкретного CD по всей таблице целиком.



Global index не помеха - используем UPDATE GLOBAL INDEXES. Просто это накладные расходы. А "часть запросов идёт просто по AP без конкретного CD" преобразуется в:

Код: plsql
1.
WHERE (LOAD_DTTM,CD) IN (SELECT LOAD_DTTM,CD FROM SEGMENT_MAP)



Dimets
возможность внесения изменений в код приложения, к сожалению, отсутствует, т.к. это вендорское решение.


Ну тогда при согласии вендора все тоже только без партицирования + RLS.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Delete и insert в большой таблице / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]