Секціонування до досконалості

У Oracle Database 11 g вибір способу секціонування тепер практично не обмежений.

"Розділяй і володарюй" – цей фігуральний принцип ніколи не був проілюстрований краще, ніж в можливостях секціонування в Oracle Database. Починаючи з версії 8, таблицю або індекс можна розділити на кілька секцій, які потім помістити в різні табличні простору. Таблиця, як і раніше є логічною сутністю, в той час як окремі секції зберігаються як окремі сегменти, що дозволяє легко маніпулювати даними.

У версії 11 такі нововведення, як: посилальне секціонування, інтервальне секціонування, секціонування по віртуальних стовпцях і розширене змішане секціонування, дають безмежні можливості проектування і забезпечення управління секціями.

Розширене змішане секціонування

При змішаному секціонування – ця схема відома з Oracle8i Database – можна створювати підсекції секцій, дозволяючи ще більше подрібнювати таблицю. Однак у цій версії можна було створювати підсекції таблиць з діапазонними секціями тільки хеш-методом. У Oracle9i змішане секціонування було розширено до підсекцій діапазон-список.


Ці схеми задовольняє більшості випадків, але не всім. Припустимо, наприклад, є таблиця SALES, у якої багато стовпців, включаючи два спеціальних – кандидатів для секціонування:


Користувачі запитують дані таблиці, відбираючи їх по обох стовпцях на рівність, а вимоги до архівування також засновані на цих двох стовпчиках. Коли ви постігніте принципи секціонування, то зрозумієте, що ці стовпці хороші кандидати в ключі секціонування.


У Oracle Database 11g можна вирішити проблему дуже легко. Ця версія не обмежена змішаним секціонуванням за схемою діапазон-хеш або діапазон-список. Навпаки, вибір абсолютно необмежений, створювати можна змішані секції в будь-яких комбінаціях.


У цьому прикладі можна вибрати LIST-секціонування таблиці по product_code, так як цей стовпець має більш дискретні значення і потім створити підсекції по state_code теж за списком. Демонстраційний код нижче показує, як це зробити:


create table sales
(
   sales_id     number,
   product_code number,
   state_code   varchar2(2)
)
partition by list (product_code)
subpartition by list (state_code)
(
   partition p101 values (101)
   (
      subpartition p101_ct values (“CT”),
      subpartition p101_ny values (“NY”),
      subpartition p101_def values (default)
   ),
   partition p201 values (201)
   (
      subpartition p201_ct values (“CT”),
      subpartition p201_ny values (“NY”),
      subpartition p201_def values (default)
   )
)
 

Варіанти не обмежуються тими, що тут показані. Можна також створити змішані секції LIST-RANGE. Припустимо, в наведеному вище прикладі код продукту не дискретний, а входить в діапазон. Ви можете створити секції за списком за стовпцем state_code і потім підсекції по product_code. Ось демонстраційний код, який це робить.

 

create table sales1
(
   sales_id     number,
   product_code number,
   state_code   varchar2(2)
)
partition by list (state_code)
subpartition by range (product_code)
(
   partition CT values (“CT”)
   (
      subpartition ct_100 values less than (101),
      subpartition ct_200 values less than (201)
   ),
   partition NY values (“NY”)
   (
      subpartition NY_100 values less than (101),
      subpartition NY_200 values less than (201)
   )
)
 

Можна створити змішані підсекції типу діапазон-діапазон, які стають дуже корисними, коли є два поля-дати. Розглянемо, наприклад, таблицю для системи обробки продажів, в якій є дата транзакції і дата доставки. Можна створити секції по діапазону однієї дати і також підсекції за діапазоном інший. Ця схема дозволяє виконувати резервне копіювання, архівування та очищення, грунтуючись на цих датах.

У результаті, можна створювати такі типи змішаних секцій, можливі в Oracle Database 11 g:



Посилальне секціонування

Ось типова проблема в проектуванні схем секціонування: не всі таблиці мають однакові стовпці для секціонування. Припустимо, ви створюєте систему продажів з двома простими таблицями, sales і customers:

 

create table customers
(
   cust_id   number primary key,
   cust_name varchar2(200),
   rating    varchar2(1) not null
)
partition by list (rating)
(
   partition pA values (“A”),
   partition pB values (“B”)
);

Таблиця sales створена, як показано нижче. Це підпорядкована таблиця для таблиці customers.


create table sales
(
   sales_id    number primary key,
   cust_id     number not null,
   sales_amt   number,
   constraint  fk_sales_01
    foreign key (cust_id)
    references customers
);
 

В ідеалі треба б секціонованими таблицю sales так само, як таблицю customers: секції за списком значень стовпця rating. Проте тут виникає серйозна проблема: в таблиці sales немає стовпця rating! Тому як секціонованими її по неіснуючому стовпцю?

У Oracle Database 11 g можна використовувати нову можливість Reference Partitioning (Посилальне секціонування). Ось приклад, який показує, як застосувати його до таблиці sales:


create table sales
(
   sales_id    number primary key,
   cust_id     number not null,
   sales_amt   number,
   constraint  fk_sales_01
    foreign key (cust_id)
    references customers
)
partition by reference (fk_sales_01);
 

У цьому випадку створюються секції, ідентичні таблиці-майстру, customers. Зауважте, що стовпця rating немає, хоча таблиця секціонованими з цього стовпцю. У виразі partition by reference (fk_sales_01) зазначено назву зовнішнього ключа в описі секції. Oracle Database 11 g показує, що секціонування виконане за схемою таблиці-майстра – в даному випадку, customers. Зауважте, що обмеження цілісності за стовпцю cust_id. – NOT NULL; це вимога до посилальної секционированию.

Перевіримо кордону секцій таблиці sales:


SQL> select partition_name, high_value
 2 from user_tab_partitions
 3 where table_name = “SALES”;
 
PARTITION_NAME HIGH_VALUE
————— ——————————-
PA
PB
 

Значення high value порожньо, а це означає, що кордони успадковуються з таблиці-майстра. Секції мають такі ж назви, як і таблиця-майстер. Тип секціонування можна перевірити, виконавши запит за поданням user_part_tables. Спеціальний стовпець ref_ptn_constraint_name показує назву обмеження цілісності для зовнішнього ключа.


 
 SQL> select table_name, partitioning_type, ref_ptn_constraint_name
 2 from user_part_tables
 3 where table_name in (“CUSTOMERS”,”SALES”);
 
TABLE_NAME PARTITION REF_PTN_CONSTRAINT_NAME
 —————————— ——— ———– —————
CUSTOMERS LIST
SALES REFERENCE FK_SALES_01
 

Посилальні секції стають вельми корисні, коли потрібно секціонованими підпорядковану таблицю так само, як таблицю-майстер, однак у підпорядкованій таблиці немає таких же стовпців, і ви не хочете створювати їх виключно для секціонування. У цьому випадку немає необхідності явно оголошувати довге вираження для секціонування кожної підпорядкованої таблиці.


Інтервальне секціонування

Інтервальне секціонування дозволяє створювати секції, засновані на діапазонах значень стовпця-ключа секціонування. Ось приклад таблиці з інтервальним секціонуванням:


 
create table sales6
(
   sales_id    number,
   sales_dt    date
)
partition by range (sales_dt)
(
 partition p0701 values less than (to_date ("2007-02-01", "yyyy-mm-dd")),
 partition p0702 values less than (to_date ("2007-03-01", "yyyy-mm-dd"))
);
 

У ній визначені секції тільки для січня 2007 і березня 2007, тому що буде, якщо вставляється в таблицю запис має sales_dt за березень 2007? Вставка буде неуспішною з наступною помилкою:

 
 ORA-14400: inserted partition key does not map to any partition
 

Очевидно, що перед тим, як вставляти запис, необхідно додати секцію за березень 2007. Однак часто це легше сказати, ніж зробити. Іноді немає можливості передбачити створення безлічі секцій заздалегідь, і деякі з них можуть повертати цю помилку.


Чи не простіше буде, якщо б Oracle як-небудь автоматично розпізнав необхідність нових секцій і створив їх? Oracle Database 11 g це вміє для Interval Partitioning (інтервального секціонування). У прикладі нижче описані не секції, не їх межі, а тільки інтервал, який описує межі кожної секції. Ось демонстраційний приклад інтервального секціонування:


create table sales6
(
 sales_id number,
 sales_dt date
)
partition by range (sales_dt)
interval (numtoyminterval(1,”MONTH”)) 
(
 partition p0701 values less than (to_date ("2007-02-01", "yyyy-mm-dd"))
);
 

Зауважте: інтервал слід за інтервалом. Це з інструкції Oracle по створенню інтервалів для кожного місяця. Створюється також початкова секція p0701, для січня 2007. Тепер, припустимо, що вставляється запис за червень 2007:


 
SQL> insert into sales6 values (1,”01-jun-07″);
 
1 row created.
 

Oracle помилку не повертає, навпаки, він успішно виконує пропозицію. І де ж тоді вставлена запис? Секція p0701 не може містити такий запис, а секція за червень 2007 не описувалася. Однак перевіримо секції таблиці на цей раз:


 
SQL> select partition_name, high_value
 2 from user_tab_partitions
 3 where table_name = “SALES6”;
 
PARTITION_NAME HIGH_VALUE
 ————— ———————————– —————————–
 P0701 TO_DATE ("2007-02-01 00:00:00", "SYYYY-MM-DD HH24: MI: SS", "NLS_C
 ALENDAR=GREGORIA
 
 SYS_P41 TO_DATE ("2007-07-01 00:00:00", "SYYYY-MM-DD HH24: MI: SS", "NLS_C
 ALENDAR=GREGORIA
 

Зауважте, що секція SYS_P1 з верхнім значенням 1 липня 2007 буде накопичувати дані до кінця червня. Ця секція створена динамічно Oracle і має системне сгенерированное назву.

Тепер припустимо, що вводиться значення менше максимального, наприклад 1 травня 2007. Воно ідеально відповідає його власної секції, оскільки інтервал секції, це місяць.


SQL> insert into sales6 values (1,”01-may-07″);
 
1 row created.
 
SQL> select partition_name, high_value
 2 from user_tab_partitions
 3 where table_name = “SALES6”;
 
PARTITION_NAME HIGH_VALUE
 ————— ———————————– —————————–
 P0701 TO_DATE ("2007-02-01 00:00:00", "SYYYY-MM-DD HH24: MI: SS", "NLS_C
 ALENDAR=GREGORIA
 
 SYS_P41 TO_DATE ("2007-07-01 00:00:00", "SYYYY-MM-DD HH24: MI: SS", "NLS_C
 ALENDAR=GREGORIA
 
 SYS_P42 TO_DATE ("2007-06-01 00:00:00", "SYYYY-MM-DD HH24: MI: SS", "NLS_C
 ALENDAR=GREGORIA
 

Зауважте, що нова секція, SYS_P42, має верхню межу 1 червня – така секція може містити дані за травень 2006. Ця секція створена діленням секції SYS_P41 (за червень). Таким чином, Oracle автоматично створює і керує секціями, коли описана схема інтервального секціонування. Якщо секції необхідно створювати в окремих табличних просторах, слід використовувати вираз store in:


interval (numtoyminterval(1,”MONTH”))
store in (TS1,TS2,TS3)
 

тоді секції зберігаються в табличних просторах TS1, TS2 і TS3 по черзі по колу.
Як розробник програми може звернутися до будь-якої секції? Один з відомих способів, за назвою, може бути неможливим, і навіть, якщо ви знаєте, часто призводить до помилок. Для забезпечення доступу до деякої секції Oracle Database 11 g пропонує новий синтаксис запитів:


SQL> select * from sales6 partition for (to_date ("15-may-2007", "dd-mon-yyyy"));
 
 SALES_ID SALES_DT
———- ———
 1 01-MAY-07
 

Зауважте, що новий вираз for (значення) дозволяє напряму посилатися на секції без явного звернення з їх точному назві. Якщо необхідно очистити або видалити секцію, можна використовувати цей додатковий синтаксис.
Коли таблиця створена так, як показано вище, стовпець PARTITIONING_TYPE подання DBA_PART_TABLES показує значення INTERVAL.


Системне секціонування

Хоча Oracle припускає, що лише деякі будуть використовувати на практиці цю можливість, я хочу описати її, бо дуже вже вона гарна.

Цей рідкісне, але не неймовірне застосування: уявіть, що у вас є таблиця, яка не може бути секціонованими ніяким логічним шляхом. Результат – величезна монолітна таблиця, яка спантеличує проблемами, такими як необхідність розширеного індексування та інших операцій.

Тому розробники можуть прийти до наступного висновку: вони обіцяють, що якщо таблиця як-небудь буде секціонованими, то вони зможуть записувати в секції по-розумному. При цьому додаток саме управляє, яку запис в яку секцію поміщати. Адміністратору бази даних необхідно просто описати секції. Наприклад:


create table sales3
(
 sales_id number,
 product_code number,
 state_code number
)
partition by system
(
 partition p1 tablespace users,
 partition p2 tablespace users
);
 

Зауважте, що не описано ні ключів секціонування, ні кордонів. Тому таблиця фізично розділена на два сегменти, хоча це ціла логічна таблиця. Коли описаний такий метод, база даних створює два сегменти для таблиці, замість однієї злитої таблиці. Це можна перевірити:


 
SQL> select partition_name
 2 from user_segments
 3 where segment_name = “SALES3”;
 
PARTITION_NAME
——————————
P1
P2
 

При створенні локального індексу, він секціонувального таким же способом.

 

SQL> create index in_sales3_state on sales3 (state_code) local;
 
Index created.
 
SQL> select partition_name
 2 from user_segments
 3 where segment_name = “IN_SALES3_STATE”;
 
PARTITION_NAME
——————————
P1
P2
 

Тип секціонування можна перевірити по user_part_tables:

 

SQL> select partitioning_type
 2 from user_part_tables
 3 where table_name = “SALES3”;
 
PARTITION
———
SYSTEM

Результат показує SYSTEM, що, звичайно ж, позначає системне секціонування. Відзначимо ту обставину, що стовпець high_value має значення NULL для таблиць такого типу.


 
SQL> select partition_name, high_value
 2 from user_tab_partitions
 3 where table_name = “SALES3”;
 
PARTITION_NAME HIGH_VALUE
————– ———————
P1
P2
 

А ось цікаве питання: якщо немає ключа або схеми секціонування, таких як діапазон, список або хеш, то як Oracle дізнається, в яку секцію помістити входить запис?
Відповідь: Oracle цього не робить. Ось приклад того, що відбувається, якщо необхідно вставити запис у таблицю:


SQL> insert into sales3 values (1,101,1);
insert into sales3 values (1,101,1)
 *
ERROR at line 1:
 ORA-14701: partition-extended name or bind variable must be used for DMLs on
tables partitioned by the System method
 

Межі секцій невідомі, тому додаток повинен забезпечити цю інформацію, використовуючи секція-подібний синтаксис при вставці даних. Пропозицію необхідно переписати:


 
SQL> insert into sales3 partition (p1) values (1,101,1);
 
1 row created.
 

При видаленні не обов'язково використовувати цей синтаксис – але пам'ятайте, межі секцій відсутні. Тому при виконанні пропозиції типу:


 
SQL> delete sales3 where state_code = 1;
 

Oracle повинен просканувати всі секції, щоб побачити, де розташована рядок. Щоб цього уникнути, слід написати так:


 
SQL> delete sales3 partition (p1) where state_code = 1;
 

Також виконуються зміни даних. Такий спосіб обмежує перелік секцій, по яких виконується пошук.
Системні секції мають гігантські переваги, коли таблиця не може бути секціонованими ніяким логічним шляхом. Вони дозволяють використовувати переваги секціонування, дозволяючи звільнити розробників від рішення, в яку секцію поміщати запис.


Табличний простір транспортується з однією секцією

У ранніх версіях Oracle Database з'явилася можливість переміщати табличний простір і потім підключати його до різних баз даних або до тієї ж самої. Процес полягає в копіюванні файлів даних, тому це найшвидший спосіб переміщення даних між базами даних. Однак до теперішнього часу не було можливості переміщати табличний простір з секцією і потім підключати його назад. У Oracle Database 11 g це можна.

Припустимо, що є таблиця SALES5 з секціями CT, NY і т.д.


SQL> select partition_name, tablespace_name
 2 from user_tab_partitions
 3 where table_name = “SALES5”;
 
 
PARTITION_NAME TABLESPACE_NAME
————– —————
CT TS1
NY TS2
 

Тепер необхідно перемістити секцію CT за допомогою команди, показаної нижче:

$ Expdp tables = scott.sales5: ct transportable = always directory = data_pump_dir dumpfile = p_ct.dmp


Export: Release 11.1.0.4.0 – Beta on Sunday, 10 June, 2007 16:05:40 Copyright (c) 2003, 2005, Oracle. All rights reserved.
Username: / as sysdba

 
 Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.4.0 – Beta
 With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Oracle Database Vault options
 Starting "SYS". "SYS_EXPORT_TABLE_01": /******** AS SYSDBA tables = scott.sales5: ct transportable =
 always directory=data_pump_dir dumpfile=p_ct.dmp
Processing object type TABLE_EXPORT/TABLE/PLUGTS_BLK
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/END_PLUGTS_BLK
 Master table "SYS". "SYS_EXPORT_TABLE_01" successfully loaded / unloaded
 ************************************************** **************************
Dump file set for SYS.SYS_EXPORT_TABLE_01 is:
 /home/oracle/oracle/admin/PROBE2/dpdump/p_ct.dmp
 ************************************************** ****************************
Datafiles required for transportable tablespace TS1:
 /home/oracle/oradata/PROBE2/PROBE2/ts1_01.dbf
 Job "SYS". "SYS_EXPORT_TABLE_01" successfully completed at 16:05:55
 

Тепер можна взяти два файли – p_ct.dmp і ts1_01.dmp – в іншій системі і спробувати підключити їх до бази даних. Для вивчення давайте спробуємо підключити їх до тієї ж самої бази даних. Спочатку потрібно видалити таблицю, а потім табличний простір ts1.


 
SQL> drop table scott.sales5;
Table dropped.
 
SQL> drop tablespace ts1 including contents;
Tablespace dropped.
 

Тепер підключимо табличний простір до бази даних. Тут, однак, виникає невеличка проблема: таблиця sales5 більше не існує, а експортована була тільки одна секція (ct), а не вся таблиця. І як же тепер імпортувати цю секцію неіснуючої таблиці?

У Oracle Database 11 g нова опція командного рядка Data Pump Import, яка називається partition_options, робить це можливим. Якщо вказати значення departition, Data Pump створить нову таблицю з експортованої секції. По ходу справи цей метод "видаляє" секцію, тому він відповідно називається десекціонірованіем. Давайте подивимося, як він працює.


$ Impdp partition_options = departition dumpfile = p_ct.dmp transport_datafiles = "/ home/oracle/oradata/PROBE2/PROBE2/ts1_01.dbf"  
 
 Import: Release 11.1.0.4.0 – Beta on Sunday, 10 June, 2007 21:58:08
 
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Username: / as sysdba
 
 Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.4.0 – Beta
 With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Oracle Database Vault options
 Master table "SYS". "SYS_IMPORT_TRANSPORTABLE_04" successfully loaded / unloaded
 Starting "SYS". "SYS_IMPORT_TRANSPORTABLE_04": /******** AS SYSDBA partition_options =
 departition dumpfile = p_ct.dmp transport_datafiles = / home/oracle/oradata/PROBE2/PROBE2/ts1_01.dbf
Processing object type TABLE_EXPORT/TABLE/PLUGTS_BLK
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/END_PLUGTS_BLK
 Job "SYS". "SYS_IMPORT_TRANSPORTABLE_04" successfully completed at 21:58:23

Цей SQL створює таблицю sales5_ct, яка ні що інше, як секція ct таблиці SALES5, експортованої раніше з переміщуваним табличним простором. Назва таблиці, як можна бачити, це комбінація назв таблиці і секції. Наявність відповідного сегмента можна побачити в поданні DBA_SEGMENTS.


 
SQL> select segment_name
 2 from dba_segments
 3 where tablespace_name = “TS1”;
 
SEGMENT_NAME
—————–
SALES5_CT

Можливість переміщуються табличних просторів з єдиною секцією можна використовувати для підключення таблиці до іншої бази даних. Після підключення можна виконати операцію обміну секціями, щоб перетворити її в секцію будь-якої таблиці.


Секціонування по віртуальних стовпцях

Давайте розглянемо іншу поширену проблему. У таблиці sales є такі стовпці:


 
SQL> desc sales
 Name                                      Null?    Type
 —————————————– ——– ——
 SALES_ID                                  NOT NULL NUMBER
 CUST_ID                                   NOT NULL NUMBER
 SALES_AMT                                          NUMBER

Припустимо необхідно секціонованими цю таблицю за такою схемою, яка дозволяє очищати і архівувати в залежності від кількості продажів. Є чотири категорії продажів:






































if sale_amt в 

a cust_id


tо sale_category


0-10000


будь-який


LOW


10001-100000


0-100


LOW


10001-100000


101-200


MEDIUM


10001-100000


>200


HIGH


100001-1000000


0-100


MEDIUM


100001-1000000


101-200


HIGH


100001-1000000


>200


ULTRA


>1000000


будь-який


ULTRA


Цю таблицю необхідно секціонованими за стовпцем sale_category, але от проблема: стовпця sale_category немає. Він в основному залежить від стовпця sale_amt. І як же можна секціонованими цю таблицю?

У ранніх версіях Oracle потрібно було додати в таблицю стовпець sale_category, і використовувати тригер для заповнення стовпця, використовуючи логіку, показану в таблиці. Однак наявність нового стовпця буде мати зовсім іншу продуктивність через тригера.

У Oracle Database 11 g, нова можливість Virtual Columns (віртуальних шпальт) дозволяє створити стовпець, який не зберігається в таблиці, а обчислюється під час роботи. За цим стовпцем можна також виконувати секціонування. Використання цієї можливості злегка "хитати" секціонування цієї таблиці.


create table sales
(
   sales_id      number,
   cust_id       number,
   sales_amt     number,
   sale_category varchar2(6)
   generated always as
   (
      case
         when sales_amt <= 10000
            then “LOW”
         when sales_amt > 10000
            and sales_amt <= 100000
            then case
               when cust_id < 101 then “LOW”
 when cust_id between 101 and 200 then "MEDIUM"
               else “MEDIUM”
            end
         when sales_amt > 100000
            and sales_amt <= 1000000
            then case
               when cust_id < 101 then “MEDIUM”
               when cust_id between 101 and 200 then “HIGH”
               else “ULTRA”
            end
         else “ULTRA”
      end
    ) virtual
)
partition by list (sale_category)
(
   partition p_low values (“LOW”),
   partition p_medium values (“MEDIUM”),
   partition p_high values (“HIGH”),
   partition p_ultra values (“ULTRA”)
)

Тепер, коли вставляються рядки:

 
 SQL> insert into sales (sales_id, cust_id, sales_amt) values (1,1,100);
1 row created.
 
 SQL> insert into sales (sales_id, cust_id, sales_amt) values (2,1,1500);
1 row created.
 
 SQL> insert into sales (sales_id, cust_id, sales_amt) values (3,102,1500);
1 row created.
 
 SQL> insert into sales (sales_id, cust_id, sales_amt) values (4,102,10000);
1 row created.
 
SQL> commit;
Commit complete.

Зауважте, що значення sale_category не вводилося. А якщо перевірити записи в секції p_low, там буде коректна запис:


SQL> select * from sales partition (p_low);
 
  SALES_ID    CUST_ID  SALES_AMT SALE_C
———- ———- ———- ——
         1          1        100 LOW

Запис поміщена у відповідну секцію.

Секціонування по віртуальних стовпцях дозволяє створювати секції, які адаптовані до бізнес-процесу, навіть якщо самого стовпця немає. Тут використовувалося дуже просте обчислення по віртуальному стовпцю, однак воно може бути настільки складним, наскільки вам подобається. У цих випадках секціонування по віртуальних стовпцях стає ще більш важливим.


Помічник з секционированию

Треба думати, що найбільше суперечок при проектуванні секціонування виникає при виборі схеми секціонування та стовпця (-ів) секціонування. Це завдання нехай краще залишається бувалим професіоналам, займаються екстенсивним аналізом обсягу роботи, і навіть вони можуть не зробити це правильно. Отримати допомогу в Oracle Database 11 g можна у вигляді нового помічника Partition Advisor (помічник по секционированию), який аналізує дані та приклади доступу до передбачуваних схемами секціонування. Про це інструменті можна більше прочитати в його керівництві з установки.


Висновок

Секціонування завжди було одним з найбільш корисних засобів, а в Oracle Database 11 g воно стає ще поле корисним:


Стратегія "Розділяй і володарюй" ніколи не припускала багато варіантів вибору. І вони виглядають як ще один набір блискучих ножик для оброблення кращих частин тушки індички!

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*