Partitionar tablas - opiniones y experiencias

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Estos temas los puedo desclasificar ahora que ya no trabajo ahí...


En los locos años 2006, para una de las patas de la solución del Transantiago se contrató a una empresa de desarrollo brasileña que había hecho un sistema de posicionamiento de buses en su ciudad.
El software trabajaba más o menos así: cada x minutos el bus transmitía a un servidor central su código de bus, la hora y la posición (pónganle que son dos coordenada numérica, para el caso da lo mismo) y una aplicación central lee esos registros y te va "dibujando" la ruta del bus en una pantalla.

Estos tipos habían desarrollado el sistema en su ciudad basados en MySql (si, un mysql 4 del año de la corneta) y las bases pedían que lo hicieran en Oracle. Tenían el know how y a pesar de que nunca habían trabajado con bases de datos Oracle, el sql ansi permitía que las mismas instrucciones sql les sirvieran en MySql y en Oracle.

Como yo tuve que ir a instalarles Oracle en los servidores de prueba y desarrollo estuve en las reuniones de coordinación y acá viene lo interesante: como los registros eran TAAAAANTOS, para hacer las lecturas más rápidas estos tipos habían partido la tabla de posiciones en ¡¡¡365 TABLAS!!!

No recuerdo el nombre de la tabla de posiciones así que supongamos que se llama POSICIONAMIENTO. Ya, estos tipos habían creado 365 tablas
POSICIONAMIENTO0101
POSICIONAMIENTO0102
POSICIONAMIENTO0103
..
..
POSICIONAMIENTO1229
POSICIONAMIENTO1230
POSICIONAMIENTO1231

(si amigos, la mansa paja)

¿Por qué eso? Porque como los datos eran tantos, aún cuando estuviera todo bien indexado la consulta se demoraba mucho si era una tabla única, así que estos tipos crearon 365 tablas y el código de la aplicación decidía en qué tabla guardar el registro. Si amigo desarrollador o amigo DBA, era una solución muy sconf.

En una de las reuniones de coordinación uno de los DBA Oracle se entera de eso y les dice
"Compadrito, esa huea en Oracle se soluciona con PARTICIONAMIENTO de la tabla POSICIONAMIENTO"

y los brasileños onda

3qTqgGJ.gif



y los DBAs les explicaron en qué consistía el particionamiento:
A grosso modo. divides físicamente una tabla en varios segmentos por algún criterio: día, mes, un número, etc.
- La idea es que los segmentos tengan más o menos la misma cantidad de registros para que la división tenga sentido.
- El otro dato a considerar es que el criterio para partir la tabla deba ser fijo, onda que no lo cambies. Una vez que un registro se insertó quedó para siempre en esa partición (creo que Oracle en sus últimas versiones permite mover registros entre particiones).
- Esto es transparente para la aplicación.
- Cuando haces una consulta, el motor de base de datos solito sabe a qué partición tiene que ir a buscar el registro solicitado.

A los desarrolladores brasileños se les explicó que al momento de crear la tabla se particionaba por día y en su código no tenían que hacer nada raro, simplemente llamar a la tabla POSICIONAMIENTO a secas para insertar y seleccionar.
"Pero la tabla tiene chillones de registros, los selects van a tardar mucho"
"Usted calmao compadrito, que si usted hace un select con where dia = 26 de enero, el motor de Oracle internamente va a buscar los registros solamente en el segmento físico correspondiente a la partición del 26 de enero"



También el @galansinchance me pidió una vez que le de una mano con reportería de un sistema basado en MySql así que saqué la vieja confiable del particionamiento y paff, mejora de rendimiento al toque.
 

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
y la empresa brasileña hizo el fixture o los tuvieron que cambiar?

Se tuvieron que adaptar a la recomendación, lo cual era un paso obvio porque era mucho más simple en todos los aspectos tener una tabla particionada llamada POSICIONAMIENTO que tener 365 tablas llamadas POSICIONAMIENTOxxyy.
 
Upvote 0

guaripolo

Fanático
Se incorporó
21 Agosto 2006
Mensajes
1.355
acá en el mundo SAP funcionamos con algo que se llama "dynamic data tiering", básicamente el motor particiona y determina que subir y que no subir a memoria. Es cosa de activar un flag.

Igual como somos más cuadraos tenemos las particiones definidas a mano por año (FISCYEAR en el mundo SAP), solo los últimos dos años "in memory" y el resto a warm data (aka, array de discos sólidos).

De las 22 tablas más grandes del datawarehouse, movimos a disco 1.797 millones de registros (64% de los registros, liberamos un 71% de memoria).

El culo es testear la wea con las réplicas en tiempo real que tenemos para algunas de las tablas del ERP (que sigue en Oracle) y además los simulacros de disaster recovery al site secundario.

:elaporte
 
Upvote 0

ranamaldita

mueranse
Se incorporó
24 Junio 2003
Mensajes
4.522
dentro de mi ignorancia sobre las bases de datos, vengo a aportar que algunas de las desarrolladoras del ese proveedor eran bien ricardas.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
En el sector hotelero he visto reservas_año, de los que funcionan con oracle hospitality, casi nadie toca nada por miedo a que se rompa Opera... de hecho algunos se han migrado a cloud o a un propio PC potente en el recito para tener un poco mas de agilidad en la velocidad del programa :santo
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
No se en que version mysql agrego el particionado de tablas pero en mariadb 5.5 ya estaba.
 
Upvote 0

Lordnet

Autoridad Ancestral de Transacciones
Se incorporó
11 Junio 2004
Mensajes
2.231
nosotros en una de las oracle tenemos 12 tablas. una por mes. y para buscar en todo usamos una vista que es el union de las 12 tablas.
cambiamos de mes, y se cambia la tabla del mes, remplazando el contenido por el mes nuevo purgando el viejo..

pero no chilión de tablas y puestas en en una especie de balanceador de carga :naster

y asi es mi historia de sistemas legacy
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
nosotros en una de las oracle tenemos 12 tablas. una por mes. y para buscar en todo usamos una vista que es el union de las 12 tablas.
cambiamos de mes, y se cambia la tabla del mes, remplazando el contenido por el mes nuevo purgando el viejo..

pero no chilión de tablas y puestas en en una especie de balanceador de carga :naster

y asi es mi historia de sistemas legacy

Así opinando cómo señora que mira por la ventana, tiene toda la pinta de que con particionamiento se resuelve eso. Aunque claro, se requiere un licenciamiento especial de Oracle que no es barato.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
No se en que version mysql agrego el particionado de tablas pero en mariadb 5.5 ya estaba.

Creo (ya ni me acuerdo) que en la versión 5 de MySql apareció la característica de particionamiento, antes de que lo comprara Oracle. Menos mal que ya tenía particionamiento gratuito para cuando fue comprado porque fijo que estos culiados de Oracle lo hubieran cobrado aparte.
 
Upvote 0

mmirandap

Gold Member
Se incorporó
1 Septiembre 2006
Mensajes
2.473
Por pega me ha tocado particionar una bdd mysql 5.7.30 (particiones de ene a dic) y aun no entiendo el por qué. La app que usa esa base es zabbix y genera miles de registros.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.602
Tal como había dicho anteriormente, nosotros hicimos pruebas en producción con particionamiento de tablas y la verdad no vimos muchas mejoras: onda de un 1% a 2% y sería. Creo que hubo una sola consulta que era un 6% más rápida, pero era LA consulta aislada que se hacía 1 vez al día en vez de aquellas que cada segundo se hacían varias veces.

En la gran mayoría de los casos incluso era más lento que sin particionar, así que optamos por lo sano y decidimos bajar la complejidad: una sola tabla sin particionamiento.

Al final resultó una buena movida pq menos complejidad == menos jaleo para gente nueva que se estaba metiendo en esa área del sistema == menor factor de bus.

Aún así, quedé con la sensación de que a menos que estés trabajando con millones y millones de registros, simplemente no vale la pena. Casi cualquier consulta era más fácil de hacerla colocando un par de indexes y modificando las consultas lijeramente para aprovecharlas de mejor forma: era un use-case mucho más generalizado donde valía la pena acumular experiencia antes que empezar con el edge-case de particionamiento.

Saludos.

PD: Todo esto basado en MySQL. No tengo ni la menor idea de qué versión corríamos cuando hicimos las pruebas, pero bueno, he pasado por 2 pegas distintas ya (dicen las malas legnuas que ya debo estar ganando 10 millones al mes gracias al corte de pelo tipo carabinero!) así que debe haber sido alguna versión de hace por lo menos 5 años atrás.

PD2: Una base de datos basada en documentos (Lucene, SOLR, ElasticSearch, etc) resultó mucho, pero muchísimo más rápido que cualquier formato de tablas basada en MySQL cuando teníamos que hacer búsqueda basada en texto suelto, así que preferimos en gran parte dedicar los esfuerzos a eso antes que seguir intentando por otro lado.

PD3: Dato curioso: casi eliminamos SOLR tb pq los resultados que daba eran "demasiado" buenos: resulta que la gente hacía más click en el segundo o tercer resultado antes que el primero en la lista. Esto hacía que la conversión utilizando SOLR era lijeramente más bajo (cerca de un 1.5% menos con un ~99.9% de certeza) que el grupo de control, sin embargo, debido a la facilidad de las consultas y la expertise generada durante el experimento, decidimos aceptarlo no más (aunque en experimentos posteriores hicimos algunos ajustes en PHP luego de la búsqueda pero antes de mostrarlo al usuario) y de esa forma ocuparlo en otras áreas posteriormente también era más fácil.

PD4: Wow, no puedo creerlo, pero por lo visto esa parte del código está EXACTAMENTE igual a como estaba hace 10 años atrás ajajajajj me acuerdo de la estructura de las URLs y está igual, aunque al parecer sí cambiaron el orden de cómo se despliegan los resultados.
 
Última modificación:
Upvote 0
Subir