Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
fortnet,

Имеет ли смысл секционирование уникального индекса?
(в том ответе подспудно имеется в виду и корректировка самих запросов - добавление предикатов с ключами секционирования)
10 фев 17, 12:52    [20200126]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
--Eugene--,

ясно -

у вас идея фикс о локальном уникальном индексе, об уникальности которого знаете только вы.
Иначе говоря, вы путаете высокоселективный индекс с уникальным.
Уникальный индекс для партицированных таблиц всегда должен быть глобальным .
Если это не так - см. пост выше о проблемах вставки.
Поэтому использовать столбец , на котором он построен в связке с другими столбцами для построения локального индекса бессмысленно.
Собственно поэтому и был задан вопрос о примере .
10 фев 17, 14:53    [20200894]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17275
Ну, если только уникальный ключ не является ключем секционирования

И еще раз аффтару: озвучь запросы, для которых ты хочешь создать новый индекс
10 фев 17, 15:02    [20200935]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
Вячеслав Любомудров,
Да, соглашусь, с этими ограничениями можно построить уникальный индекс партицированный.
И да, собственно, зачем эта уникальность?
10 фев 17, 15:14    [20200990]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17275
Не понял
Вот есть у меня куча табличек, которые разбиты по ID (ID в формате дата+sequence -- фиксированной длины) -- я легко делю исторические секции по году/полугоду
И PK работает и архивные секции легко нарезаются
10 фев 17, 15:26    [20201047]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
Вячеслав Любомудров,

именно.

А, уважаемый fortnet, запросы простые. Например:
select * from trades where is_hot = 'Y' and bank_id = :bank_id and trade_id = :trade_id
- оно с локальным индексом, включающим все три колонки (а первые две - ключи секционирования) будет работать на порядки быстрее в данном случае, поскольку используются "горячие данные", коих 5% от всего объема.
И таких запросов (использующих is_hot = 'Y' - более 90% от всей массы).
10 фев 17, 16:32    [20201321]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17275
Я вообще-то против, что в первичный ключ добавлять еще и ключ секционирования, чтоб сделать его индекс локальным
На мой взгляд -- в этом случае лучше глобальный индекс
10 фев 17, 16:36    [20201335]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
Вячеслав Любомудров,

Вот если бы можно было партицировать индекс по колонкам, не перечисленным в нем - это был бы идеальный вариант.
А так я вынужден создавать локальные индексы, поскольку необходимо партицировать их списками..
10 фев 17, 16:54    [20201383]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
--Eugene--
Вячеслав Любомудров,

именно.

А, уважаемый fortnet, запросы простые. Например:
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'
и только с индексом сообразит куда смотреть? Ключ секционирования - это что по вашему?
16 фев 17, 16:58    [20218623]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
fortnet,

прошу прощения, запросы не такие уж и простые, как теперь смотрю..
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
16 фев 17, 18:45    [20219030]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
--Eugene--,

Нет разницы.
Этот запрос не сильно отличается от предыдущего.
Создайте простой локальный (или глобальный партицированный - хотя по запросу не видно, что он нужен) индекс
и смотрите планы. И зачем хинтовать такие простые запросы.
Для данного запроса нужно только, что бы он выбрал требуемую партицию на основе предиката по is_hot in ('Y', :is_hot) ( и возможно подпартицию по bank_id ) и применил к ней локальный индекс для поиска по trade_id . Всё.
Незачем городить огород с уникальностью.
17 фев 17, 10:09    [20220168]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
fortnet
И зачем хинтовать такие простые запросы
Затем что если не хинтовать, оракл сваливается на уникальный (нелокальный) индекс:
+ С хинтом
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.
+ Без хинта
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.
Может показаться, что попугаи те же, только вот на практике с локальным в разы быстрее.
17 фев 17, 12:17    [20220771]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2714
--Eugene--
Может показаться, что попугаи те же, только вот на практике с локальным в разы быстрее.

Ты бы хоть пример придумал, который покажет твое быстрее )
Какой толк от примера на разных наборах данных, да еще с одинаковыми оценками?
17 фев 17, 13:01    [20220960]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
AlexFF__|,

Счего наборы данных разные?
таблица та же
запрос тот же
17 фев 17, 13:23    [20221053]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
--Eugene--,
DDL по таблице приложите. Запутали совсем индексами. Какие , что ... Непонятно ничего.
17 фев 17, 13:50    [20221173]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
fortnet,
+ DDL
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;
17 фев 17, 14:23    [20221354]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
Прошу прощения,
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;
17 фев 17, 14:52    [20221523]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
booby
Member

Откуда:
Сообщений: 1432
--Eugene--
Прошу прощения,
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, BE_ID, HOT_YN) LOCAL;

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

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

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--]Прошу прощения,
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID, [s]BE_ID,[/s] HOT_YN) LOCAL;

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


итог:
CREATE UNIQUE INDEX I4_LOC ON T1(TRADE_ID) LOCAL;
17 фев 17, 15:56    [20221911]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
booby,

знаток..
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
17 фев 17, 16:15    [20221987]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
pihel
Member

Откуда: СПБ
Сообщений: 130
--Eugene--,

если все запросы идут по одной из партиций, то локальный индекс лучше, т.к. локальные индексы будут совсем крошечные и у них будет маленькая высота (blevel)
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
------------------------------ ----------
[b]SYS_C00425187                           1[/b]

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
[b]BE_3                           BE_3_HOT_Y                              0[/b]
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.
17 фев 17, 16:24    [20222015]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
pihel
локальные индексы по горячим данным имеют высоту = 0, глобальный же высоту = 1.
чево?
где тут глобальный индекс вообще?
19 фев 17, 01:54    [20225505]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
pihel
Member

Откуда: СПБ
Сообщений: 130
--Eugene--
pihel
локальные индексы по горячим данным имеют высоту = 0, глобальный же высоту = 1.
чево?
где тут глобальный индекс вообще?


SYS_C00425187 глобальный индекс от TRADE_ID NUMBER PRIMARY KEY,
19 фев 17, 12:20    [20225802]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
fortnet
Member

Откуда:
Сообщений: 518
--Eugene--,

http://www.sql.ru/forum/725353/particii-kak-pravilno-index-local-i-primary-key
20 фев 17, 11:58    [20228015]     Ответить | Цитировать Сообщить модератору
 Re: Порядок расположения колонок составного индекса  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 1999
pihel,

ппц.
до последнего времени считал, что Глобальными могут быть только Партицированные индексы. ан нет
зачем их называть Глобальными, если они Непартицированные и - соответственно - не могут быть локальными??
от ихней номенклатуры голова пухнет.
20 фев 17, 12:06    [20228064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить