PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Qual è il costo dei vincoli CHECK in Postgres 9.x?

Alcune persone cercano di evitare NULL valori, affermare che la logica sarebbe fonte di confusione.

Non sono uno di loro. NULL i valori vanno bene per le colonne senza dati. Sono sicuramente il modo più economico per archiviare colonne "vuote", sia per lo spazio su disco che per le prestazioni (l'effetto principale sono tabelle e indici più piccoli):

Una volta che capisci la natura di NULL valori, non c'è motivo per evitarli. Postgres offre una varietà di funzioni per gestire i NULL. colaesce() , nullif() , concat() , concat_ws() , ...

In generale, per quanto riguarda il rendimento è interessato, un vincolo NOT NULL supera un vincolo CHECK ed entrambi battono trigger da un log shot. Ma anche i trigger semplici sono economici. Il costo di un NOT NULL il vincolo è quasi nulla. Inoltre, tutti questi influiscono solo sulle operazioni di scrittura, ma nella maggior parte delle applicazioni dominano le operazioni di lettura.

L'impatto più rilevante sulla performance (indici e query non ottimali a parte) è quindi la dimensione di tabelle e indici o, soprattutto, il numero di tuple per pagina di dati . Tuple più grandi portano a prestazioni più lente per la maggior parte dei casi d'uso. Il numero di pagine di dati che devono essere lette per soddisfare una query aumenta di conseguenza. La memoria cache disponibile è stata saturata prima.

Non ho un benchmark pronto, ma è comunque meglio testare per il tuo particolare ambiente. Queste sono solo semplici regole pratiche. La realtà è molto più complessa.