powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок расположения колонок составного индекса
24 сообщений из 49, страница 2 из 2
Порядок расположения колонок составного индекса
    #39402249
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnet,

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

ясно -

у вас идея фикс о локальном уникальном индексе, об уникальности которого знаете только вы.
Иначе говоря, вы путаете высокоселективный индекс с уникальным.
Уникальный индекс для партицированных таблиц всегда должен быть глобальным .
Если это не так - см. пост выше о проблемах вставки.
Поэтому использовать столбец , на котором он построен в связке с другими столбцами для построения локального индекса бессмысленно.
Собственно поэтому и был задан вопрос о примере .
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402332
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если только уникальный ключ не является ключем секционирования

И еще раз аффтару: озвучь запросы, для которых ты хочешь создать новый индекс
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402337
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,
Да, соглашусь, с этими ограничениями можно построить уникальный индекс партицированный.
И да, собственно, зачем эта уникальность?
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402342
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял
Вот есть у меня куча табличек, которые разбиты по ID (ID в формате дата+sequence -- фиксированной длины) -- я легко делю исторические секции по году/полугоду
И PK работает и архивные секции легко нарезаются
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402384
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

именно.

А, уважаемый fortnet, запросы простые. Например:
Код: plsql
1.
select * from trades where is_hot = 'Y' and bank_id = :bank_id and trade_id = :trade_id

- оно с локальным индексом, включающим все три колонки (а первые две - ключи секционирования) будет работать на порядки быстрее в данном случае, поскольку используются "горячие данные", коих 5% от всего объема.
И таких запросов (использующих is_hot = 'Y' - более 90% от всей массы).
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402387
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще-то против, что в первичный ключ добавлять еще и ключ секционирования, чтоб сделать его индекс локальным
На мой взгляд -- в этом случае лучше глобальный индекс
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39402393
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Вот если бы можно было партицировать индекс по колонкам, не перечисленным в нем - это был бы идеальный вариант.
А так я вынужден создавать локальные индексы, поскольку необходимо партицировать их списками..
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39405955
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Вячеслав Любомудров,

именно.

А, уважаемый fortnet, запросы простые. Например:
Код: plsql
1.
select * from trades where is_hot = 'Y' and bank_id = :bank_id and trade_id = :trade_id

- оно с локальным индексом, включающим все три колонки (а первые две - ключи секционирования) будет работать на порядки быстрее в данном случае, поскольку используются "горячие данные", коих 5% от всего объема.
И таких запросов (использующих is_hot = 'Y' - более 90% от всей массы).

А oracle , конечно, без индекса по is_hot будет по всем партициям лазить, даже прочитав условие в предикате is_hot = 'Y'
и только с индексом сообразит куда смотреть? Ключ секционирования - это что по вашему?
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406076
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnet,

прошу прощения, запросы не такие уж и простые, как теперь смотрю..
Код: plsql
1.
select /*+index(t my_local_index)*/ * from trades t where is_hot in ('Y', :is_hot) and bank_id = :bank_id and trade_id = :trade_id
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406339
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Нет разницы.
Этот запрос не сильно отличается от предыдущего.
Создайте простой локальный (или глобальный партицированный - хотя по запросу не видно, что он нужен) индекс
и смотрите планы. И зачем хинтовать такие простые запросы.
Для данного запроса нужно только, что бы он выбрал требуемую партицию на основе предиката по is_hot in ('Y', :is_hot) ( и возможно подпартицию по bank_id ) и применил к ней локальный индекс для поиска по trade_id . Всё.
Незачем городить огород с уникальностью.
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406461
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnetИ зачем хинтовать такие простые запросыЗатем что если не хинтовать, оракл сваливается на уникальный (нелокальный) индекс:
С хинтом
Код: plaintext
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.
SANDBOX@devbox>;explain plan for
  2  select /*+index(t1 i4_loc)*/ *
  3      from t1
  4      where be_id = :v_be_id
  5          and hot_yn in ('Y', :v_hot_yn)
  6          and trade_id = :v_trade_id;

Explained.

SANDBOX@devbox>;select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 1581337439

--------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |        |     1 |    11 |     3   (0)| 00:00:01 |       |       |
|   1 |  PARTITION LIST SINGLE              |        |     1 |    11 |     3   (0)| 00:00:01 |   KEY |   KEY |
|   2 |   PARTITION LIST SINGLE             |        |     1 |    11 |     3   (0)| 00:00:01 |   KEY |   KEY |
|   3 |    TABLE ACCESS BY LOCAL INDEX ROWID| T1     |     1 |    11 |     3   (0)| 00:00:01 |   KEY |   KEY |
|*  4 |     INDEX UNIQUE SCAN               | I4_LOC |     1 |       |     2   (0)| 00:00:01 |   KEY |   KEY |
--------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("HOT_YN"=:V_HOT_YN AND "TRADE_ID"=TO_NUMBER(:V_TRADE_ID) AND
              "BE_ID"=TO_NUMBER(:V_BE_ID))

17 rows selected.
Без хинта
Код: plaintext
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.
SANDBOX@devbox>;explain plan for
  2  select *
  3      from t1
  4      where be_id = :v_be_id
  5          and hot_yn in ('Y', :v_hot_yn)
  6          and trade_id = :v_trade_id;

Explained.

SANDBOX@devbox>;select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------
Plan hash value: 874832600

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |     1 |    11 |     3   (0)| 00:00:01 |       |       |
|*  1 |  TABLE ACCESS BY GLOBAL INDEX ROWID| T1            |     1 |    11 |     3   (0)| 00:00:01 | ROWID | ROWID |
|*  2 |   INDEX UNIQUE SCAN                | SYS_C00146066 |     1 |       |     2   (0)| 00:00:01 |       |       |
--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("BE_ID"=TO_NUMBER(:V_BE_ID) AND ("HOT_YN"=:V_HOT_YN OR "HOT_YN"='Y'))
   2 - access("TRADE_ID"=TO_NUMBER(:V_TRADE_ID))

15 rows selected.
Может показаться, что попугаи те же, только вот на практике с локальным в разы быстрее.
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406510
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Может показаться, что попугаи те же, только вот на практике с локальным в разы быстрее.
Ты бы хоть пример придумал, который покажет твое быстрее )
Какой толк от примера на разных наборах данных, да еще с одинаковыми оценками?
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406541
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,

Счего наборы данных разные?
таблица та же
запрос тот же
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406580
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,
DDL по таблице приложите. Запутали совсем индексами. Какие , что ... Непонятно ничего.
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406614
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnet,
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.
CREATE TABLE T1 (
BE_ID NUMBER NOT NULL,
HOT_YN CHAR(1) DEFAULT 'Y' NOT NULL CHECK (HOT_YN IN ('Y', 'N')),
TRADE_ID NUMBER PRIMARY KEY,
DUMMY01 CHAR(2000),
DUMMY02 CHAR(2000),
...
DUMMY50 CHAR(2000)
)
PARTITION BY LIST (BE_ID)
SUBPARTITION BY LIST (HOT_YN)
(  
  PARTITION BE_1 VALUES (1)
  ( SUBPARTITION BE_1_HOT_Y VALUES ('Y'),
    SUBPARTITION BE_1_HOT_N VALUES ('N') ),
  PARTITION BE_2 VALUES (2)
  ( SUBPARTITION BE_2_HOT_Y VALUES ('Y'),
    SUBPARTITION BE_2_HOT_N VALUES ('N') ),
...
  PARTITION BE_10 VALUES (10)
  ( SUBPARTITION BE_10_HOT_Y VALUES ('Y'),
    SUBPARTITION BE_10_HOT_N VALUES ('N') ),
  PARTITION BE_DEFAULT VALUES (DEFAULT)
  ( SUBPARTITION BE_DEFAULT_HOT_Y VALUES ('Y'),
    SUBPARTITION BE_DEFAULT_HOT_N VALUES ('N') )
)
ENABLE ROW MOVEMENT;

CREATE UNIQUE INDEX I4_LOC ON T1(BE_ID, HOT_YN, TRADE_ID) LOCAL;

...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406657
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения,
Код: plsql
1.
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406739
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Прошу прощения,
Код: plsql
1.
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;


при вашем способе разбиения таблицы, чепуха какая-то, имхо.

(никогда не имев дела с партиционированием, планируя локальный индекс,
я скромно делил бы) условия в запросе сорта

Код: plsql
1.
2.
3.
4.
5.
6.
SANDBOX@devbox>;explain plan for
  2  select *
  3      from t1
  4      where be_id = :v_be_id
  5          and hot_yn in ('Y', :v_hot_yn)
  6          and trade_id = :v_trade_id;



на такие, с которыми работаем механизм выбора партиции и такие, с которыми работает локальный индекс
у вас в одно ведущей партиции не более одного значения be_id - значит это условие для механизма выбора раздела:

[quot --Eugene--]Прошу прощения,
Код: plsql
1.
2.
3.
4.
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;

далее, внутри подраздела hot_yn его значение тоже не меняется, поэтому:
[SRC oracle]CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;



итог:
Код: plsql
1.
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID) LOCAL;
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406755
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

знаток..
Код: plaintext
1.
2.
3.
4.
SANDBOX@devbox>;CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID) LOCAL;
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID) LOCAL
                              *
ERROR at line 1:
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39406760
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--,

если все запросы идут по одной из партиций, то локальный индекс лучше, т.к. локальные индексы будут совсем крошечные и у них будет маленькая высота (blevel)
Код: 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.
insert into T1(BE_ID, HOT_YN, TRADE_ID, DUMMY01, DUMMY02, DUMMY50)
select mod(rownum,3) as BE_ID, case when rownum > 1000000 - 1000 then 'Y' ELSE 'N' END as HOT_YN, rownum as TRADE_ID, rpad('*', 10) as DUMMY01, rpad('*', 20) as DUMMY02, rpad('*', 30) as DUMMY50 
from (select * from dual connect by level <= 1000)
cross join (select * from dual connect by level <= 1000);

CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;

begin
SYS.DBMS_STATS.GATHER_TABLE_STATS(user, 'T1', cascade => true, ESTIMATE_PERCENT=>100);
end;

select index_name, blevel from dba_indexes where table_name = 'T1';

INDEX_NAME                         BLEVEL
------------------------------ ----------
SYS_C00425187                           1

select partition_name, subpartition_name, blevel from DBA_IND_SUBPARTITIONS where index_name = 'I4_LOC'
PARTITION_NAME                 SUBPARTITION_NAME                  BLEVEL
------------------------------ ------------------------------ ----------
BE_DEFAULT                     BE_DEFAULT_HOT_N                        1
BE_DEFAULT                     BE_DEFAULT_HOT_Y                        0
BE_3                           BE_3_HOT_N                              0
BE_3                           BE_3_HOT_Y                              0
BE_2                           BE_2_HOT_N                              1
BE_2                           BE_2_HOT_Y                              0
BE_1                           BE_1_HOT_N                              1
BE_1                           BE_1_HOT_Y                              0


локальные индексы по горячим данным имеют высоту = 0, глобальный же высоту = 1.
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39407351
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihelлокальные индексы по горячим данным имеют высоту = 0, глобальный же высоту = 1.чево?
где тут глобальный индекс вообще?
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39407402
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--pihelлокальные индексы по горячим данным имеют высоту = 0, глобальный же высоту = 1.чево?
где тут глобальный индекс вообще?

SYS_C00425187 глобальный индекс от TRADE_ID NUMBER PRIMARY KEY,
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39407724
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Порядок расположения колонок составного индекса
    #39407728
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihel,

ппц.
до последнего времени считал, что Глобальными могут быть только Партицированные индексы. ан нет
зачем их называть Глобальными, если они Непартицированные и - соответственно - не могут быть локальными??
от ихней номенклатуры голова пухнет.
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок расположения колонок составного индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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