Ho discusso di questo problema per un po 'ma continua a venire. Abbiamo un sistema e il nostro valore delle nostre tabelle inizia con una descrizione che è stata memorizzata originariamente come NVARCHAR(150)
e poi otteniamo un ticket che chiede di espandere le dimensioni del campo a 250, quindi 1000 ecc. Ecc.Che cos'è un modo gestibile per archiviare campi di testo di grandi dimensioni senza sacrificare le prestazioni?
il ciclo si ripete sempre sul campo "nota" e/o sul campo "descrizione" che aggiungiamo alla maggior parte delle tabelle. Naturalmente la preoccupazione per me è la performance e rompendo il limite di 8k della pagina. Tuttavia, la mia altra preoccupazione è rendere il sistema meno gestibile interrompendo questi campi da OGNI tabella nel sistema in un riferimento caricato pigro.
Quindi qui mi trovo di fronte a queste stesse a 2 opzioni che mi hanno guardato in faccia. (altri sono i benvenuti) per favore prestami le tue opinioni.
Change tutto può note e/o descrizioni a
NVARCHAR(MAX)
e assicurarsi che noi non escludiamo questi campi in tutto l'elenco. Fondamentalmente non fare mai un:SELECT * FROM [TableName]
a meno che non stia recuperando solo un record.Rimuovere tutte le note e/o i campi descrizione e sostituirli con un riferimento chiave di assegnazione a una tabella
[Notes]
.CREATE TABLE [dbo].[Notes] (
(
[NoteId] [int] NOT NULL,
[NoteText] [NVARCHAR]MAX
)NOT NULL)
Ovviamente uso l'opzione 1 preferirei perché cambierà così tanto nel nostro sistema, se andiamo con 2. Tuttavia, se l'opzione 2 è davvero l'unico buon modo di procedere, quindi almeno posso dire che questi cambiamenti sono necessari e ho fatto i compiti.
UPDATE: ho corse diversi test su un database di esempio con 100.000 record in esso. Quello che trovo è che a causa delle scansioni dell'indice del cluster, l'IO richiesto per l'opzione 1 è "grosso modo" il doppio di quello dell'opzione 2. Se seleziono un numero elevato di record (1000 o più) l'opzione 1 è due volte più lento anche se lo faccio non includere il campo di testo grande nella selezione. Mentre richiedo meno righe, le linee si sfocano di più. Io sono un'app web in cui le dimensioni di pagina pari a 50 sono la norma, quindi l'opzione 1 funzionerà, ma convertirò tutte le istanze all'opzione 2 nel (molto) prossimo futuro per la scalabilità.