В предишната статия научихме за разделената таблица на Oracle. В продължение на тази серия тук ще представя индекса на дяловете на Oracle
Ето някои от фактите за разбирането на разделените индекси
Индекси на локални дялове
- Създава се локален индекс на разделена таблица, където индексът е разделен по точно същия начин като основната разделена таблица. Тоест, локалният индекс наследява метода на разделяне на таблицата. Това е известно като равноразделно разделяне.
- За локални индекси, индексните ключове в индекса ще се отнасят само до редовете, съхранени в единичния подлежащ дял на таблица. Локален индекс се създава чрез посочване на атрибут LOCAL и може да бъде създаден като UNIQUE или NON-UNIQUE.
- Таблицата и локалният индекс са или разделени по абсолютно същия начин, или имат един и същ ключ на дял, тъй като локалните индекси се поддържат автоматично, могат да предложат по-висока наличност.
- Тъй като базата данни на Oracle гарантира, че индексните дялове са синхронизирани със съответните им дялове на таблици, от това следва, че базата данни автоматично поддържа индексния дял всеки път, когато се извършва някаква операция по поддръжка на основните таблици.
- например, когато се добавят, изпускат или обединяват дялове.
- Локален индекс е с префикс, ако ключът на дяла на таблицата и ключът на индекса са еднакви; в противен случай това е локален индекс без префикс
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id) LOCAL (partition test_idx_1, partition test_idx_2, partition test_idx_3, partition test_idx_4); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='TEST_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS --------- ----------- ------ TEST_IDX IX_TEST_IDX_1 USABLE TEST_IDX IX_TEST_IDX_2 USABLE TEST_IDX IX_TEST_IDX_3 USABLE TEST_IDX IX_TEST_IDX_4 USABLE
Глобални разделени индекси
- Глобалният разделен индекс е индекс на разделена или неразделена таблица, която е разделена независимо, т.е. използвайки различен ключ за разделяне от таблицата. Глобално разделените индекси могат да бъдат разделени на диапазон или хеш. Глобално разделените индекси са по-трудни за поддържане от локалните индекси. Те обаче предлагат по-ефективен метод за достъп до всеки отделен запис.
- По време на взаимодействие с таблица или индекс по време на поддръжка на дял, всички дялове в глобален индекс ще бъдат засегнати.
- Когато в основния дял на таблицата има извършени операции по поддръжка на РАЗДЕЛЯНЕ, ПРЕМЕСТВАНЕ, ОТПУСКАНЕ или ОТСЪЩАНЕ, както глобалните индекси, така и глобалните разделени индекси ще бъдат маркирани като неизползваеми. Следователно от това следва, че независимостта на дяловете не е възможна за глобалните индекси.
- В зависимост от типа операция, извършена върху дял на таблицата, индексите на таблицата ще бъдат засегнати. При промяна на дял на таблица може да се посочи клаузата UPDATE INDEXES. Това автоматично поддържа засегнатите глобални индекси и дялове.
- Предимствата от използването на тази опция са, че индексът ще остане онлайн и ще бъде наличен през цялата операция и не е необходимо да се възстановява, след като операцията приключи.
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id) GLOBAL PARTITION BY RANGE (id, item_id) (partition EXP_PART_IDX_1 values less than (20, 200), partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue)); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='EXP_PART_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS EXP_PART_IDX EXP_PART_IDX_1 USABLE EXP_PART_IDX EXP_PART_IDX_2 USABLE
Глобални неразделени индекси
- Глобалните неразделени индекси предлагат същия ефективен достъп до всеки отделен запис във всеки дял и се държат точно като неразделен индекс. Тъй като структурата на индекса не е разделена на дялове, индексът е достъпен за всички дялове.
- Сценарий, при който този тип индекс би бил полезен, е със заявка, която не включва ключа на дяла на таблицата като филтър, но все пак искате оптимизаторът на Oracle да използва индекс.
ЧЗВ
Какво е индексът с префикс и без префикс?Индексът се нарича с префикс, ако водещата(ите) колона(и) в дефиницията на индекса е(са) колоната(ите) на ключа на дяла, в противен случай се нарича без префикс.
Можем ли да подразделим глобалния индекс?Не, не можете да разделите глобалния индекс на подраздел, но можете да го разделите. Единственият начин да завършите с индексен подраздел е да имате подразделена таблица с локален индекс
Как да разберете дали даден индекс е глобален или локаленЧрез заявка за колоната LOCALITY в DBA_PART_INDEXES.
Също чете
- Уроци за администриране на база данни на Oracle
- https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
- променете формата на датата в oracle