Utilizzo di dimensioni di colonna molto più grandi del necessario


16

Sto creando un database SQL Server con qualcun altro. Una delle tabelle è piccola (6 righe) con dati che probabilmente rimarranno costanti. Esiste una remota possibilità che venga aggiunta una nuova riga. La tabella è simile alla seguente:

CREATE TABLE someTable (
    id int primary key identity(1,1) not null,
    name varchar(128) not null unique
    );
INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here');

Sto osservando la lunghezza del carattere di quella namecolonna e penso che i suoi valori probabilmente non saranno mai più grandi di, diciamo, 32 caratteri, forse nemmeno più di 24. C'è qualche vantaggio nel cambiare questa colonna in, per esempio varchar(32)?

Inoltre, c'è qualche vantaggio nel mantenere le dimensioni delle colonne predefinite su multipli di 4, 8, 32, ecc.?

Risposte:


15

SQL Server utilizza lunghezze di colonna durante l'allocazione della memoria per l'elaborazione delle query. Quindi, sì, in breve, dovresti sempre dimensionare le colonne in modo appropriato per i dati.

Le allocazioni di memoria si basano sul numero di righe restituite dalla query moltiplicate per la metà della lunghezza dichiarata della colonna.

Detto questo, in questo caso in cui hai 6 righe probabilmente non vorrai ottimizzare troppo prematuramente. A meno che non vi uniate questa tabella a un'altra con milioni di righe, non vi sarà una differenza enorme tra un varchar (24) e un varchar (32), o persino un varchar (128).

La tua seconda domanda è sull'allineamento delle lunghezze delle colonne sui multipli binari. Non è affatto necessario poiché SQL Server archivia tutti i dati in pagine da 8 KB, indipendentemente dalla lunghezza di ciascuna colonna.


14

Con 6 righe, no, non ci saranno benefici osservabili. L'intera tabella si adatterà su una singola pagina in modo da ridurre lo spazio potenziale massimo che utilizzerai su quella pagina mentre occupi comunque l'intera pagina non è davvero diversa in tutti i sensi pratici.

Su tavoli più grandi, tuttavia, il dimensionamento corretto è cruciale. Il motivo è che le stime della memoria si baseranno sul presupposto che ogni valore sarà popolato al 50%. Pertanto, se si dispone di varchar (128), ogni valore si aspetta di occupare 64 byte, indipendentemente dai dati effettivi, pertanto le assegnazioni di memoria saranno 64b * numero di righe. Se tutti i valori saranno di 32 caratteri o meno, renderlo varchar (64) o anche varchar (32) è probabilmente una scelta migliore. Se una grande percentuale di valori è vicina o al limite, si potrebbe persino sostenere che il char ne esca dalla volatilità.

Per quanto riguarda i vantaggi di avere lunghezze di stringa limitate a potenze di 2, non credo che sull'hardware di oggi chiunque possa dimostrare evidenti vantaggi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.