Digamos que tenemos una tabla con 6 millones de registros. Hay 16 columnas enteras y pocas columnas de texto. Es una tabla de solo lectura, por lo que cada columna entera tiene un índice. Cada registro es alrededor de 50-60 bytes.Postgresql - rendimiento del uso de una matriz en la base de datos grande
El nombre de la tabla es "Artículo"
El servidor es: 12 GB de RAM, 1,5 TB SATA, 4 NÚCLEOS. Todo el servidor para postgres.
Hay muchas más tablas en esta base de datos por lo que la RAM no cubre toda la base de datos.
Quiero agregar a la tabla "Artículo" una columna "a_elements" (tipo de matriz de enteros grandes) Cada registro no tendría más de 50-60 elementos en esta columna.
Después de eso me gustaría crear GIN índice en esta columna y consulta típica debería tener este aspecto:
select * from item where ...... and '{5}' <@ a_elements;
tengo también el segundo, más clásico, opción.
no añada a_elements columna a elemento de la tabla, pero crear elementos de una tabla con dos columnas:
- id_item
- id_element
Esta tabla tendría alrededor de 200 millones de registros.
Puedo hacer particiones en estas tablas por lo que el número de registros se reduciría a 20 mln en los elementos de la tabla y 500 K en el ítem de la tabla.
La segunda opción de consulta se parece a esto:
select item.*
from item
left join elements on (item.id_item=elements.id_item)
where ....
and 5 = elements.id_element
Me pregunto qué opción sería mejor en el punto de vista del rendimiento. ¿Posgres puede usar muchos índices diferentes con índice GIN (opción 1) en una sola consulta?
Necesito tomar una buena decisión porque la importación de estos datos me llevará 20 días.
¡Hola! ¿Y cuál es tu decisión final? Tengo casi la misma situación. –