SQL: ¿dividir una tabla grande según la frecuencia con la que se accede? - sql, postgresql

Tengo una tabla que tiene 50 campos:

  1. 10 campos que casi siempre son necesarios.
  2. 40 campos que rara vez son necesarios.

Más o menos diría que se necesita acceder a los campos en (1) 1000 veces más frecuentemente que en (2).

¿Debo dividirlos en dos tablas con una relación uno a uno, o mantener todo en la misma tabla?

Respuestas

1 para la respuesta № 1

El proceso que estás describiendo es a vecesreferido como "particionamiento vertical". Llevado a un extremo (una columna por partición vertical), así es como las bases de datos en columnas almacenan los datos. Desafortunadamente (hasta donde sé), Postgres no tiene actualmente soporte directo para la partición vertical.

Su idea de dividir los datos en dos tablas está bien. Me gustaría señalar lo siguiente:

  • Deberá modificar las consultas que usan las columnas adicionales para usar la segunda tabla. (Puedes envolver el join en una vista que utiliza cuando desea las columnas adicionales.)
  • Si ambas tablas tienen una clave primaria agrupada que las conecta, entonces la join Debería ser muy rápido.
  • Si está insertando / actualizando / eliminando datos, entonces debe tener cuidado con la sincronización. Creo que puedes manejar esto con un INSTEAD OF disparar en una vista combinando las tablas.
  • Si algunos registros no tienen columnas adicionales, esto puede ser una gran victoria en el espacio.
  • Si todos los registros y todas las columnas se van a cargar en el caché, entonces esto probablemente no sea una gran victoria.

Esto puede ser una gran victoria de rendimiento, en algunas circunstancias. Pero hay trabajo manual adicional para mantener las tablas sincronizadas.


0 para la respuesta № 2

Realmente no hay suficiente información aquí para estimar (no importa en realidad cuantificar) cuáles podrían ser los beneficios, pero los costos son muy claros: un código más complejo, un esquema más complejo, probablemente un mayor uso general del espacio y una sobrecarga de rendimiento al agregar y eliminar filas.

Una mejora en el rendimiento podría provenir deescanear una cantidad menor de datos cuando se realiza un escaneo completo de la tabla, o de una mayor probabilidad de encontrar bloques de datos en la memoria cuando sea necesario, y una huella de memoria general más pequeña, pero sin información específica sobre los tipos de operaciones que se realizan comúnmente, y si el servidor está bajo presión de memoria, no se pueden dar consejos confiables.

Tenga mucho cuidado de hacer que su sistema sea más complejo como efecto secundario de las ganancias inciertas de rendimiento.


Menú