Esta pregunta es sobre el rendimiento del índice de SQL Server con un varchar(2000)
comoINCLUDE
en un índice de cobertura.
Estoy tratando de mejorar el rendimiento en una aplicación de base de datos lenta e inestable. En algunos casos, se accede a los datos a través de grandes cadenas varchar, con las consultas, incluyendo las operaciones de cadena multple como SUBSTRING()
, SPACE()
, y DATALENGTH()
. Aquí hay un ejemplo simplificado de acceso;
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
El esquema se ve así:
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, ...
Se ha definido el siguiente índice, con un campo de cobertura en la columna de texto grande.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Por lo que he leído, es MALO colocar grandes campos de datos en un índice. He estado leyendo varios artículos, incluyendo http://msdn.microsoft.com/en-us/library/ms190806.aspx, que analizan el impacto de la paginación y el tamaño del disco en el rendimiento del índice. Dicho esto, el plan de consulta definitivamente utiliza el índice de cobertura. No tengo suficiente información para determinar cuánto me está costando esto en términos de carga del sistema. Sé que, en general, el sistema está funcionando mal y me preocupa que este sea uno de los problemas. Preguntas:
¿Es una buena idea poner esta
varchar(2000)
columna en el índiceINCLUDE
?Dado que los
INCLUDE
campos se almacenan en nodos hoja, ¿tienen mucho impacto en el rendimiento del índice?
Actualización: ¡Gracias por las excelentes respuestas! Esta es una pregunta injusta en algunos aspectos: como ustedes dicen, no hay una respuesta correcta absoluta sin estadísticas y perfiles reales. Como tantos problemas de rendimiento, supongo que la respuesta es "depende".
VARCHAR(2000)
que normalmente almacena solo diez caracteres es una cosa; Un sólido 2,000 bytes por registro es otra cosa.