Eu vi esse aviso nos planos de execução do SQL Server 2017:
Avisos: A operação causou IO residual [sic]. O número real de linhas lidas foi (3,321,318), mas o número de linhas retornadas foi 40.
Aqui está um trecho do SQLSentry PlanExplorer:
Para melhorar o código, adicionei um índice não clusterizado, para que o SQL Server possa acessar as linhas relevantes. Funciona bem, mas normalmente haveria colunas (grandes) demais para serem incluídas no índice. Se parece com isso:
Se eu adicionar apenas o índice, sem incluir colunas, ficará assim, se forçar o uso do índice:
Obviamente, o SQL Server acha que a pesquisa de chave é muito mais cara que a E / S residual. Eu tenho uma configuração de teste sem muitos dados de teste (ainda), mas quando o código entra em produção, ele precisa trabalhar com muito mais dados, por isso tenho certeza de que é necessário algum tipo de índice não clusterizado.
As pesquisas principais são realmente tão caras , quando você executa SSDs, que preciso criar índices completos (com muitas colunas de inclusão)?
Plano de execução: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Faz parte de um longo procedimento armazenado. Procure IX_BatchNo_DeviceNo_CreatedUTC
.
sys.dm_exec_query_profiles
, nós a custearemos dos custos reais versus os estimados). Pare de usar o% estimado de custo como indicador absoluto de custo - é relativo e geralmente sai para almoçar.