powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание индекса на партиционированной таблице
7 сообщений из 7, страница 1 из 1
Создание индекса на партиционированной таблице
    #39756301
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.
У меня есть таблица с большим количеством записей. В ней было около 100 партиций
Данную таблицу я проапдейтила по всем записям нескольких полей.
В ней был индекс. И перед апдейтом для увеличения скорости я этот индекс удалила.

DDL таблицы выглядил так

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
CREATE TABLE "SCHEMA"."MY_OBJECT" 
   (	"ID" NUMBER(22,0), 
	"ID_OBJECT" NUMBER(22,0) NOT NULL ENABLE, 
	"ID_TEMPLATE_ATTR" NUMBER(22,0) NOT NULL ENABLE, 
	"ID_TEMPLATE_REL" NUMBER(22,0) NOT NULL ENABLE, 
	"GROUP_TYPE" VARCHAR2(64 CHAR), 
	"GROUP_POSITION" NUMBER(22,0) NOT NULL ENABLE, 
	"NVALUE" NUMBER, 
	"CVALUE" VARCHAR2(4000 BYTE), 
	"DVALUE" DATE, 
	"MODIF_TIME" DATE, 
	"CREATE_DATE" DATE
   ) PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SMALL_DATA" 
  
PARTITION BY RANGE ("CREATE_DATE") INTERVAL (NUMTODSINTERVAL(1,'DAY')) STORE IN ("BIG_DATA") 
 (PARTITION "VCT_ATTR_OBJECT"  VALUES LESS THAN (TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) SEGMENT CREATION IMMEDIATE 
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING 
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "BIG_DATA" ) ;

  CREATE INDEX "SCHEMA"."NI_OBJECT" ON "SCHEMA"."MY_OBJECT" ("ID_OBJECT", "ID_TEMPLATE_ATTR", "CREATE_DATE") 
  PCTFREE 0 INITRANS 2 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "LARGE_IDX"  LOCAL
 (PARTITION "VCT_ATTR_OBJECT" 
  PCTFREE 0 INITRANS 2 MAXTRANS 255 LOGGING 
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "BIG_DATA" ) COMPRESS 1 ;



Партиций как я уже сказала сейчас 100 шт. И кроме партиции указанной в DDL (VCT_ATTR_OBJECT) их теперь много с именами
SYS_P74658
SYS_P74659
....

теперь после апдейта я вновь хочу СОЗДАТЬ мой индекс через

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE INDEX "SCHEMA"."NI_OBJECT" ON "SCHEMA"."MY_OBJECT" ("ID_OBJECT", "ID_TEMPLATE_ATTR", "CREATE_DATE") 
  PCTFREE 0 INITRANS 2 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "LARGE_IDX"  LOCAL
 (PARTITION "VCT_ATTR_OBJECT" 
  PCTFREE 0 INITRANS 2 MAXTRANS 255 LOGGING 
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "BIG_DATA" ) COMPRESS 1 ;



выдается ошибка

авторORA-14024: число секций LOCAL индекса и соответствующей таблицы должны совпадать
14024. 00000 - "number of partitions of LOCAL index must equal that of the underlying table"
*Cause: User attempted to create a LOCAL partitioned index with a
number of partitions which is different from that of the
underlying table.
Action: Correct the CREATE INDEX statement to specify a correct
number of partitions

подскажите как мне на уже имеющиеся 100 партиций прописать в запросе создание индекса?
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756303
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя очень интересный подход к указыванию ТП для секций по-умолчанию (как для таблицы, так и индекса), так и собственно определенных секций

Может достаточно просто назначить ТП для всех секций индекса и сказать LOCAL (не перечисляя секции)
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756304
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровУ тебя очень интересный подход к указыванию ТП для секций по-умолчанию (как для таблицы, так и индекса), так и собственно определенных секций

Может достаточно просто назначить ТП для всех секций индекса и сказать LOCAL (не перечисляя секции)

это такой DDL автоматом сгенерился. Система и БД готовая в программном комплексе


>>Может достаточно просто назначить ТП для всех секций индекса и сказать LOCAL

просто не хочется перемудрить и не попортить таблицу. Данные все праздники грузились с эту большую таблицу.

как лучше сделать?
каждой партиции скриптом назначить ТП, а LOCAL где указать нужно?
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756306
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что уж с данными-то случится, они уже в таблице (хуже уже некуда )

Еще раз -- что ты хочешь получить??

Обозвать каждую секцию индекса как-то оригинально и поместить ее в свое отдельно ТП -- формируй скрипт на основании, например, USER_TAB_PARTITIONS
Код: 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.
tst> create table t1(a number) partition by range(a)
  2  (partition p1 values less than (1) tablespace users,
  3   partition p2  values less than (10) tablespace tools);

Table created.

tst> create index t1_idx on t1(a) local
  2  (partition idx_p1 tablespace tools,
  3   partition idx_p2 tablespace users);

Index created.

tst> insert into t1 select rownum-1 from dual connect by level <= 2;

2 rows created.

tst> select segment_name, segment_type, partition_name, tablespace_name from user_segments where segment_name like 'T1%';

SEGMENT_NAME         SEGMENT_TYPE       PARTITION_NAME                 TABLESPACE_NAME
-------------------- ------------------ ------------------------------ ------------------------------
T1_IDX               INDEX PARTITION    IDX_P2                         USERS
T1                   TABLE PARTITION    P1                             USERS
T1_IDX               INDEX PARTITION    IDX_P1                         TOOLS
T1                   TABLE PARTITION    P2                             TOOLS

tst> drop index t1_idx;

Index dropped.



Забить на их названия (пусть называются как секции таблицы) и запихать их в одно ТП -- просто не указывай секции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
tst> create index t1_idx on t1(a) tablespace users local;

Index created.

tst> select segment_name, segment_type, partition_name, tablespace_name from user_segments where segment_name like 'T1%';

SEGMENT_NAME         SEGMENT_TYPE       PARTITION_NAME                 TABLESPACE_NAME
-------------------- ------------------ ------------------------------ ------------------------------
T1_IDX               INDEX PARTITION    P1                             USERS
T1                   TABLE PARTITION    P1                             USERS
T1_IDX               INDEX PARTITION    P2                             USERS
T1                   TABLE PARTITION    P2                             TOOLS

Насколько видно из твоих первоначальных скриптов, только первая секция имела какое-то оригинальное имя и ложилась (вместе с индексом) в ТП BIG_DATA
Все остальные секции именовались автоматом и укладывались в SMALL_DATA и LARGE_IDX

Ну и пусть у тебя будет
Код: plsql
1.
2.
CREATE INDEX "SCHEMA"."NI_OBJECT" ON "SCHEMA"."MY_OBJECT" ("ID_OBJECT", "ID_TEMPLATE_ATTR", "CREATE_DATE") 
  PCTFREE 0 TABLESPACE "LARGE_IDX"  LOCAL

А потом сделаешь REBUILD секции VCT_ATTR_OBJECT в ТП BIG_DATA (если оно вообще надо)
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756311
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга СеменоваВ ней было около 100 партиций

А не перебор ли?
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756378
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку к сказанному Вячеславом, если названия важны, ничто не мешает партиции индекса потом переименовать.
...
Рейтинг: 0 / 0
Создание индекса на партиционированной таблице
    #39756459
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое. Получилось
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание индекса на партиционированной таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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