Se a resposta for 'não', tudo bem...
Estou olhando para ver se isso pode ser otimizado... é parte de um proc armazenado muito maior. CGCode
é varchar(50), Year
e Month
são smallint
, FEIN
échar(9)
select max(id)
from Table
where 1=1
and cgcode = 123
and datefromparts(cast(year as char(4)),cast(month as char(2)),'01') < getdate()
and totalcount > 0
group by cgcode, year, month, fein
Leituras lógicas do plano de execução real: 1.566.473
Dados brutos da tabela de origem mais de 32 milhões de registros
Linhas estimadas: 640K, 55K reais, antes do Group By entrar em ação
Avisos de conversão implícitos ativados Year/Month/CGCode
(entra como bigint
)
Tempo de execução de aproximadamente 7,5 segundos, fazendo uma busca de índice não clusterizado:
O conjunto de resultados finais é de 114 linhas (para isso CGCode
, testamos com... outros variam)
O desempenho é praticamente o mesmo no Prod em hardware significativamente melhor do que na caixa Dev. Isso só vai piorar com o tempo, pois está puxando tudo mais antigo que o mês atual, para preencher um gráfico de histórico em uma interface do usuário.
Que outras informações posso fornecer?
O índice que está sendo usado atualmente:
CREATE NONCLUSTERED INDEX [COIX_Table_TotalCount] ON [dbo].[Table]
(
[TotalCount] ASC
)
INCLUDE ( [ID],
[CGCode],
[Year],
[Month],
[FEIN])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CGCode
limita os dados mais... 281 valores. year
é apenas 3-4 anos de dados, month
apenas 12 opções, é claro. TotalCount
é um bigint
, 17K valores distintos em 32 milhões de registros. Não faço ideia de qual é o propósito da TotalCount
coluna.