Scegliere i tipi di dato per migliorare le prestazioni

23 marzo 2010

La scelta del tipo di dato da associare ai valori di un determinato campo è dettata in particolare da esigenze di progettazione; se un’applicazione è destinata a manipolare stringhe plausibilmente il database di riferimento sarà caratterizzato da tabelle strutturate in campi CHAR, VARCHAR o TEXT, lo stesso può dirsi per il database di supporto ad un programma per l’esecuzione di calcoli dove, in questo caso, verranno probabilmente archiviati valori numerici interi o in virgola mobile.

Dover definire il tipo di dato più adatto per specifiche tipologie di valori, può essere però anche un’esigenza legata allo spazio disponibile su disco per le proprie basi di dati, si pensi per esempio ai piani hosting a pagamento, in cui spesso la necessità di disporre di Mb aggiuntivi per i propri archivi implica un esborso di denaro.

In questa breve trattazione verranno analizzati alcuni casi concreti sulla base dei quali orientare la scelta del tipo di dato più adatto per la definizione dei campi in una tabella.

CHAR e VARCHAR per valori di piccole dimensioni

Un valore stringa può essere salvato per esempio in un campo CHAR o VARCHAR, l’utilizzo dell’uno o dell’altro tipo di dato però non è completamente intercambiabile, almeno non dal punto di vista dello spazio occupato dai valori memorizzati. Questi due datatype non si comportano infatti esattamente nello stesso modo; si immagini infatti di definire due campi diversi, uno come CHAR(4) e l’altro come VARCHAR(4), entrambi permetteranno quindi di archiviare stringhe della lunghezza massima di quattro caratteri ma, come sarà possibile osservare a breve, memorizzeranno in alcuni casi una quantità diversa di dati.

Si immagini ora di inserire all’interno del campo CHAR(4) un valore pari ad uno spazio vuoto (” “), esso occuperà uno spazio pari a quattro byte; effettuando la stessa procedura nel campo VARCHAR(4), lo spazio occupato sarà invece pari ad appena un byte. Perché avviene questo? Ciò è dovuto al fatto che lo spazio vuoto verrà memorizzato all’interno del campo CHAR sotto forma di quattro spazi vuoti (” “), cioè tanti quanti sono i caratteri definiti per tale campo; il campo VARCHAR archivierà invece semplicemente uno spazio vuoto, indipendentemente dalla lunghezza massima predefinita per esso.

Nello stesso modo, archiviando nel campo CHAR il valore ab, a questo verranno aggiunti due spazi vuoti per ottenere quattro caratteri in totale (“ab “), nel campo VARCHAR invece verranno memorizzati soltanto i due caratteri da cui è composto il valore; si avranno di conseguenza quattro byte occupati nel caso del primo campo e appena tre nel secondo.

Sulla base di quanto esposto finora sembrerebbe che l’utilizzo di VARCHAR sia da ritenersi in assoluto una scelta migliore, ma alla prova dei fatti le cose non stanno esattamente così, infatti, memorizzando all’interno di un campo CHAR(4) una stringa composta da quattro caratteri (ad esempio “abcd”), il numero di byte occupati sarà pari a quattro, mentre la stessa operazione su un campo VARCHAR(4) porterà all’occupazione di cinque byte.

Nel caso in cui si cerchi di memorizzare in entrambi i campi un valore di lunghezza superiore a quella consentita (ad esempio “abcdef”), la stringa verrà troncata all’altezza dell’ultimo carattere consentito, ma occuperà quattro byte nel caso di CHAR e cinque nel caso di VARCHAR.

Tra CHAR e VARCHAR non vi è quindi un tipo di dato preferibile in senso assoluto, vi sono però dei casi concreti che consentono di orientare la scelta: CHAR potrebbe per esempio essere utilizzato nel caso in cui si desideri registrare brevi stringhe alfanumeriche, come per esempio dei codici, VARCHAR potrebbe essere scelto invece nel caso in cui si prevede di dover memorizzare valori vuoti (non nulli) come per esempio degli spazi singoli.

Se vuoi aggiornamenti su Scegliere i tipi di dato per migliorare le prestazioni inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Scegliere i tipi di dato per migliorare le prestazioni

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy