Temos uma consulta com uma pesquisa de chave que estima milhares de linhas por execução. Pelo que entendi, deve haver apenas uma linha por execução. Entendo que as estatísticas podem ser enganosas, mas o otimizador não entende que uma chave primária seria exclusiva?
A tabela envolvida nesta consulta tem uma chave primária agrupada desta forma:
/****** Object: Index [PK_Table_Name] Script Date: 6/16/2021 9:52:12 AM ******/
ALTER TABLE [dbo].[Table_Name] ADD CONSTRAINT [PK_Table_Name] PRIMARY KEY CLUSTERED
(
[Table_Name_ID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
Pelo que entendi, uma chave primária fornece uma referência exclusiva a uma única linha na tabela.
Portanto, para cada linha encontrada no índice não clusterizado, ele deve ser capaz de usar a referência desse índice ao índice clusterizado para recuperar a única linha necessária para satisfazer o restante da filtragem de consulta para a linha em que está atuando. (Este é um operador de junção de loops aninhados.)
Então, por que estima que quase 4.000 linhas serão retornadas como parte da pesquisa de chave? (Não "para todas as execuções", que em cerca de 36.000.000 é o produto dessas 4.000 e das 9.000 linhas que espera da busca de índice não clusterizado.)
As estatísticas de tempo de execução mostram 2.851 linhas e 2.851 execuções para essa busca de índice clusterizado, que é o que eu esperava.
Caso ajude, isso está no Banco de Dados SQL do Azure, com @@version
:
Microsoft SQL Azure (RTM) - 12.0.2000.8
Apr 29 2021 13:52:20
Copyright (C) 2019 Microsoft Corporation
Confira a postagem do blog de Paul White Bug de estimativa de cardinalidade com pesquisas para obter a resposta à sua pergunta:
A postagem do blog continua dizendo que uma correção foi planejada em agosto de 2020 para resolver isso no novo nível de compatibilidade 160: