Nessun DBMS che conosco ha "ottimizzazioni" che consentano VARCHARa una 2^nlunghezza di funzionare meglio di una maxlunghezza che non è una potenza di 2.
Penso che le prime versioni di SQL Server abbiano effettivamente trattato una VARCHARlunghezza 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 maxlunghezza 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 maxlunghezza fornita per una VARCHARcolonna come una sorta di vincolo (o regola aziendale) piuttosto che una cosa tecnico / fisica.
Per PostgreSQL la migliore configurazione è quella di utilizzare textsenza limiti di lunghezza e CHECK CONSTRAINTlimiti 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 textperò.
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 varcharcolonna 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 TABLEcrea una copia temporanea della tabella originale ". E i miei test confermano che: l'esecuzione di un ALTER TABLEsu 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 varcharcolonna (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 nvarcharo varcharcolonne fa un'enorme differenza per le prestazioni.