Estou pensando em uma situação em que tenho duas colunas com alta densidade, mas essas colunas não são independentes.
Definição
Aqui está a definição da tabela que eu criei para fins de teste.
CREATE TABLE [dbo].[StatsTest](
[col1] [int] NOT NULL, --can take values 1 and 2 only
[col2] [int] NOT NULL, --can take integer values from 1 to 4 only
[col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different
[col4] AS ((10)*[col1]+[col2]) --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4
) ON [PRIMARY]
Dados
Os dados para o experimento são os seguintes
col1 col2 col3 col4
1 1 1 11
1 2 2 12
1 2 3 12
1 3 4 13
1 3 5 13
1 3 6 13
1 4 7 14
1 4 8 14
1 4 9 14
1 4 10 14
2 1 11 21
2 1 12 21
2 1 13 21
2 1 14 21
2 2 15 22
2 2 16 22
2 2 17 22
2 3 18 23
2 3 19 23
2 4 20 24
Etapa 1: filtrando por col1
SELECT * FROM StatsTest WHERE col1=1
Como esperado, o Query Optimizer adivinha o número exato de linhas.
Etapa 2: filtrando por col2
SELECT * FROM StatsTest WHERE col2=1
Novamente, temos uma estimativa perfeita.
Etapa 3: filtrando por col1 e col2
SELECT * FROM StatsTest WHERE col1=1 AND col2=1
Aqui, a estimativa está longe de estar próxima do número real de linhas.
O problema é que a implicação do analisador de consulta pressupõe que col1 e col2 são independentes, mas não são.
Etapa 4: filtrando por col4
SELECT * FROM StatsTest WHERE col4 = 11
Posso filtrar por col4 = 11 para obter os mesmos resultados da consulta na Etapa 3, porque col4 é uma coluna computada e de acordo com a forma como foi definida col1 = 1 e col2 = 1 é equivalente a col4 = 11 Aqui, no entanto , como esperado, a estimativa é perfeita.
Conclusão / Pergunta
¿Essa solução artificial e deselegante é a única opção disponível para obter estimativas precisas ao lidar com a filtragem por duas ou mais colunas não independentes? ¿A coluna computada e o filtro pela coluna computada são estritamente necessários para obter a precisão real?
Exemplo no sqlfiddle