powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Долго обновляет данные в секционных таблицах
11 сообщений из 11, страница 1 из 1
Долго обновляет данные в секционных таблицах
    #39693977
tem@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите понять в чем дело, при апдейте данных в секциях,
например update 30-40тыс строк, из 1 млн в секции, запрос обрабатывается около 3-6 минут,
причем время всегда разное
Таблицы, разбиты на секции вот таким методом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE uslugi (
  ID_us   VARCHAR2(25 BYTE),
  Name_us   VARCHAR2(250 BYTE),
  Period VARCHAR2(6 BYTE),	
CONSTRAINT PK_uslugi PRIMARY KEY (ID_US, PERIOD) USING INDEX TABLESPACE MY_TABSPACE STORAGE (INITIAL 64 K                                                                                         MAXEXTENTS UNLIMITED)
)

PARTITION BY LIST (PERIOD)
(
PARTITION U012018 VALUES ('012018'),
PARTITION U022018 VALUES ('022018'),
PARTITION U032018 VALUES ('032018'),
PARTITION U042018 VALUES ('042018'),
и тд

и индексами, пример
CREATE INDEX us_idx ON uslugi (PERIOD) LOCAL
(
PARTITION U012018 TABLESPACE MY_TABSPACE,
и тд.



в каждой секции примерно 1млн записей, дополнительных индексов по полю period нет
вот пример апдейта строк на клиенте
Код: plsql
1.
2.
3.
4.
5.
UPDATE uslugi PARTITION(U022018)
   SET Name_us  = 'New name'
WHERE ID_us = '123'

и в конце уже коммит 



Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39693980
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tem@
Код: plsql
1.
2.
3.
4.
PARTITION U012018 VALUES ('012018'),
PARTITION U022018 VALUES ('022018'),
PARTITION U032018 VALUES ('032018'),
PARTITION U042018 VALUES ('042018'),

Да уж. С такими партициями только between-ы писать.
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694003
tem@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadДа уж. С такими партициями только between-ы писать.

А чем плох данный метод разбиения на секции?
Мне нужно чтоб именно по периоду 012018-122018 были секции
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694045
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tem@А чем плох данный метод разбиения на секции?


Ну попробуй выбрать например все за 2015, 2016 и 2017 год и подумай насколько легче было бы PERIOD = 'YYYYMM'. А потом подумай почему было бы еще лучше если бы PERIOD был бы не VARCHAR2 а DATE, и partitioning был бы не LIST а RANGE с INTERVAL 1 месяц.

SY.
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694090
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tem@пример апдейта строк на клиенте
Код: plsql
1.
2.
3.
4.
5.
UPDATE uslugi PARTITION(U022018)
   SET Name_us  = 'New name'
WHERE ID_us = '123'

и в конце уже коммит 

построчный апдейт 30 тысяч строк это 60 тысяч обменов клиентов-сервер. Сетевая латенция может составлять пару миллисекунд, что в сумме даст пару минут только на сетевой обмен. А ведь еще и коммит!
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694200
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюс титаническая битва за библиотечный кэш и парсинг, парсинг, парсинг...
Не говоря уже о доступе через непрефиксированный PK (глобальный индекс), который убьет partition pruning.
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694749
tem@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал таблицы под секции:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE uslugi (
  ID_us   VARCHAR2(25 BYTE),
  Name_us   VARCHAR2(250 BYTE),
  Period VARCHAR2(6 BYTE)
)

PARTITION BY RANGE (PERIOD)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION U012018 VALUES LESS THAN (TO_DATE('01.01.2018', 'dd.mm.YYYY')),
PARTITION U022018 VALUES LESS THAN (TO_DATE('01.02.2018', 'dd.mm.YYYY')),
и тд

CREATE INDEX us_idx ON uslugi (PERIOD) LOCAL
(
PARTITION U012018 TABLESPACE MY_TABSPACE,
и тд.



Убрал первичный ключ, скорость записи в таблицу увеличилась, но тут вопрос уже в другом, при добавлении в первую секцию данные добавляются быстро, при последующем добавлении в другую секцию данные добавляются уже в 1,5 раза дольше, затем в 3 раза дольше, почему так? Что еще неправильно делаю?
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694760
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tem@Что еще неправильно делаю?Врёшь.
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694768
tem@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-tem@Что еще неправильно делаю?Врёшь.

В чем ((((( ? Да и вроде все как есть говорю
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694775
Sheldon Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tem@-2-пропущено...
Врёшь.

В чем ((((( ? Да и вроде все как есть говорю

tem@,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 
SQL> 
SQL> CREATE TABLE uslugi (
  2    ID_us   VARCHAR2(25 BYTE),
  3    Name_us   VARCHAR2(250 BYTE),
  4    Period VARCHAR2(6 BYTE)
  5  )
  6  PARTITION BY RANGE (PERIOD)
  7  INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
  8  (
  9  PARTITION U012018 VALUES LESS THAN (TO_DATE('01.01.2018', 'dd.mm.YYYY')),
 10  PARTITION U022018 VALUES LESS THAN (TO_DATE('01.02.2018', 'dd.mm.YYYY'))
 11  )
 12  /
CREATE TABLE uslugi (
  ID_us   VARCHAR2(25 BYTE),
  Name_us   VARCHAR2(250 BYTE),
  Period VARCHAR2(6 BYTE)
)
PARTITION BY RANGE (PERIOD)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION U012018 VALUES LESS THAN (TO_DATE('01.01.2018', 'dd.mm.YYYY')),
PARTITION U022018 VALUES LESS THAN (TO_DATE('01.02.2018', 'dd.mm.YYYY'))
)
ORA-14751: Недопустимый тип данных для секционирования столбца таблицы, секционированной по интервалам

SQL> 
...
Рейтинг: 0 / 0
Долго обновляет данные в секционных таблицах
    #39694783
tem@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, не увидел когда копировал, сейчас поле в таблице тип - DATE
Код: plsql
1.
2.
3.
4.
CREATE TABLE uslugi (
  ID_us   VARCHAR2(25 BYTE),
  Name_us   VARCHAR2(250 BYTE),
  Period    DATE)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Долго обновляет данные в секционных таблицах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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