Nessun DBMS che conosco ha "ottimizzazioni" che consentano VARCHAR
a una 2^n
lunghezza di funzionare meglio di una max
lunghezza che non è una potenza di 2.
Penso che le prime versioni di SQL Server abbiano effettivamente trattato una VARCHAR
lunghezza 255 diversa da una lunghezza maggiore. Non so se sia ancora così.
Per quasi tutti i DBMS, l'archiviazione effettiva richiesta è determinata solo dal numero di caratteri inseriti, non dalla max
lunghezza definita. Quindi, dal punto di vista dell'archiviazione (e molto probabilmente anche delle prestazioni), non fa alcuna differenza se si dichiara una colonna come VARCHAR(100)
o VARCHAR(500)
.
Dovresti vedere la max
lunghezza fornita per una VARCHAR
colonna come una sorta di vincolo (o regola aziendale) piuttosto che una cosa tecnico / fisica.
Per PostgreSQL la migliore configurazione è quella di utilizzare text
senza limiti di lunghezza e CHECK CONSTRAINT
limiti che limitano il numero di caratteri a qualunque cosa la tua azienda richieda.
Se tale requisito cambia, la modifica del vincolo di controllo è molto più rapida della modifica della tabella (poiché non è necessario riscrivere la tabella)
Lo stesso può essere applicato per Oracle e altri - in Oracle lo sarebbe VARCHAR(4000)
invece che text
però.
Non so se esiste una differenza di archiviazione fisica tra VARCHAR(max)
e, ad esempio, VARCHAR(500)
in SQL Server. Ma a quanto pare c'è un impatto sulle prestazioni quando si utilizza varchar(max)
rispetto a varchar(8000)
.
Vedi questo link (pubblicato da Erwin Brandstetter come commento)
Modifica 22-09-2013
Per quanto riguarda il commento di Bigown:
Nelle versioni Postgres precedenti alla 9.2 (che non era disponibile quando ho scritto la risposta iniziale) una modifica alla definizione della colonna ha riscritto l'intera tabella, vedi ad esempio qui . A partire da 9.2 questo non è più il caso e un rapido test ha confermato che aumentare le dimensioni della colonna per una tabella con 1,2 milioni di righe impiegava effettivamente solo 0,5 secondi.
Anche per Oracle questo sembra essere vero, a giudicare dal tempo impiegato per modificare la varchar
colonna di un grande tavolo . Ma non sono riuscito a trovare alcun riferimento per questo.
Per MySQL il manuale dice " Nella maggior parte dei casi, ALTER TABLE
crea una copia temporanea della tabella originale ". E i miei test confermano che: l'esecuzione di un ALTER TABLE
su una tabella con 1,2 milioni di righe (lo stesso del mio test con Postgres) per aumentare le dimensioni di una colonna ha richiesto 1,5 minuti. In MySQL tuttavia è possibile non utilizzare la "soluzione" per usare un vincolo di controllo per limitare il numero di caratteri in una colonna.
Per SQL Server non sono riuscito a trovare un'istruzione chiara su questo, ma il tempo di esecuzione per aumentare le dimensioni di una varchar
colonna (di nuovo la tabella da 1,2 milioni di righe dall'alto) indica che non viene eseguita alcuna riscrittura.
Modifica 24/01/2017
Sembra che mi sia (almeno in parte) sbagliato su SQL Server. Vedi questa risposta di Aaron Bertrand che mostra che la lunghezza dichiarata di a nvarchar
o varchar
colonne fa un'enorme differenza per le prestazioni.