Questa domanda riguarda le prestazioni dell'indice di SQL Server con un varchar(2000)
as INCLUDE
in un indice di copertura.
Sto cercando di migliorare le prestazioni in un'applicazione di database lenta e instabile. In alcuni casi, i dati si accede attraverso stringhe di grandi dimensioni varchar, con le query tra cui operazioni di stringa multple come SUBSTRING()
, SPACE()
e DATALENGTH()
. Ecco un esempio semplificato di accesso;
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
Lo schema è simile al seguente:
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
È stato definito il seguente indice, con un campo di copertura sulla colonna di testo grande.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Da quello che ho letto è MALE mettere grandi campi di dati in un indice. Ho letto diversi articoli, tra cui http://msdn.microsoft.com/en-us/library/ms190806.aspx che discutono dell'impatto del paging e delle dimensioni del disco sulle prestazioni dell'indice. Detto questo, il piano di query utilizza sicuramente l'indice di copertura. Non ho abbastanza informazioni per determinare quanto questo mi stia effettivamente costando in termini di carico del sistema. So che nel complesso il sistema funziona male e sono preoccupato che questo sia uno dei problemi. Domande:
Mettere questa
varchar(2000)
colonna nell'indice èINCLUDE
mai una buona idea?Poiché i
INCLUDE
campi sono archiviati in nodi foglia, hanno un impatto notevole sulle prestazioni dell'indice?
Aggiornamento: grazie per le risposte eccellenti! Questa è una domanda ingiusta in un certo senso - come voi ragazzi affermate, non esiste una risposta assolutamente corretta senza statistiche e profilazione effettive. Come tanti problemi di prestazioni, immagino che la risposta sia "dipende".
VARCHAR(2000)
che in genere memorizza solo dieci personaggi è una cosa; ben 2.000 byte per record sono qualcos'altro.