powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перенос данных
1 сообщений из 1, страница 1 из 1
Перенос данных
    #39692705
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть пустая таблица1:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table table1(a_id            number,      
                    a_id_last_digit number,
                    a_date          date,
                    a_country       varchar2(10),
                    a_sum           number)
  partition by range (a_date) interval (numtoyminterval(1, 'month'))
  subpartition by list (a_country)
  subpartition template (
    subpartition rus values ('rus'), 
    subpartition usa values ('usa'))
  (partition p0  values less than (to_date('2001-01-01', 'yyyy-mm-dd', 'nls_calendar=gregorian')));



Есть таблица2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table table2(a_id            number,
                    a_id_last_digit number,
                    a_date          date,
                    a_country       varchar2(10),
                    a_sum           number)
  partition by list(a_id_last_digit)
(partition p0 values (0)
,partition p1 values (1)
,partition p2 values (2)
,partition p3 values (3)
,partition p4 values (4)
,partition p5 values (5)
,partition p6 values (6)
,partition p7 values (7)
,partition p8 values (8)
,partition p9 values (9));



Добавим тестовые данные в таблицу2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
insert into table2 (a_id,
                    a_id_last_digit,
                    a_date,
                    a_country,
                    a_sum)
SELECT a_id,
       mod(a_id, 10),
       add_months(trunc(sysdate, 'mm'), -round(dbms_random.value(1, 60))),
       'rus',
       round(dbms_random.value(1, 10000))
  from (select round(dbms_random.value(10000000000, 200000000000)) a_id
          from dual
       connect by level < 25000000);



Задача такие по сути данные максимально быстро перетащить из таблицы2 в таблицу1.
Структуру таблицы2 можно менять, кроме того, что на верхнем уровне должна быть разбивка по a_id_last_digit.
Как сам вижу, строим локальный битмап на таблице2 по a_date и дальше в неск. потоков insert append в патиции таблицы1.
Но это геморрой имхо.

ЗЫ изначально задача ускорить загрузку в таблицу1 путем распараллеливания, но бить на потоки по a_date нельзя,
т.к. суммы считаются за все периоды для каждого id (т.е. можно конечно, но эффективность имхо будет немного ниже, если не хуже, т.к. будет много повторных чтений (для каждого месяца надо будет прочитать все предыдущие)).
Поэтому пока предложение распараллелить по id через промежуточную таблицу2, но потом из нее все равно надо все положить в таблицу1 и если это не сделать быстро, то если и будет выигрыш, все сведется на нет. Возможно, есть другие варианты.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перенос данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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