questo può ridurre la dimensione di tabelle e indici (enfasi aggiunta)
Riduzione delle dimensioni è possibile solo se la maggior parte dei personaggi sono essenzialmente [space]
, 0 - 9
, A - Z
, a - z
, e alcuni segni di punteggiatura di base. Al di fuori di quel set specifico di caratteri (in termini di utilizzo pratico, valori ASCII standard da 32 a 126), nella migliore delle ipotesi avrai dimensioni uguali a NVARCHAR
/ UTF-16, o in molti casi più grandi.
Sto programmando di migrare i dati poiché credo che leggere meno dati porterà a prestazioni migliori per il sistema.
Stai attento. UTF-8 non è un interruttore magico "ripara tutto". A parità di altre condizioni, sì, leggere di meno migliora le prestazioni. Ma qui "tutte le altre cose" non sono uguali. Anche quando si memorizzano solo caratteri ASCII standard (significato: tutti i caratteri sono 1 byte, quindi richiedono metà dello spazio rispetto alla memorizzazione in NVARCHAR
), c'è una leggera penalità prestazionale per l'uso di UTF-8. Credo che il problema sia dovuto al fatto che UTF-8 è una codifica a lunghezza variabile, il che significa che ogni byte deve essere interpretato mentre viene letto per sapere se è un carattere completo o se il byte successivo ne fa parte. Ciò significa che tutte le operazioni su stringa devono iniziare all'inizio e procedere byte per byte. D'altro canto,NVARCHAR
/ UTF-16 è sempre di 2 byte (anche i caratteri supplementari sono composti da due punti di codice a 2 byte), quindi tutto può essere letto in blocchi di 2 byte.
Nei miei test, anche con solo caratteri ASCII standard, l'archiviazione dei dati come UTF-8 non ha consentito di risparmiare tempo trascorso, ma è stato decisamente peggiore per il tempo della CPU. E questo era senza compressione dei dati, quindi almeno c'era meno spazio su disco utilizzato. Ma, quando si utilizza la compressione, lo spazio richiesto per UTF-8 era solo dell'1% - 1,5% più piccolo. In questo modo, non c'è spazio per risparmiare spazio, ma un tempo CPU maggiore per UTF-8.
Le cose si complicano quando si usa NVARCHAR(MAX)
poiché Unicode Compression non funziona con quel tipo di dati, anche se il valore è abbastanza piccolo da essere archiviato in riga. Ma, se i dati sono abbastanza piccoli, dovrebbero comunque trarre vantaggio dalla compressione di riga o di pagina (nel qual caso diventa effettivamente più veloce di UTF-8). Tuttavia, i dati off-row non possono utilizzare alcuna compressione. Tuttavia, rendere la tabella un indice di archivio di colonne in cluster riduce notevolmente le dimensioni di NVARCHAR(MAX)
(anche se è ancora leggermente più grande di UTF-8 quando si utilizza un indice di archivio di colonne in cluster).
Qualcuno può indicare uno scenario e un motivo, non usare i tipi di dati char con la codifica UTF
Decisamente. In realtà, non trovo davvero un motivo convincente per usarlo nella maggior parte dei casi. L'unico scenario che beneficia veramente di UTF-8 è:
- I dati sono principalmente ASCII standard (valori 0 - 127)
- Deve essere Unicode perché potrebbe essere necessario memorizzare un intervallo più ampio di caratteri rispetto a quelli disponibili su una singola pagina di codice a 8 bit (es.
VARCHAR
)
- La maggior parte dei dati è archiviata off-row (quindi la compressione della pagina non funziona nemmeno)
- Hai abbastanza dati di cui hai bisogno / desideri ridurre la dimensione per motivi non legati alle prestazioni della query (ad es. Ridurre la dimensione del backup, ridurre il tempo necessario per il backup / ripristino, ecc.)
- Non è possibile utilizzare Clustered Columnstore Index (forse l'uso della tabella peggiora le prestazioni in questo caso?)
I miei test mostrano che in quasi tutti i casi, NVARCHAR era più veloce, soprattutto quando c'erano più dati. In effetti, 21k righe con una media di 5k caratteri per riga richiedono 165 MB per UTF-8 e 236 MB per NVARCHAR
non compressi. Eppure il tempo NVARCHAR
era 2 volte più veloce nel tempo trascorso e almeno 2 volte più veloce (a volte più) nel tempo della CPU. Tuttavia, ci sono voluti 71 MB in più sul disco.
A parte questo, non consiglierei ancora di usare UTF-8, almeno a partire da CTP 2, a causa di una varietà di bug che ho trovato in questa funzione.
Per un'analisi dettagliata di questa nuova funzionalità, inclusa una spiegazione delle differenze tra UTF-16 e UTF-8 e un elenco di tali bug, vedere il mio post:
Supporto nativo UTF-8 in SQL Server 2019: Salvatore o Falso profeta?