CC No. 77.033.890 Cmo optimizar una base de datos mediante el Asistente para la optimizacin de motor de base de datos La optimizacin del acceso a los datos es vital para el tiempo de carga de la pgina, debido a que suele ser el factor que ms afecta al tiempo que tiene que esperar el navegador para recibir el HTML. Este tiempo de espera es muy importante, ya que el resto de recursos de la pgina (imgenes, scripts y hojas de estilo), no se empiezan a bajar hasta que el navegador no lee el HTML desde el que se hace referencia a estos recursos. Este tipo de optimizacin es probablemente la ms compleja de todas, en primer lugar porque depende de dos factores variables en el tiempo: por un lado, de cmo y de qu tipo son las consultas que se van a realizar y, por otro, de la carga de trabajo que tenga que soportar el servidor o servidores. En segundo lugar por la gran cantidad de conocimientos que hay que tener para saber reescribir consultas, reescribir el cdigo que ejecuta las consultas, crear ndices, vistas materializadas, particiones horizontales y verticales, rplicas, tablas de apoyo, saber elegir los tipos de datos a usar, saber optimizar el esquema sin perder la lgica del modelo de negocio, saber ajustar los parmetros de configuracin del SGBD, conocer y saber usar sistemas de cach externos. Adems cada uno de estos puntos, de los que hay muchos libros escritos, se debe abordar de forma distinta dependiendo de qu SGBD
SQL Server 2008 R2
Puede utilizar la GUI (interfaz grfica de usuario) del Asistente para la optimizacin de motor de base de datos para optimizar bases de datos mediante tablas o archivos de carga de trabajo. La GUI del Asistente para la optimizacin de motor de base de datos le permite ver con facilidad los resultados de la sesin de optimizacin actual y los resultados de sesiones anteriores. Para obtener ms informacin, Para optimizar una base de datos mediante una tabla o archivo de carga de trabajo como entrada 1. Determine las caractersticas de la base de datos (ndices, vistas indizadas y particiones) que desea que el Asistente para la optimizacin de motor de base de datos tenga en cuenta para agregarlas, quitarlas o mantenerlas durante el
2. 3.
4. 5.
anlisis. Para obtener ms informacin, vea Acerca de las cargas de
trabajo y Consideraciones para usar el Asistente para la optimizacin de motor de base de datos. Cree una carga de trabajo. Para obtener ms informacin, vea Cmo crear cargas de trabajo Inicie el Asistente para la optimizacin de motor de base de datos e inicie sesin en una instancia de Microsoft SQL Server. Para obtener ms informacin, vea Iniciar el Asistente para la optimizacin de motor de base de datos. En la ficha General, escriba un nombre en Nombre de sesin para crear una nueva sesin de optimizacin. Seleccione Archivo de carga de trabajo o Tabla y escriba la ruta de acceso al archivo o el nombre de la tabla en el cuadro de texto adyacente.
El formato para especificar una tabla es: database_name.schema_name.table_name
1. Para buscar una tabla o archivo de carga de trabajo, haga clic en el
botn Examinar. El Asistente para la optimizacin de motor de base de datos presupone que los archivos de carga de trabajo son archivos de sustitucin incremental. Para obtener ms informacin acerca de los archivos de sustitucin incremental, Al usar una tabla de traza como una carga de trabajo, esa tabla debe existir en el mismo servidor que el Asistente para la optimizacin de motor de base de datos est optimizando. Si crea una tabla de traza en otro servidor, muvala al servidor en el que el Asistente para la optimizacin de motor de base de datos est realizando la optimizacin antes de utilizarla como carga de trabajo. 2. Seleccione las bases de datos y tablas en las que desea ejecutar la carga de trabajo seleccionada en el paso 5. Para seleccionar las tablas, haga clic en la flecha Tablas seleccionadas. 3. Seleccione Guardar registro de optimizacin para guardar una copia del registro de optimizacin. Desactive la casilla de verificacin si no desea guardar una copia del registro de optimizacin. Puede ver el registro de optimizacin despus del anlisis; para ello, abra la sesin y seleccione la ficha Progreso. 4. Haga clic en la ficha Opciones de optimizacin y seleccione las opciones que figuran en la lista. Para obtener ms informacin, vea Opciones de optimizacin disponibles. 5. Haga clic en el botn Iniciar anlisis de la barra de herramientas. Si desea detener la sesin de optimizacin una vez iniciada, en el men Acciones seleccione una de las siguientes opciones:
Detener anlisis (Con recomendaciones) detiene la sesin de
optimizacin y pregunta al usuario si desea que el Asistente para la optimizacin de motor de base de datos genere recomendaciones basadas en el anlisis realizado hasta este punto. o Detener anlisis detiene la sesin de optimizacin sin generar ninguna recomendacin. Optimizacin de consultas o
Para finalizar, algunos breves consejos para optimizar consultas:
Cambiar los OR por IN, cuando tenemos ms de un valor para comparar.
Minimizar el coste de los JOIN: La concatenacin natural o JOIN es la operacin ms costosa de las bases de datos relaciones, ya que requiere realizar una multiplicacin cartesiana y una seleccin de valores. Algunas tcnicas que podemos usar para minimizar su efecto consisten en: Reordenarlos para concatenar primero las relaciones con menos filas para reducir el nmero de cruces. Crear subconsultas en donde se filtren o limiten el nmero de filas de las relaciones grandes antes de realizar los siguientes JOINs. A veces, dividir una consulta en varias, es mejor que hacerlo todo con una sola consulta, de forma que podemos obtener en una primera consulta unos pocos identificadores que podemos pasar con un IN a la siguiente consulta, en lugar de realizar un JOIN. Cambiar los JOIN por EXISTS si no se va a mostrar ningn dato de la relacin con la que se realiza el cruce. Tener en cuenta el problema del N + 1: El n+1 se produce normalmente cuando tenemos un listado en el que para mostrarlo como queremos, por cada tem necesitamos realizar una consulta adicional (el ms uno del n+1). En este caso, suele ser mejor realizar uno o varios JOIN adicionales, en la consulta que recupera el listado de tems. De esta forma obtenemos el listado tal y como lo necesitamos, y no se tienen que lanzar consultas adicionales para cada tem. Especificar siempre los nombres de las columnas en las SELECT, si no el SGBD leer todas las filas del disco. El asterisco se debe usar s y solo s se utiliza COUNT, en cuyo caso el SGBD sabr que no tiene que leer todas las columnas. Crear ndices: los ndices permiten un acceso a los datos no secuencial mucho ms rpido, pero son costosos de crear, as que no es conveniente su uso si tenemos muchas ms lecturas que escrituras. Debemos analizar el plan de ejecucin de las consultas (cada SGBD tiene su manera de verlo) para saber donde debemos crear ndices. Normalmente, crearemos los ndices en claves ajenas y en las columnas que se usen
con ORDER BY o WHERE. Si se crean ndices compuestos, se deben poner las
columnas en el mismo orden que se vayan a usar en las consultas Cachear las consultas ms frecuentes Activar la cach de base de datos del SGBD a veces puede empeorar el rendimiento. Esto depende del volumen de datos al que se acceda ms frecuentemente. Si el volumen de datos es alto y se actualiza frecuentemente, estaremos siempre escribiendo en la cach en lugar de leer de ella. As que normalmente es preferible recurrir a un sistema de cach externo, en el cual podamos controlar que se van a cachear realmente los datos ms frecuentes y ms frescos. Si el sistema de cach no nos provee de esta funcionalidad, podemos implementarla nosotros. Una buena forma de hacerlo sin el sobrecoste de almacenar el nmero de veces que se accede a una consulta, es generar un nmero aleatorio y cachear la consulta si ese nmero pasa de cierto valor. Por ejemplo, supongamos que generamos un nmero aleatorio entre 1 y 100 y la consulta se cachea si dicho nmero es menor que 10, de esta forma se guardar la consulta en cach con una probabilidad del 10% en cada peticin, as si la consulta tiene ms peticiones, ser ms probable que se guarde en cach. Optimizar la paginacin La paginacin suele ser una tarea costosa cuando tenemos que mostrar varios nmeros de pgina, porque para eso se tiene que calcular el nmero de filas en la relacin, lo que puede requerir una lectura completa de la misma, dependiendo del SGBD. Siempre ser ms eficiente mostrar enlaces de anterior y siguiente, recuperando todas las filas a mostrar y una ms, de manera que se muestra el enlace de siguiente pgina, si nos llega esta fila adicional desde la BD. Alternativamente, podemos mantener en una relacin independiente el nmero de filas. Otra cosa que puede afectar a las paginaciones, es que cuando estamos en una pgina interior se deben descartar un cierto nmero de filas, pertenecientes a las pginas anteriores, y que son ledas del disco con todas las columnas que aparezcan en la consulta. Una forma de evitar esto es realizar un JOIN con una subconsulta que recupere los identificadores que necesitamos antes de leer toda la informacin. Ejemplo: SELECT dato1, dato2, dato3 FROM Foo INNER JOIN( SELECT id FROM Foo ORDER BY dato1 LIMIT 50,10) AS FooPaginado USING(id)