He tenido una consulta que ha estado funcionando bien durante aproximadamente 2 años. La tabla de la base de datos tiene aproximadamente 50 millones de filas, y está creciendo lentamente. La semana pasada, una de mis consultas pasó de regresar casi instantáneamente a tomar horas para ejecutarse.Consulta simple de trabajo durante años, luego de repente muy lento
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id')
He reducido la consulta lenta al modelo de rango. Parece tener algo que ver con el uso del último método(). Si solo solicito un conjunto de consulta, devuelve un conjunto de consulta vacío de inmediato.
#count returns 0 and is fast
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).count() == 0
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)) == [] #also very fast
Aquí están los resultados de ejecutar EXPLAIN. http://explain.depesz.com/s/wPh
y explicar ANALIZAR: http://explain.depesz.com/s/ggi
traté de aspirar la mesa, no hay cambio. Ya hay un índice en el campo "sitio" (ForeignKey).
Extrañamente, si ejecuto esta misma consulta para otro cliente que ya tiene objetos de rango asociados a su cuenta, la consulta vuelve muy rápido una vez más. Entonces parece que esto es solo un problema cuando no hay objetos Rank para ese cliente.
¿Alguna idea?
Versiones: Postgres 9.1, 1.4 Django tronco svn rev 17047
La configuración de un índice compuesto en el campo en el DONDE, así como el campo en ORDEN POR hizo el truco. Resulta que el planificador de consultas estaba escaneando todo el índice para el orden y luego haciendo el filtro. El índice compuesto hizo el truco. – erikcw