Sí, soy consciente de que la normalización de datos debería ser mi prioridad (tal como es).
- Tengo una tabla con 65 columnas que almacenan los datos del vehículo con columnas:
used_vehicle
,color
,doors
,mileage
,price
y así sucesivamente, en total 65. - Ahora, puedo dividir eso y tener una
Vehicle
mesa,VehicleInterior
,VehicleExterior
,VehicleTechnical
,VehicleExtra
(todo lo que uno-a-uno con el principalVehicle
tabla).
Supongamos que tendré alrededor de 5 millones de filas (vehículos).
Encendido SELECT
con una WHERE
cláusula: ¿El rendimiento será mejor buscando (ambos casos indexados al menos en IDs
):
Vehicle
mesa con 65 columnas oVehicle
tabla conJOINS
otras cuatro tablas (todas con 5 millones de filas) para devolver todos los datos relacionadosVehicle
?
(Según el motor de base de datos, considere PostgreSQL y / o MySQL).
¿Aprecia realmente alguna información detallada que pueda tener de su experiencia previa?
postgresql
database-design
performance
partitioning
postgresql-performance
Urim Kurtishi
fuente
fuente
VehicleInterior
, otras consultas que tienen que ver con las columnas de únicaVehicleTechnical
, etc., o si hay muchas filas / vehículos que no tienen absolutamente ninguna información sobre (por ejemplo)VehicleExtra
por lo en lugar de muchas filas con muchos valores nulos en una tabla, tiene filas en el resto de las tablas y ninguna fila enVehicleExtra
Respuestas:
Suponiendo que estamos hablando de relaciones 1: 1 entre todas las tablas.
El almacenamiento general es prácticamente siempre (sustancialmente) más barato con una sola tabla en lugar de varias tablas en una relación 1: 1. Cada fila tiene 28 bytes de sobrecarga, más típicamente unos pocos bytes más para relleno adicional. Y debe almacenar la columna PK con cada tabla. Y tenga un índice separado (redundante) en cada una de estas columnas ... El tamaño sí importa para el rendimiento.
Esto es incluso cierto si muchas columnas son NULL en la mayoría de las filas porque el almacenamiento NULL es muy barato :
Al recuperar todas las columnas, una sola tabla es sustancialmente más rápida que 5 tablas unidas. También es mucho más simple . Puede ser difícil unir cinco tablas si no todas las filas están presentes en todas las tablas. Con
WHERE
condiciones dirigidas a una sola tabla, es bastante fácil agregar otras tablasLEFT JOIN
. No es tan trivial si tiene predicados en varias tablas ...La partición vertical aún puede mejorar el rendimiento de ciertas consultas. Por ejemplo, si el 90% de sus consultas recuperan las mismas 5 columnas de las 65 disponibles, esto sería más rápido con una tabla que solo contenga estas 5 columnas.
OTOH, es posible que pueda atender tales consultas en unas pocas columnas seleccionadas con un índice de "cobertura" que permita escaneos de solo índice .
Otro candidato para la partición vertical: si tiene muchas actualizaciones en solo unas pocas columnas, mientras que el resto casi nunca cambia. Podría ser considerablemente más barato dividir filas en tal caso, ya que Postgres escribe una nueva versión de fila para cada actualización. Hay excepciones para grandes valores almacenados fuera de línea ("TOASTed"). Más detalles:
Realmente depende de la situación completa. En caso de duda, opte por la solución simple de tener una sola mesa, especialmente si representa bien la realidad: en su ejemplo, esos son todos los atributos de un automóvil y tienen sentido juntos.
fuente
Una selección en una sola tabla siempre debe ser más rápida. Tan pronto como haya encontrado su vehículo, ya tiene todos los detalles.
Sin embargo, pierde la eficiencia de la normalización. Por ejemplo, si 1 automóvil tuviera muchos modelos con diferentes opciones.
¿Es esta una base de datos de referencia de todos los automóviles? ¿O una lista de vehículos de segunda mano? ¿Habría muchos ejemplos de la misma marca / modelo con las mismas opciones?
Editar: debería calificar mi respuesta como rdbms genérico en lugar de postgres específico. Me remito a la respuesta detallada de @ Erwin específica para postgres
fuente