Avalados por :

Reorganización de índices para mejorar el rendimiento en una tabla de gran tamaño

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

Hola a todos,

Entiendo que esta es una pregunta común, pero sentí que sería mejor aclararla.


Tengo una tabla enorme que consume 95 GB de espacio. Tiene un índice agrupado en cinco columnas (ID, Nombre, Clase, Nombre de Grupo y Estado). La columna ID es una columna de identidad con precisión 15 y escala 0. Teníamos un problema de filas duplicadas debido a la columna de identidad en esta tabla.

Por ejemplo, según nuestras necesidades comerciales, no deberíamos permitir dos filas con los mismos valores de Nombre, Clase, Nombre de Grupo y Estado. Nuestro servidor ASE es accedido por otra aplicación - dbAnalytics que insertará, actualizará y eliminará registros de nuestra base de datos. Cuando se inserta una fila por primera vez, se insertará con el estado insertado. Cuando dbAnalytics intenta actualizar el mismo registro en la base de datos, debería actualizar el registro existente y cambiar la columna de estado a actualizado. Tenemos un problema aquí. La columna de identidad genera nuevos valores de ID e inserta las filas como un nuevo registro en lugar de actualizar el existente. No entendemos completamente cómo funciona dbAnalytics, por lo tanto, estamos tratando de solucionar esto desde el backend.

Debido a los problemas encontrados con la columna de Identidad, hemos decidido eliminar la columna ID del índice agrupado y recrearlo en 3 columnas, a saber - Nombre, Clase y Nombre de Grupo.

Según nuestro conocimiento, el índice agrupado ordenará los datos en orden clasificado, lo que ayudaría en las consultas de rango. Dado que estamos eliminando la columna ID que ayudaba a que los datos en la tabla se ordenaran secuencialmente, dudo en los problemas de rendimiento que podríamos tener en el futuro si creamos un índice agrupado. Dado que el índice agrupado tiende siempre a mantener los datos en orden clasificado, hay una sobrecarga adicional en reorganizar los datos durante inserciones o actualizaciones.

Por lo tanto, estamos pensando en crear un índice no agrupado o un índice no agrupado único en estas tres columnas (Nombre, Clase y Nombre de Grupo). Tenemos una preocupación sobre el rendimiento del disco adicional necesario para navegar a la página de datos desde la página de índice. Esperamos que esto no tenga un gran impacto.

Necesitamos ayuda para decidir si podemos optar por un índice agrupado o no agrupado según el análisis detallado anteriormente. Por favor, también avísenos si hay algún otro enfoque mejor disponible.

Gracias de antemano.

Saludos
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 en qué "rango" están buscando tus consultas. ¿Están buscando en un rango por ID? ¿Están buscando en un rango de valores de "Nombre"? ¿Qué tan grande es el rango?

Ten en cuenta que una columna de identidad como "ID" es más o menos un valor que aumenta de forma monótona. Si agrupas una tabla por ID, entonces todas las inserciones tienden a ocurrir al "final" de la cadena de páginas, o más específicamente en un extensión. Esto es cierto para un índice no agrupado que está liderado por la columna de ID, con contendencia al final de la cadena. Tu pregunta sobre "Mejor rendimiento" depende de qué estás midiendo en términos de rendimiento. ¿Eliminaciones masivas? ¿Cargas masivas? ¿Consultas específicas? ¿Criterios de búsqueda específicos? Todo depende. Si nada más, prueba y mide de ambas formas. Así no habrá suposiciones de alguien como yo que no sabe nada sobre tus datos, aplicaciones o patrones de procesamiento empresarial.

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

Hola Kevin,

Lamento mucho haber proporcionado información incompleta. También vamos a eliminar la columna de estado junto con la columna de ID. Por lo tanto, nos quedaremos solo con tres columnas que son Nombre, Clase y Nombre de Grupo. El índice se creará en estas tres columnas.

Espero que, en este punto, nuestro objetivo sea verificar si la creación de un índice agrupado en estas tres columnas produce un mejor rendimiento que la creación de un índice no agrupado. Mi preocupación es que, dado que se eliminará la columna de ID, el índice agrupado no sea efectivo y pueda afectar las consultas de rango.

Por favor, házmelo saber si mi comprensión es correcta y dime la estrategia de índice correcta.

Muchas gracias de antemano.

Saludos

ADNAN

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

No está claro en absoluto lo que estás tratando de lograr aquí porque tus sugerencias clave no tienen sentido cuando se leen juntas. Indicas una regla de negocio de unicidad en 4 columnas:

nuestras necesidades comerciales indican que no deberíamos permitir dos filas con el mismo Nombre, Clase, Nombre de Grupo y Estado

sin embargo, describes una estrategia que implica un índice único en 3 columnas:

estamos pensando en crear índice no agrupado o índice no agrupado único en estas tres columnas (Nombre, Clase y Nombre de Grupo)

Necesitas decidir cuál es tu clave natural en realidad. Si "Estado" es parte de la clave, estoy seguro de que tu aplicación considera ese hecho y no actualizaría un valor de clave, sino que simplemente insertaría una fila "única" diferente (duplicada solo si tu clave NO incluye "Estado"). No estoy seguro de por qué necesitas una columna de identidad en la clave a menos que la estés usando como una clave artificial o como un criterio de búsqueda.

Tu descripción de una "actualización" por parte de la aplicación suena más como una inserción separada, por lo que sospecho que "Estado" se considera parte de la clave y los valores de clave no deberían actualizarse. Tal vez tu solución sea tan simple como eliminar "Estado" de la definición de clave principal de la tabla. De lo contrario, tendría sentido que existieran dos registros, uno para "insertado" y otro para "actualizado".

Sobre Agrupado vs No Agrupado: la razón principal para un índice agrupado es que deseas una fila físicamente junto a otra. Si estás buscando en esta tabla basándote en una búsqueda de clave parcial o deseas el orden de los resultados por la clave, entonces el índice agrupado es una ventaja.

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?