Esta pergunta é sobre o desempenho do índice do SQL Server com a varchar(2000)
como INCLUDE
em um índice de cobertura.
Estou tentando melhorar o desempenho em um aplicativo de banco de dados lento e instável. Em alguns casos, os dados são acessados através de grandes cadeias de varchar, com as consultas, incluindo operações de cadeia multple como SUBSTRING()
, SPACE()
, e DATALENGTH()
. Aqui está um exemplo simplificado de acesso;
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
O esquema fica assim:
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, ...
O índice a seguir foi definido, com um campo de cobertura na coluna de texto grande.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Pelo que li, é ruim colocar grandes campos de dados em um índice. Eu tenho lido vários artigos, incluindo http://msdn.microsoft.com/en-us/library/ms190806.aspx, que discutem o impacto da paginação e do tamanho do disco no desempenho do índice. Dito isto, o plano de consulta definitivamente usa o índice de cobertura. Não tenho informações suficientes para determinar quanto isso realmente está me custando em termos de carga do sistema. Sei que, no geral, o sistema está com um desempenho ruim e estou preocupado que esse seja um dos problemas. Questões:
Colocar essa
varchar(2000)
coluna no índice éINCLUDE
sempre uma boa idéia?Como os
INCLUDE
campos são armazenados em nós folha, eles têm muito desempenho no índice de impacto?
Atualização: Obrigado pelas excelentes respostas! Essa é uma pergunta injusta, de certa forma - como vocês dizem, não há resposta certa absoluta sem estatísticas e perfis reais. Como tantos problemas de desempenho, acho que a resposta é "depende".
VARCHAR(2000)
que normalmente armazena apenas dez caracteres é uma coisa; 2.000 bytes sólidos por registro é outra coisa.