Tabela t1 com 500k linhas, 2TB de tamanho, uma coluna de texto. SQL Server 2008 R2 SP3.
CREATE TABLE [dbo].[t1](
[TId] [int] IDENTITY(1,1) NOT NULL,
[Weight] [int] NULL,
[TDate] [datetime] NULL,
[text_column] [text] NULL,
[CreatedDate] [datetime] NULL,
[UpdatedDate] [datetime] NULL,
[LastUpdatedBy] [varchar](255) NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[TId] ASC
)
Isso está funcionando para sempre:
SELECT COUNT(*) FROM t1 WHERE text_column IS NOT NULL
Não é possível alterar a tabela, só pode corrigir isso com novos índices. Mas não é possível criar um índice na coluna de texto. Nenhuma experiência com índices de texto completo.
O que devo fazer para melhorar, por favor?
Sugiro um índice filtrado:
Agora sua consulta deve ser capaz de usar esse índice em vez do índice clusterizado e deve ser muito mais eficiente.
Melhor ainda, permite que você veja as exibições de metadados, para que você leia uma linha (ou um número de linhas igual ao número de partições) em vez de fazer qualquer tipo de contagem manual:
A consulta parece mais feia, mas será muito mais eficiente (apesar do que o plano de execução pode lhe dizer), especialmente se o número de valores não NULL for pequeno e especialmente se a tabela for de alto volume (sua consulta atual pode bloquear e pode ser bloqueado).