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;