Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Долго обновляет данные в секционных таблицах / 11 сообщений из 11, страница 1 из 1
27.08.2018, 21:03
    #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
27.08.2018, 21:05
    #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
27.08.2018, 21:38
    #39694003
tem@
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго обновляет данные в секционных таблицах
AmKadДа уж. С такими партициями только between-ы писать.

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


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

SY.
...
Рейтинг: 0 / 0
28.08.2018, 08:00
    #39694090
-2-
-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
28.08.2018, 11:48
    #39694200
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго обновляет данные в секционных таблицах
Плюс титаническая битва за библиотечный кэш и парсинг, парсинг, парсинг...
Не говоря уже о доступе через непрефиксированный PK (глобальный индекс), который убьет partition pruning.
...
Рейтинг: 0 / 0
29.08.2018, 10:44
    #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
29.08.2018, 10:58
    #39694760
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго обновляет данные в секционных таблицах
tem@Что еще неправильно делаю?Врёшь.
...
Рейтинг: 0 / 0
29.08.2018, 11:11
    #39694768
tem@
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго обновляет данные в секционных таблицах
-2-tem@Что еще неправильно делаю?Врёшь.

В чем ((((( ? Да и вроде все как есть говорю
...
Рейтинг: 0 / 0
29.08.2018, 11:18
    #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
29.08.2018, 11:25
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Долго обновляет данные в секционных таблицах / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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