Ricerca
Rotta di navigazione
Pagine speciali
Constraint exclusion
Il constraint exclusion è stato introdotto dalla versione 8.1 e di fatto permette di creare quello che su altri DBMS commerciali è chiamato partizionamento di tabella.
In questo modo i dati su disco vengono ripartiti su più posizioni fisiche dando all'ottimizzatore la possibilità di percorrere solo le tabelle ereditate che rispettano le
constraint verificate dalla condizione di WHERE.
Per attivarla bisogna definire una constraint check su di una tabella ereditata specificando la clausola CHECK con
la verifica da effettuare, durante la creazione della tabella.
Se ad esempio avessimo una tabella fatture così definita:
CREATE TABLE fatture
(
id_fattura int not null ,
data_fattura date not null ,
importo int ,
iva int
);
Per creare una partizione contenente le sole fatture dell'anno 2006 è sufficiente creare la tabella
ereditata in questo modo:
CREATE TABLE fatture_2006
(
CHECK
(
d a t a _ f a t t u r a >= DATE '2006 − 01 − 01 '
AND d a t a _ f a t t u r a < DATE '2006 − 12 − 31 '
)
)
INHERITS( fatture );
La tabella fatture_2006, grazie alla constraint CHECK, rifiuta l'inserimento di qualsiasi record che non abbia l'anno
uguale al 2006.
INSERT INTO fatture_2006
( id_fattura ,data_fattura ,importo ,iva)
VALUES
(1 ,'2007 −03 −23 ' ,40 ,20);
ERROR: new row for relation fatture_2006 violates check constraint fatture_2006_data_fattura_check
In questo modo si ottiene un rafforzamento nella struttura logica demandando al database la gestione
di eventuali insert illegali nella tabella, ma c'è di più.
Impostando a on il parametro constraint_exclusion, presente nel file di configurazione postgresql.conf, ed effettuando una query sulla tabella padre, che nel nostro esempio è la tabella fatture, l'ottimizzatore è in grado di escludere a priori le tabelle ereditate che sicuramente non contengono i dati scartati dalla where condition, riducendo notevolmente l'IO necessario al recupero dei record.
Il parametro constraint_exclusion è impostabile sia a livello di configurazione generale che a livello di sessione con il comando:
SET constraint_exclusion=on;