16
Cuando un query tarda mucho tiempo a pesar de que la columna sobre la que se filtra tiene un Ãndice es porque estamos pasando por alto algún detalle.
Hace poco en la oficina estábamos haciendo un query sobre una tabla que tenÃa poco menos que 1 millón de registros, la cuestión es que a pesar de que la columna sobre la que filtrábamos estaba indexada, la consulta seguÃa tardando aproximadamente 7 segundos, lo cual mataba nuestra aplicación.
El problema fue causado no por ignorancia, ni por deficiencias en el desempeño del servidor, sino más bien por un descuido, ya que el campo por el que filtraba era de tipo texto y el query lo hacÃamos asÃ:
SELECT idcity,idstate,zipcode WHERE zipcode = 33166
El query retornaba resultados validos, pero el problema es que no usaba el Ãndice, pues hacÃa un casteo debido a que la columna zipcode era de tipo texto y no numérica, asà que en vez de recorrer el Ãndice creado sobre la columna de tipo texto, hacÃa un barrido secuencial, lo cual ralentizaba el query.
El query debió haber sido escrito asÃ:
SELECT idcity,idstate,zipcode WHERE zipcode = '33166'
Esto sucedió como les contaba, debido a un descuido, y no me percaté hasta que revise detalladamente el resultado de un explain del query.
Bueno, para que no les pase a ustedes, es que les recuerdo que tengan mucho cuidado a la hora de escribir un query, y no olviden colocar los apostrofes en los campos de tipo texto.
Saludos, feliz semana!
¿Que pasa si aun campo de fecha se pone con los apóstrofes, o en un campo de número, genera algún problema o vuelve lenta la consulta?
Saludos.
@pepe
El problema por lo cual no te funciona el Ãndice como debido es simple, el planner de ejecución espera un indice de un tipo y en realidad le estas explicitamente pasando otro tipo, además el paso de casteo en postgresql involucra la ejecución de una función de casteo por cada registro algo que de igual manera te ralentizará la ejecución.