Eu tenho uma tabela no servidor sql digamos TableA. e uma outra tabela como TableB. Ambas as tabelas estão muito carregadas.
A Tabela A é carregada com os registros 35883788. Ela contém muitas duplicatas na coluna program_id.
A Tabela B é carregada com registros 27343331. Ela também contém uma duplicata na coluna em program_id. Por algum motivo comercial, precisamos manter registros duplicados em program_id em ambas as tabelas.
Agora estou realizando uma junção à esquerda em determinada tabela como:
select
a.*,b.date_of_birth,
datediff(year,b.date_of_birth,a.from_date)-
(case when dateadd(year,
datediff(year,b.date_of_birth,a.from_date),b.date_of_birth)
> a.from_date then 1 else 0
end) as age_final,
case when datediff(yyyy,b.date_of_birth,a.from_date) is null then ''
when datediff(yyyy,b.date_of_birth,a.from_date) <=1 then 'less than 1 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=17 then 'then 1 - 17 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=29 then 'then 19 - 29 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=39 then 'then 30 - 39 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=49 then 'then 40 - 49 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=59 then 'then 50 - 59 year'
when datediff(yyyy,b.date_of_birth,a.from_date) <=64 then 'then 60 - 64 year'
else 'More than 64 years' end as Age_band
from TableA a
left join ( select program_id,date_of_birth,max(process_date)
from TableB
group by program_id,date_of_birth) b
on a.program_id=b.program_id;
minha consulta interna está me dando um conjunto exclusivo de program_id usando group by statement.
Nenhuma dessas tabelas está indexada. Se eu tiver que criar um índice em ambas as tabelas, que tipo de índice eu preciso ter no program_id para ambas as tabelas.
o que todas as outras coisas eu posso cuidar para melhorar o desempenho da junção.
preciso de sugestão para otimizar a junção e os índices.
DDL e DML na parte inferior
Índices padrão que podem ser criados com base nas informações fornecidas
Executando a consulta
O índice NC on
TableA
é usado, poisID
está incluído no índice NC e nenhuma outra coluna está,TableA
exceto aprogram_id
coluna, que é uma coluna chave desse índice.Mas , como você está usando
select a.*
, provavelmente terá que adicionar todas essas colunas ao índice NCTableA
como colunas incluídas, o que aumentará o tamanho do seu índice dependendo da quantidade de colunas na tabela.Se adicionarmos uma
varchar(3)
coluna e a preenchermos com um valor:O índice não é mais usado:
Por causa da
bla
coluna adicional adicionada:Para corrigir isso , recrie o índice com a
bla
coluna incluída.Adicionalmente
As tabelas de heap não são ideais, você deve considerar adicionar um índice clusterizado que faça sentido e ler sobre a indexação.
Mais sobre a diferença entre tabelas de heap e tabelas com um índice clusterizado aqui
Usar
Select *
não é uma boa prática, considere nomear todas as colunas usadas em sua instrução select separadamente.Maus hábitos para chutar: usando SELECT *
DDL + DML usado para teste