Mejorar el rendimiento de
una vista.
Si al ejecutar una vista demora en devolver los
resultados, una solución podría ser hacerla indexada, para que guarde la
información y no tenga que unir todas las tablas que componen la vista cada
vez.
Los índices se utilizan para buscar las filas con
valores de columna específica rápidamente. Sin un índice, MySQL debe comenzar
con el primer registro y luego leer a través de toda la tabla para buscar las
filas correspondientes, y si la tabla es muy grande este proceso se demorará
más.
Si la tabla tiene un índice para las columnas que
se trate, MySQL puede determinar rápidamente la posición de buscar en el medio
del archivo de datos sin tener que mirar todos los datos. Por tanto, los índices
aumentan la velocidad de la consulta y si no están bien configurados o no se
tienen, puede traer como consecuencia el bloqueo de MYSQL, que la Web vaya
lenta o incluso que el servidor se bloque o se caiga.
En caso de que la consulta SQL continúe lenta y no
se pueda solucionar mediante una vista indexada, habría que pensar en hacer
Triggers.
Los índices se crearían en los campos que se
utilizan para unir tablas (por ejemplo, si en una tabla se usa el idUsuario para
unirlo con la otra que también tiene idUsuario, se crearían dos índices, ambos
con idUsuario, para que la BD pueda unir las tablas más rápidamente). Esto sólo
es necesario en caso de que no sean campos de clave primaria, ya que éstos se
indexan automáticamente. Creo que se ganaría bastante si en las uniones se están
usando campos que no son clave primaria...
Se puede probar a crear los índices de las tablas
de una vista, porque eso se haría rápido (si por ejemplo una vista une 5
tablas, sería crear 5 índices o pocos más) y es fácil de comprobar si va bien o
no. Y si no funciona o no optimiza lo suficiente, pues hay que intentar lo
otro.
Problemas encontrados:
- En SQL SERVER 2005, por ejemplo, si hay tablas que se unen con OUTER JOIN no es posible tenerlo en vistas indexadas ya que las filas pueden desaparecer de forma lógica de una vista indizada basada en OUTER JOIN cuando inserte datos en una tabla de base. Esto hace que las vistas OUTER JOIN que son relativamente complejas de implementar se actualicen de forma incremental y el rendimiento de la implementación sería más lento que para las vistas basadas en (INNER) JOIN estándar.
- Hay ocasiones que si en vez de utilizar OUTER JOIN utilizamos INNER JOIN nos devolve menos registros de los que necesitamos.
- Otro problema es la dependencia de vistas con otras vistas. Es decir, si tengo una vista definida sobre otra vista. SQL Server no permite indizar la vista del nivel superior. En este artículo (http://www.microsoft.com/latam/technet/productos/servers/sql/2005/impprfiv.mspx) dicen que hay que expandir la definición de la vista anidada a mano en la vista del nivel superior y luego crear un índice, indizando la vista interna o no.
No hay comentarios:
Publicar un comentario