Avalados por :

Reorganização de índices para melhorar o desempenho em uma tabela de grande porte

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 1 Vistas
0
Cargando...

Olá a todos,

Entendo que esta é uma pergunta comum, mas senti que seria melhor esclarecer.


Tenho uma tabela enorme que consome 95 GB de espaço. Ela tem um índice agrupado em cinco colunas (ID, Nome, Classe, Nome do Grupo e Estado). A coluna ID é uma coluna de identidade com precisão 15 e escala 0. Tínhamos um problema de linhas duplicadas devido à coluna de identidade nesta tabela.

Por exemplo, de acordo com nossas necessidades comerciais, não deveríamos permitir duas linhas com os mesmos valores de Nome, Classe, Nome do Grupo e Estado. Nosso servidor ASE é acessado por outra aplicação - dbAnalytics que irá inserir, atualizar e excluir registros de nosso banco de dados. Quando uma linha é inserida pela primeira vez, ela será inserida com o estado inserido. Quando dbAnalytics tenta atualizar o mesmo registro no banco de dados, deve atualizar o registro existente e alterar a coluna de estado para atualizado. Temos um problema aqui. A coluna de identidade gera novos valores de ID e insere as linhas como um novo registro em vez de atualizar o existente. Não entendemos completamente como o dbAnalytics funciona, portanto, estamos tentando resolver isso no backend.

Devido aos problemas encontrados com a coluna de Identidade, decidimos remover a coluna ID do índice agrupado e recriá-la em 3 colunas, ou seja - Nome, Classe e Nome do Grupo.

Segundo nosso conhecimento, o índice agrupado ordenará os dados em ordem classificada, o que ajudaria nas consultas de intervalo. Como estamos removendo a coluna ID que ajudava a ordenar os dados na tabela sequencialmente, tenho dúvidas sobre os problemas de desempenho que poderíamos ter no futuro se criarmos um índice agrupado. Como o índice agrupado tende sempre a manter os dados em ordem classificada, há uma sobrecarga adicional em reorganizar os dados durante inserções ou atualizações.

Portanto, estamos pensando em criar um índice não agrupado ou um índice não agrupado único nessas três colunas (Nome, Classe e Nome do Grupo). Temos uma preocupação sobre o desempenho do disco adicional necessário para navegar até a página de dados a partir da página de índice. Esperamos que isso não tenha um grande impacto.

Precisamos de ajuda para decidir se devemos optar por um índice agrupado ou não agrupado com base na análise detalhada acima. Por favor, avise-nos se houver alguma outra abordagem melhor disponível.

Obrigado antecipadamente.

Saudações
ADNAN

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Parece que estás describiendo un problema de clave duplicada en lugar de un problema de fila duplicada. Una fila duplicada solo ocurre cuando todas las columnas de dos filas tienen los mismos valores.

También parece que dbAnalytics debe estar realizando una inserción en lugar de una actualización. Puedes confirmarlo utilizando la auditoría de cmdtext o a través de la tabla de monitoreo MDA monSysSQLText.

Si dbAnalytics está realizando una inserción en lugar de una actualización, es probable que comience a fallar cuando intente insertar la fila de estado "actualizada" una vez que tengas el índice único solo en (Nombre, ClassName y GroupName).

Como alternativa, podrías usar un trigger de inserción para eliminar la fila original con estado "insertado" o (actualizar la fila original para tener estado 'actualizado' y eliminar la fila recién insertada que activó el trigger).

Realmente parece que debes comprender mejor cómo funciona dbAnalytics para que tu base de datos funcione correctamente con él.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Depende de em que "intervalo" estão suas consultas. Estão buscando em um intervalo por ID? Estão buscando em um intervalo de valores de "Nome"? Quão grande é o intervalo?

Tenha em mente que uma coluna de identidade como "ID" é mais ou menos um valor que aumenta de forma monótona. Se você agrupar uma tabela por ID, então todas as inserções tendem a ocorrer no "final" da cadeia de páginas, ou mais especificamente em uma extensão. Isso é verdade para um índice não agrupado liderado pela coluna de ID, com conteúdo no final da cadeia. Sua pergunta sobre "Melhor desempenho" depende do que você está medindo em termos de desempenho. Exclusões em massa? Cargas em massa? Consultas específicas? Critérios de pesquisa específicos? Tudo depende. Se nada mais, experimente e meça de ambas as formas. Assim não haverá suposições de alguém como eu que não sabe nada sobre seus dados, aplicativos ou padrões de processamento empresarial.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Kevin,

Lamento muito ter fornecido informações incompletas. Também vamos remover a coluna de estado juntamente com a coluna de ID. Portanto, ficaremos apenas com três colunas que são Nome, Classe e Nome do Grupo. O índice será criado nessas três colunas.

Espero que, neste ponto, nosso objetivo seja verificar se a criação de um índice agrupado nessas três colunas produz um melhor desempenho do que a criação de um índice não agrupado. Minha preocupação é que, uma vez que a coluna de ID será removida, o índice agrupado possa não ser eficaz e afetar as consultas de intervalo.

Por favor, me avise se minha compreensão está correta e me diga a estratégia de índice correta.

Muito obrigado antecipadamente.

Saudações

ADNAN

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Não está claro de todo o que estás tentando alcançar aqui porque as tuas sugestões chave não fazem sentido quando lidas juntas. Indicas uma regra de negócio de unicidade em 4 colunas:

nossas necessidades comerciais indicam que não deveríamos permitir duas linhas com o mesmo Nome, Classe, Nome de Grupo e Estado

no entanto, descreves uma estratégia que implica um índice único em 3 colunas:

estamos pensando em criar Índice não agrupado ou Índice não agrupado único nessas três colunas (Nome, Classe e Nome de Grupo)

Precisas decidir qual é a tua chave natural na realidade. Se "Estado" faz parte da chave, tenho certeza de que a tua aplicação considera esse facto e não atualizaria um valor de chave, mas simplesmente inseriria uma linha "única" diferente (duplicada apenas se a tua chave NÃO incluir "Estado"). Não tenho a certeza do porquê de precisares de uma coluna de identidade na chave a menos que a estejas a usar como uma chave artificial ou como um critério de pesquisa.

Tua descrição de uma "atualização" pela aplicação soa mais como uma inserção separada, por isso suspeito que "Estado" seja considerado parte da chave e os valores de chave não devem ser atualizados. Talvez a tua solução seja tão simples como remover "Estado" da definição da chave principal da tabela. Caso contrário, faria sentido existirem dois registos, um para "inserido" e outro para "atualizado".

Sobre Agrupado vs Não Agrupado: a razão principal para um Índice agrupado é que desejas uma linha fisicamente junto a outra. Se estás a procurar nesta tabela com base numa pesquisa de chave parcial ou desejas a ordem dos resultados pela chave, então o Índice agrupado é uma vantagem.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?