2011-02-16 12 views
6

Al resolver problemas en un servidor con una espera de E/S muy alta, observo que hay muchas E/S provenientes de consultas que hacen SELECT max(x) FROM t WHERE y = ?.Escaneo del índice hacia atrás en comparación con el escaneo del índice

Mi índice es btree (x, y).

Me di cuenta de que el plan de consulta hace Index Scan Backward para obtener el máximo. ¿Es tan malo? ¿Debo preocuparme por eso y quizás agregar otro índice (revertido)? ¿O hay una mejor manera de crear un índice adecuado para este tipo de consultas?

Respuesta

12

No, no está mal, lleva la misma cantidad de tiempo comenzar con la primera página de índice, ya que tomaría comenzar con la última página de índice. Puede ver la "diferencia" al crear un índice descendente, usando DESC.

Un índice (y, x) probablemente sería mejor para esta consulta.

+0

Creando un índice en (y, x) costo de consulta reducido de 10k a 300 y tiempo de consulta enormemente reducido. Tener x DESC no hace ninguna diferencia. ¡Gracias por el consejo! – ibz

+0

Impresionante, gracias por este señor! Tuve un problema similar e impacto de rendimiento comparable después de cambiar el índice. – TheDeadSerious

+0

https://stackoverflow.com/users/271959/frank-heikens ¿Puede explicar por qué un índice en (y, x) tendrá un tiempo de consulta menor que un índice en (x, y). Gracias. – nisanth074

2

El índice está ordenado, con el valor más bajo primero. Para encontrar el valor máximo, una exploración de índice hacia atrás encontraría primero el valor máximo :).

Supongo que un SELECT min (x) daría como resultado un escaneo de índice normal, ¿o sí?

+0

Sí, min (x) realiza un escaneo normal. – ibz

Cuestiones relacionadas