es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Partición de tablas para evitar bloqueos

TLDR; Estoy tratando de particionar una tabla de manera que cada partición pueda operarse sin bloquear a las demás, pero no está funcionando.

Antecedentes: Estoy creando un proceso de pipeline de datos que exporta datos desde una base de datos central de la empresa a una base de datos de SQL Server, donde se pueden utilizar para análisis. Necesito exportar la tabla completa cada día (actualmente eliminando la antigua, la archivación viene después) y puede ser de casi 10GB.

Para que sea lo suficientemente rápido como para ser utilizable, divido la tabla en 15 fragmentos basados en una columna llamada “plan”. Esto se hace en el pipeline de datos para que cada uno de los 15 valores posibles en la columna “plan” se trate de forma independiente; cada fragmento del plan se extrae de la base de datos de la empresa, después de lo cual los datos antiguos para ese fragmento se eliminan en la tabla de SQL Server y se carga los nuevos datos.

El problema es que al hacer esto en 15 fragmentos significa que todos los procesos se bloquean entre sí. Todo tiene que esperar a todo lo demás, lo que hace que todo vaya MUY lento al final, y a menudo falla debido a tiempos de espera.

Para solucionar esto he realizado lo siguiente:
1. Creé 16 grupos de archivos de SQL Server para la tabla en
2. Agregué un archivo a cada grupo de archivos
3. Particioné la tabla en base a la columna “plan” (el límite para cada grupo de archivos es el nombre de un plan)

Según la respuesta aquí, esto debería permitirme “eliminar o agregar grandes cantidades de datos de un solo golpe”.

Sin embargo, esto no parece estar ayudando; todavía obtengo bloqueos.

Entonces, dos preguntas:
1. ¿Es posible particionar de manera que cada partición se pueda manejar sin bloquear a las demás? Si es así, ¿cómo?
2. ¿Tengo que volver a ejecutar el trabajo de particionado cada día? Los diversos tutoriales que he encontrado sobre particionado a veces parecen implicar esto; no me queda claro si la base de datos mantiene automáticamente la partición o no.

Alternativa También he considerado dividir la tabla de destino en 15 tablas e intentar combinarlas con una vista. ¿Sería eso mejor? ¿Peor?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Particionando una tabla de SQL Server sin bloquear otras particiones

    Como experto en tecnología de la información especializado en SQL Server y particionamiento de bases de datos, comprendo que particionar una tabla puede ser un enfoque útil para mejorar el rendimiento al permitir una recuperación y consulta de datos más rápidas. Sin embargo, como se menciona en el contexto, existen problemas de bloqueo cuando varios procesos intentan operar en la misma partición de la tabla.

    Una solución potencial es utilizar el cambio de partición, que te permite reemplazar una partición por una nueva sin bloquear la tabla. Aquí están los pasos que puedes seguir:

    1. Crea una tabla de preparación que tenga el mismo esquema que la tabla principal.
    2. Carga los datos de un plan específico en la tabla de preparación.
    3. Cambia la partición de ese plan de la tabla principal a la tabla de preparación utilizando la instrucción ALTER TABLE con la cláusula SWITCH PARTITION.
    4. Fusiona los datos de la tabla de preparación en la tabla principal utilizando la instrucción MERGE.
    5. Repite para cada plan en la tabla.

    Este enfoque te permite operar en cada partición de forma independiente sin bloquear las otras particiones. Sin embargo, requiere más configuración y mantenimiento que simplemente utilizar grupos de archivos y particionamiento como se intentó originalmente.

    En cuanto a la segunda pregunta, una vez que hayas particionado la tabla, puedes dejarla tal como está y no necesitas volver a ejecutar la tarea de particionamiento cada día. La base de datos mantendrá el particionamiento automáticamente.

    En cuanto al enfoque alternativo de dividir la tabla de destino en 15 tablas y utilizar una vista para volver a combinarlas, puede ser más fácil de implementar al principio, pero no necesariamente será más eficiente en cuanto al rendimiento. También requiere más trabajo para mantener y consultar desde múltiples tablas en lugar de una tabla particionada.

    En resumen, particionar una tabla puede mejorar el rendimiento pero también puede generar problemas de bloqueo cuando varios procesos intentan operar en la misma partición. El cambio de partición puede ser una solución para operar en cada partición de forma independiente, y una vez que la tabla está particionada, no es necesario volver a ejecutar la tarea de particionamiento cada día. Dividir la tabla en múltiples tablas no necesariamente será más eficiente ni más fácil de implementar.

Comments are closed.