Многораздельное разбиение Oracle по сравнению с использованием подраздела
Помимо очевидного, кто-нибудь может объяснить, что отличается между многоколоночным разделением и использованием подраздела? И какой из них лучше для сценария OLTP? Подробности см. В разделе " Управление секционированными таблицами и индексами" в Руководстве администратора базы данных Oracle.
(Тупой) пример таблицы, разделенной на несколько столбцов:
CREATE TABLE demo1
(
year NUMBER,
month NUMBER,
day NUMBER,
instance NUMBER, /* assuming this can only be 1 or 2 */
other1 VARCHAR2(50),
other2 VARCHAR2(50),
other3 VARCHAR2(50)
)
PARTITION BY RANGE (year,instance)
(
PARTITION data_2009_inst1 VALUES less than (2009,2) TABLESPACE data_2009,
PARTITION data_2009_inst2 VALUES less than (2009,3) TABLESPACE data_2009,
PARTITION data_2010_inst1 VALUES less than (2010,2) TABLESPACE data_2010,
PARTITION data_2010_inst2 VALUES less than (2010,3) TABLESPACE data_2010,
PARTITION data_2011_inst1 VALUES less than (2011,2) TABLESPACE data_2011,
PARTITION data_2011_inst2 VALUES less than (2011,3) TABLESPACE data_2011
);
Аналогично, пример таблицы с разделами:
CREATE TABLE demo2
(
year NUMBER,
month NUMBER,
day NUMBER,
instance NUMBER, /* assuming this can only be 1 or 2 */
other1 VARCHAR2(50),
other2 VARCHAR2(50),
other3 VARCHAR2(50)
)
PARTITION BY RANGE (year)
SUBPARTITION BY LIST (instance) /* Cannot subpartition by range in 10gR2 */
SUBPARTITION template
(
SUBPARTITION i1 VALUES (1),
SUBPARTITION i2 VALUES (2),
SUBPARTITION ix VALUES (DEFAULT)
)
(
PARTITION data_2009 VALUES less than (2010) TABLESPACE data_2009,
PARTITION data_2010 VALUES less than (2011) TABLESPACE data_2010,
PARTITION data_2011 VALUES less than (2012) TABLESPACE data_2011
);
В чем разница между этими таблицами? Разве они не "логически" одинаковы? Я знаю, что гораздо проще добавить разделы в demo2, так как вам нужно разделить разделы в demo1, чтобы получить больше разделов с течением времени. Что лучше в сценарии OLTP?
С другой стороны, причина, по которой я делю номера INSTANCE, связана с Oracle RAC. Я пытаюсь создать "привязку экземпляра", чтобы остановить "горячий блок" от замедления базы данных, так как они должны быть отправлены через межсоединение между узлами RAC. (Мы эмпирически доказали, что это имеет значение в нашем тестировании).
2 ответа
Вероятно, в вашем случае нет никакой разницы, но в целом разбиение на разделы позволяет разделить двумя разными способами, такими как range-hash, range-list. Пример вашего подразделя - это range-list, но эквивалентный одноуровневому разбиению диапазона. Тем не менее, вы не можете использовать одноуровневый, если ваше подразделение было похоже на этот пример из документа, который вы связали:
ALTER TABLE quarterly_regional_sales
ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING
(
SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),
SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')
);
Одно из преимуществ подразделов состоит в том, что они позволяют индивидуально детально управлять подразделами. Например, в таблице архива данных предположим, что существуют различные требования к хранению, основанные не только на дате, но и на другом значении.
Используя ваш пример, возможно, вы обязаны хранить данные со значением instance = 1 в течение 7 лет, но данные с instance = 2 могут быть отброшены через 4 года. Подразделение позволит вам отбрасывать подразделы, содержащие данные с instance = 2, независимо от других значений.