Eu tenho um banco de dados com três "níveis" de objetos: A
, B
e C
. A tabela A
tem cerca de 100.000 linhas, B
tem 500.000 e C
tem 2 milhões.
Em um ataque de estupidez, projetei o banco de dados para usar tabelas de junção AB
e BC
, embora sejam 1:me poderiam ter sido representados como um ParentA
atributo em B
e um ParentB
atributo em C
. Fiz isso porque pensei na época que esses poderiam ser m:m.
Agora, também tenho uma tabela D
que tem relacionamento am:m com C
. Para simplificar o gerenciamento de dados para os usuários, faz sentido permitir que eles se relacionem D
ou A
, B
em vez de diretamente, cada um deles C
.
Então, eu tenho tabelas DA
de junção , DB
e DC
, e uma visão de junção DC2
que inclui DC
, bem como as DC
relações herdadas das junções de DA-AB-BC
e DB-BC
. Eu uso um UNION ALL para isso e há alguma lógica de negócios para impedir que os usuários atribuam o mesmo D
registro em dois níveis.
O problema é que o desempenho de DC2
kinda suga. Todas as outras tabelas têm índices de cobertura apropriados para essas junções e os índices de cobertura são agrupados. DC2 não inclui tabelas A
, B
, C
ou D
, apenas as tabelas de união.
Há também as tabelas E, F, G e H que são semelhantes a D em como se relacionam com A, B e C.
Quais são algumas estratégias que posso usar para melhorar o desempenho desses relacionamentos herdados?
Já pensou:
- Criar
DC2
uma exibição indexada não é uma opção, pois UNION não é permitido em uma exibição indexada no MSSQL. - Eu poderia fazer do DC2 uma tabela e gerenciá-lo com gatilhos, mas isso seria uma dor de cabeça e ainda tenho que lidar com EC2, FC2 etc. não consigo onde
- Mudar AB e BC em atributos de B e C pode, na verdade, desacelerar as coisas, já que as tabelas de junção são mais leves e as tabelas principais não são unidas a DC2 com frequência.
Eu olharia para sua exibição indexada ao contrário:
Tenha a tabela O para seus objetos, armazenando A, B e C, e um campo de nível. Em seguida, crie exibições indexadas para A, B e C com base nas consultas de O. Talvez use um campo de hierarquia para conhecer a árvore completa para cada registro.
Há muito mais que você poderia fazer, mas isso pode ser um começo útil.