venerdì 1 aprile 2016

RDBMS ORACLE - Partition Range By Interval - parte 2

Continuiamo con un esempio di quanto indicato nella parte 1 e due possibili soluzioni.

CREATE TABLE "ICP_ECONOMICO" 
   (
"PERIOD" NUMBER
   ) 
  PARTITION BY RANGE ("PERIOD") INTERVAL (1) 
 (PARTITION "P_0"  VALUES LESS THAN (196905) ) ;

Creato table "ICP_ECONOMICO".


set lines 300
col interval for a30
col TABLE_NAME for a30

select table_name, PARTITIONING_TYPE, STATUS, INTERVAL, PARTITION_COUNT,
(select count(*) from user_tab_partitions pts where pts.table_name = pt.table_name) real_count
from user_part_tables pt
where table_name ='ICP_ECONOMICO'
order by table_name;

TABLE_NAME  PARTITION STATUS   INTERVAL  PARTITION_COUNT REAL_COUNT
----------- --------- -------- --------- --------------- ----------
ICP_ECONOMICO  RANGE     VALID    1          1048575          1

A questo punto inseriamo un record.

insert into ICP_ECONOMICO (period) values(20160101);

Errore con inizio alla riga : 178 nel comando -
insert into ICP_ECONOMICO (period) values(20160101)
Report error -
Errore SQL: ORA-14300: la chiave di partizionamento è mappata a una partizione non inclusa nel numero massimo consentito di partizioni
14300. 00000 -  "partitioning key maps to a partition outside maximum permitted number of partitions"
*Cause:    The row inserted had a partitioning key that maps to a partition number greater than 1048575
           *Action  Ensure that the partitioning key falls within 1048575 partitions or subpartitions.

Come si vede abbiamo l'errore che dicevamo, adesso se portiamo da 1 a 100 il by interval vediamo cosa accade:

ALTER TABLE ICP_ECONOMICO  SET INTERVAL (100);
Table ICP_ECONOMICO modificato.

Inseriamo una riga come prima.

insert into ICP_ECONOMICO (period) values(20160101);
1 riga inserito.

A questo punto se rifacciamo la query di sopra abbiamo:

set lines 300
col interval for a30
col TABLE_NAME for a30

select table_name, PARTITIONING_TYPE, STATUS, INTERVAL, PARTITION_COUNT,
(select count(*) from user_tab_partitions pts where pts.table_name = pt.table_name) real_count
from user_part_tables pt
where table_name ='ICP_ECONOMICO'
order by table_name;

TABLE_NAME     PARTITION STATUS   INTERVAL  PARTITION_COUNT REAL_COUNT
-------------- --------- -------- --------- --------------- -----------------------------
ICP_ECONOMICO     RANGE     VALID    100           1048575          2


Se proviamo ad inserire altri record il problema non sembra più presentarsi a meno che non inserisce un valore che abbia un numero di cifre maggiore ad 8.

insert into ICP_ECONOMICO (period) values(99991201);
1 riga inserito.

insert into ICP_ECONOMICO (period) values(999912010);

Report error -
Errore SQL: ORA-14300: la chiave di partizionamento è mappata a una partizione non inclusa nel numero massimo consentito di partizioni
14300. 00000 -  "partitioning key maps to a partition outside maximum permitted number of partitions"
*Cause:    The row inserted had a partitioning key that maps to a partition number greater than 1048575
           *Action  Ensure that the partitioning key falls within 1048575 partitions or subpartitions.

A questo punto se modifichiamo nuovamente il valore dell'intervallo

ALTER TABLE ICP_ECONOMICO  SET INTERVAL (1000);
Table ICP_ECONOMICO modificato.
           
           
set lines 300
col interval for a30
col TABLE_NAME for a30

select table_name, PARTITIONING_TYPE, STATUS, INTERVAL, PARTITION_COUNT,
(select count(*) from user_tab_partitions pts where pts.table_name = pt.table_name) real_count
from user_part_tables pt
where table_name ='ICP_ECONOMICO'
order by table_name;  


TABLE_NAME     PARTITION STATUS   INTERVAL  PARTITION_COUNT   REAL_COUNT
-------------- --------- -------- --------  ----------------- ----------
ICP_ECONOMICO     RANGE     VALID    1000     1048575          3


insert into ICP_ECONOMICO (period) values(999912010);
1 riga inserito.

A questo punto sembra che il  numero di cifre sia legato al valore dell'intervallo di partizionamento e più precisamente:

Intervallo 1        = Numero di cifre 6
Intervallo 100    = Numero di cifre 8
Intervallo 1000  = Numero di cifre 9

se inserisco adesso un numero di cifre pari a 10 avrò nuovemente l'errore.

insert into ICP_ECONOMICO (period) values(9999120101);

Report error -
Errore SQL: ORA-14300: la chiave di partizionamento è mappata a una partizione non inclusa nel numero massimo consentito di partizioni
14300. 00000 -  "partitioning key maps to a partition outside maximum permitted number of partitions"
*Cause:    The row inserted had a partitioning key that maps to a partition number greater than 1048575
           *Action  Ensure that the partitioning key falls within 1048575 partitions or subpartitions

 E qui vi lascio perchè non so dare alcuna spiegazione a questo comportamento.







Nessun commento:

Posta un commento