Problemas de performance en Odoo - detectando indices faltantes en PostgreSQL

Gustavo Orrillo
- 12/17/2018 - 1 min. de lectura

Un problema con el que uno se enfrenta apenas empieza a crecer Odoo es la performnace del mismo. Y diría que la mitad de dichos problemas estan relacionados con PostgreSQL. No se confundan, PostgreSQL es una excelente base de datos. Pero necesitamos saber administrarla para que la misma tenga buen rendimiento.

Un punto fundamental es la falta de indices en la base de datos. Leyendo el libro Troubleshooting PostgreSQL. Es un libro muy recomendable de Hans-Jürgen Schönig. 

El caso es que en el libro tienen un query muy pero muy bueno para detectar cuando faltan indices en la base de datos:

select schemaname,relname,seq_scan,seq_tup_read,idx_scan,seq_tup_read / seq_scan from pg_stat_user_tables where seq_scan > 0 order by seq_tup_read desc

Pruebenlo desde el psql, van a ver que les va a dar resultados más que interesantes. Basicamente les dice en que tablas estan teniendo sequential scans, y luego analizando los queries que se realizan... crear los índices necesarios.

Por ejemplo, ejecutando una variación del query (removiendo los índices y diciendo que me muestre las 10 tablas más importantes), obtenemos lo siguiente:


Como podrán ver, hay una tabla (account_padron) que tiene una gran cantidad de registros leidos. Pero son pocos scans (solo cinco) entonces podemos ignorarla. Las tablas que si necesitamos analizar son account_move y account_move_line, ya que ambas tienen más de cien mil sequential scans y cada una lee decenas de miles de registros en cada scan. Son tablas candidatas para ser optimizadas, en este caso hay consultas que se favorecerían con la creación de índices. 

Como conocer dichas consultas? Hay varias maneras. Una es agregando el parámetro log_min_duration_statement al archivo postgresql.conf. La otra es instalando en la base de datos la extensión pg_stat_statements. En el primer caso, el log dirá que consultas estan tardando más de un parámetro X (por lo general 500, lo que significa 500ms). La extensión pg_stat_statements genera vistas en PostgreSQL que te indican cuales son las consultas que más estan tardando. Es muy util, no genera mucho overhead y siempre vale la pena instalarlo.
 


 

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.