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

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

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

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

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


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

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

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

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

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


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


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

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

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

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

merge


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

merge


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


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

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


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

боюсь, эксчендж партишн может не подойти...
...
Рейтинг: 0 / 0
Delete и insert в большой таблице
    #39901597
Фотография 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
Delete и insert в большой таблице
    #39901622
Dimets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данной ситуации в приложении, которое читает данные придётся каждый раз генерировать динамически запрос из нужной 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
Delete и insert в большой таблице
    #39901930
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Delete и insert в большой таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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