OPTIMIZACIÓN DE CONSULTAS Y SQL AVANZADO

CONTENIDO
1 INTRODUCCIÓN.......................................................................................................................................3 1.1 1.2 2 2.1 2.2 2.3 2.4 2.5 3 3.1 3.2 3.3 3.4 3.5 4 5 PROPÓSITO DEL DOCUMENTO................................................................................................................3 INTRODUCCIÓN AL STRUCTURED QUERY LANGUAGE ..........................................................................3 COMPONENTES DEL SQL.......................................................................................................................4 CONSULTAS DE SELECCIÓN ..................................................................................................................4 CRITERIOS DE SELECCIÓN .....................................................................................................................6 AGRUPAMIENTO DE REGISTROS Y FUNCIONES AGREGADAS ................................................................7 CONSULTAS DE MANIPULACIÓN DE DATOS ...........................................................................................9 CONSULTAS DE COMBINACIÓN ENTRE TABLAS ...................................................................................11 INNERS JOINS .......................................................................................................................................12 OUTER JOINS ........................................................................................................................................14 CONSULTAS DE AUTOCOMBINACIÓN ..................................................................................................15 CONSULTAS DE COMBINACIONES NO COMUNES .................................................................................16

REVISIÓN DE CONCEPTOS BÁSICOS DE SQL.................................................................................4

CONSULTAS DE UNIÓN INTERNAS (JOINS)...................................................................................11

CONSULTAS DE UNIÓN EXTERNAS (UNIONS) ..............................................................................17 SUBCONSULTAS.....................................................................................................................................19 5.1 5.2 5.3 EMPLEO DE SUBCONSULTAS................................................................................................................19 GRUPOS CON SUBCONSULTAS..............................................................................................................21 CASOS PRÁCTICOS ...............................................................................................................................22 CONSEJOS GENERALES.........................................................................................................................23 EMPLEO DE ÍNDICES .............................................................................................................................25 SENTENCIAS CON JOINS. ......................................................................................................................31 SENTENCIAS CON SUBCONSULTAS.......................................................................................................32 VISTAS .................................................................................................................................................33 GENERALIDADES PARA LA OPTIMIZACIÓN DE SENTENCIAS SQL ........................................................34 TIPOS DE TABLAS ................................................................................................................................36 INDICES, TIPOS DE ÍNDICES..................................................................................................................42 PLAN DE EJECUCIÓN: INTERPRETACIÓN DE RESULTADOS...................................................................44 UTILIDADES DE INFORMACIÓN ESTADÍSTICA SOBRE LA EJECUCIÓN DE SENTENCIAS .........................45 ESTADÍSTICAS ......................................................................................................................................47

6

OPTIMIZACIÓN DE CONSULTAS ......................................................................................................23 6.1 6.2 6.3 6.4 6.5

7

OPTIMIZACIÓN ORACLE: DATABASE TUNING ...........................................................................34 7.1 7.2 7.3 7.4 7.5 7.6

8 9

DICCIONARIO DE DATOS ORACLE..................................................................................................48 DICCIONARIO DE DATOS SQL SERVER .........................................................................................51

Página 2 de 52 Curso Sql Avanzado.doc

© 2005 Global Technology Services

Optimización de consultas y SQL avanzado

1 1.1

Introducción Propósito del Documento

El presente documento es una introducción que pretende establecer las normas para el mejor uso del gestor de Base de Datos. Este conocimiento es fundamental para poder desarrollar procesos eficientes evitando cargas innecesarias al sistema y aprovechando al máximo los recursos disponibles. El objetivo de este documento es, por tanto, servir de guía a los desarrolladores que vayan a trabajar con Sql para que puedan desde un principio generar procesos eficientes, ahorrando trabajos de ajuste posteriores. Hay que recordar que por bueno que haya sido el trabajo de los DBA a la hora de crear y ajustar la base de datos en el servidor, una aplicación ineficiente hará inútil todo este esfuerzo. El conseguir un rendimiento eficiente es, por tanto, una tarea compartida de los administradores y los desarrolladores. Los ejemplos se han tratado de orientar hacia los gestores de bases de datos Oracle y SQL Server.

1.2

Introducción al Structured Query Language

El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado (ANSI), utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre los datos o sobre la estructura de los mismos: Es una forma estándar de consulta de datos específicos Es una forma de extraer y manipular datos de una base de datos Usado para todas las funciones de bases de datos, incluyendo administración, creación de esquemas y datos recuperables Puede ser usado de forma implícita dentro de una aplicación Pero como sucede con cualquier sistema de normalización hay excepciones para casi todo; de hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace diferente de otro motor, por lo tanto, el lenguaje SQL normalizado (ANSI) ha sido adaptado por los DBMS según peculiaridades, aunque si se puede asegurar que cualquier sentencia escrita en ANSI será interpretable por cualquier motor de datos.

.

Página 3 de 52 Curso Sql Avanzado.doc

© 2005 BearingPoint Global Technology Services

Optimización de consultas y SQL avanzado

2

Revisión de conceptos básicos de SQL

2.1

Componentes del SQL

El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos. Comandos DLL: CREATE, DROP, ALTER Comandos DML: SELECT, INSERT, UPDATE, DELETE, Cláusulas: FROM, WHERE, GROUP BY, HAVING, ORDER BY Operadores lógicos: AND, OR, NOT Operadores de Comparación: < , >, <>, <=, >=, =, BETWEEN, LIKE, In Funciones de Agregado: AVG, COUNT, SUM, MAX, MIN

2.2

Consultas de Selección

Las consultas de selección se utilizan para indicar al motor de datos que devuelva información de las bases de datos, esta información es devuelta en forma de conjunto de registros.

2.2.1

Consultas Básicas

La sintaxis básica de una consulta de selección es la siguiente: SELECT EmployeeID, LastName, FirstName FROM Employees; En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta de selección: SELECT ProductName, 'Precio unidad:', UnitPrice FROM Products

WHERE CategoryID = 3;

2.2.2

Ordenar los Registros

Se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la claúsula ORDER BY Lista de Campos: SELECT LastName, Address FROM Employees ORDER BY LastName;

Página 4 de 52 Curso Sql Avanzado.doc

© 2005 BearingPoint Global Technology Services

Optimización de consultas y SQL avanzado

SELECT PostalCode, LastName, Address FROM Employees ORDER BY PostalCode, LastName DESC;

2.2.3 Consultas con Predicado
El predicado se incluye entre la claúsula y el primer nombre del campo a recuperar, los posibles predicados son: * Distinct Devuelve todos los campos de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente

2.2.3.1 *
El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instrucción SQL. SELECT * FROM Employees; Tip: No conveniente abusar de él ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho más rápido indicar el listado de campos deseados.

2.2.3.2 Distinct
Omite los registros que contienen datos duplicados en los campos seleccionados. SELECT DISTINCT LastName FROM Employees;

2.2.4

Alias

En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto. Para resolver todas ellas tenemos la palabra reservada AS que asigna el nombre que deseamos a la columna deseada. AS no es una palabra reservada de ANSI. También podemos asignar alias a las tablas dentro de la consulta de selección, en esta caso hay que tener en cuenta que en todas las referencias que deseemos hacer a dicha tabla se ha de utilizar el alias en lugar del nombre. SELECT LastName AS "Empleado" FROM Employees; Tip: Esta nomenclatura [Tabla].[Campo] se debe utilizar cuando se está recuperando un campo cuyo nombre se repite en varias de las tablas que se utilizan en la sentencia. Es aconsejable utilizar esta nomenclatura para evitar el trabajo que supone al motor de datos averiguar en que tabla está cada uno de los campos indicados en la cláusula SELECT.

Página 5 de 52 Curso Sql Avanzado.doc

© 2005 BearingPoint Global Technology Services

Este operador devuelve Verdadero si los dos objetos son iguales. SELECT * FROM Employees WHERE NOT City = 'London'. 2. 2. El operador denominado IS se emplea para comparar dos variables de tipo objeto <Objeto1> Is <Objeto2>.0000 And 100.3.0000.4 El Operador In Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista: SELECT * FROM Employees WHERE City In ('Seattle'.3 Criterios de Selección Son las posibilidades de filtrar los registros con el fin de recuperar solamente aquellos que cumplan una condiciones preestablecidas. 'Redmond'). SELECT * FROM Employees WHERE (BirthDate > '1956-09-15' AND BirthDate < '1965-04-01') OR City = 'London' AND Title = 'Sales Manager'. A excepción de los dos últimos todos poseen la siguiente sintaxis: <expresión1> operador <expresión2> En donde expresión1 y expresión2 son las condiciones a evaluar.3 El Operador Like Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Is y Not. OR.doc © 2005 BearingPoint Global Technology Services . SELECT * FROM Employees WHERE BirthDate > '1947-09-15' AND BirthDate < '1960-04-01'. Página 6 de 52 Curso Sql Avanzado. SELECT * FROM Products WHERE ProductName like 'M%' 2.2 Intervalos de Valores Para indicar que deseamos recuperar los registros según el intervalo de valores de un campo emplearemos el operador Between: SELECT * FROM Products WHERE UnitPrice Between 50.1 Operadores Lógicos Los operadores lógicos soportados por SQL son: AND. 'Tacoma'.3.Optimización de consultas y SQL avanzado 2. Si a cualquiera de las anteriores condiciones le anteponemos el operador NOT el resultado de la operación será el contrario al devuelto sin el operador NOT.3. 2.3.

Valor máximo del grupo. Valor mínimo del grupo. Las cargas de pedidos por cliente es un buen ejemplo para mostrar el uso de los grupos: SELECT CompanyName "CLIENTE". Suma los valores del grupo.4. WHERE Condiciones Expresión. Página 7 de 52 Curso Sql Avanzado... Para la formación de grupos adicionamos. Expresión.. FROM Tabla. los valores Null no se evalúan en ninguna de las funciones SQL agregadas. COUNT(Freight) "CARGA". Las funciones para el procesamiento de grupos son: COUNT(columna) COUNT(*) MIN(columna) MAX(columna) SUM(columna) AVG(columna) Cantidad de registros en que la columna tiene valores no nulos. Tip: Los valores Null en los campos GROUP BY se agrupan y no se omiten.. GROUP BY es opcional.. En una misma consulta no se pueden mezclar funciones de grupo con columnas o funciones que trabajan con registros individuales.4.. así como la columna o expresión usada para formar los grupos en la orden GROUP BY.1 Agrupamiento de datos SQL proporciona una forma eficiente para manejar la información con el agrupamiento de datos a través de la formación de grupos y las funciones correspondientes. sin considerar los valores nulos.doc © 2005 BearingPoint Global Technology Services .1. No obstante. Cantidad de registros que hay en la tabla.4 2... la orden GROUP BY ubicada antes de ORDER BY. a la forma básica de la sentencia SELECT vista anteriormente. incluyendo los valores nulos. Expresión. Expresión. Calcula valor medio del grupo.. Los valores de resumen se omiten si no existe una función SQL agregada en la instrucción SELECT.. Tabla. La lista de columnas a mostrar en la consulta puede contener las funciones de grupo..Optimización de consultas y SQL avanzado 2.1 Agrupamiento de Registros y Funciones Agregadas La cláusula GROUP BY 2. como se muestra a continuación: SELECT GROUP BY ORDER BY Lista. Cada grupo tendrá como resultado de la consulta una fila resumen que contiene la información del grupo. dando la posibilidad de procesar no solo registros individuales.

Una vez que GROUP BY ha combinado los registros.CustomerID=Orders. Si deseamos cambiar ese orden. se debe adicionar al final la orden ORDER BY SUM(VALOR). Una vez que los registros se han agrupado utilizando GROUP BY.4.2 Count (Contar registros) Count cuenta el número de registros sin tener en cuenta qué valores se almacenan en los registros. HAVING es similar a WHERE.CustomerID GROUP BY CompanyName. COUNT(Freight) "CARGA".MAX(Freight) "MAXIMA". Sum(UnitsInStock) FROM Products GROUP BY CategoryID. cuando no está presente la orden ORDER BY. HAVING determina cuales de ellos se van a mostrar. MAX(Freight) "MAXIMA". Página 8 de 52 Curso Sql Avanzado. AVG(Freight) "MEDIA".SUM(Freight) "TOTAL" FROM Orders GROUP BY CustomerID ORDER BY SUM(Freight) DESC.4. está dado por la columna que forma los grupos.1. Tip: Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar. Tip: El orden en las consultas por grupos.Optimización de consultas y SQL avanzado MIN(Freight) "MINIMA".Orders WHERE Customers. 2. SELECT CustomerID.doc © 2005 BearingPoint Global Technology Services . como es el caso de ordenar por el valor total de ventas. SELECT ProductName. SUM(Freight) "TOTAL" FROM Customers. determina qué registros se seleccionan.2 La cláusula having Aplica una condición a los grupos después de formarse. ProductName HAVING Sum(UnitsInStock) < 100 AND ProductName Like 'Gra%'. 2. y la cláusula HAVING para filtrar los registros una vez agrupados.MIN(Freight) "MINIMA". HAVING muestra cualquier registro agrupado por la cláusula GROUP BY que satisfaga las condiciones de la cláusula HAVING. AVG(Freight) "MEDIA". CategoryID.

4.1 Delete Elimina los registros de una o más de las tablas listadas en la cláusula FROM que satisfagan la cláusula WHERE. SELECT Sum(UnitPrice * UnitsOnOrder) AS Total FROM Products.4. 2. 2.doc © 2005 BearingPoint Global Technology Services . 2. Su sintaxis es: Sum(expr) En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresión que realiza un cálculo utilizando los datos de dichos campos.4 Sum (Sumar Valores) Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta.Optimización de consultas y SQL avanzado SELECT Count(*) AS Total_Empleados FROM Employees. SELECT Count(DISTINCT City) AS Total FROM Employees. son las encargadas de acciones como añadir y borrar y modificar registros. Si utiliza un asterisco.5 Consultas de manipulación de datos Las consultas de acción son aquellas que no devuelven ningún registro. Count(*) es considerablemente más rápida que Count(Campo). 2. SELECT Min(UnitsInStock) AS stockMin FROM Products WHERE CategoryID = 1. Count calcula el número total de registros. Tip: La función Count no cuenta los registros que tienen campos Null a menos que coloquemos el carácter comodín asterisco (*).3 Max y Min (Valores Máximos y Mínimos) Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una consulta. una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL).5. Su sintaxis es: Min(expr) ó Max(expr) Expr pueden incluir el nombre de un campo de una tabla. Página 9 de 52 Curso Sql Avanzado. DELETE FROM Region WHERE RegionDescription = 'Southern'. incluyendo aquellos que contienen campos Null. SELECT Max(UnitsInStock) AS stockMax FROM Products WHERE CategoryID = 1.

campoN) VALUES (valor1. valorN) Para seleccionar registros e insertarlos en una tabla nueva SELECT campo1.5. campo2.. UPDATE Products SET UnitPrice = UnitPrice * 1. . Página 10 de 52 Curso Sql Avanzado. . 2. campo2. . no puede deshacer la operación.Optimización de consultas y SQL avanzado Tip: Una vez que se han eliminado los registros utilizando una consulta de borrado. Si elimina los registros equivocados podrá recuperarlos desde las copias de seguridad. Insertar un único registro: INSERT INTO Tabla (campo1. UPDATE Products SET UnitPrice = UnitPrice * 1. Esta consulta puede ser de dos tipos: Insertar un único registro ó Insertar en una tabla los registros contenidos en otra tabla... campoN) SELECT TablaOrigen.5. valor2... Si en una consulta de actualización suprimimos la cláusula WHERE todos los registros de la tabla señalada serán actualizados.campo2..* FROM TablaOrigen Tip: Con Oracle podemos crear una tabla a partir de una selección..campoN FROM TablaOrigen Si Tabla y TablaOrigen poseen la misma estrucutra podemos simplificar la sintaxis a: INSERT INTO Tabla SELECT TablaOrigen. campo2. TablaOrigen.1. primero examine los resultados de una consulta de selección que utilice el mismo criterio y después ejecute la consulta de borrado.1 WHERE SupplierID = 1 AND CategoryID = 2.. campoN INTO nuevatabla FROM tablaorigen [WHERE criterios] Insertar registros de otra tabla: INSERT INTO Tabla [IN base_externa] (campo1.3 Update Crea una consulta de actualización que cambia los valores de los campos de una tabla especificada basándose en un criterio específico. TablaOrigen... Si desea saber qué registros se eliminarán.. insertando los datos implícitamente CREATE TABLE Tabla1 AS SELECT * FROM Tabla2 2. ..2 Insert into Agrega un registro en una tabla.campo1. ... UPDATE Employees SET ReportsTo = 1 WHERE ReportsTo = NULL.doc © 2005 BearingPoint Global Technology Services .

SELECT CompanyName. Página 11 de 52 Curso Sql Avanzado. ProductName FROM Suppliers.SupplierID.SupplierID. Products WHERE Suppliers. porque el contenido de las columnas de cada tabla son iguales. SELECT Suppliers.SupplierID = Products. Esto se conoce como producto cartesiano. el sistema asume que se desea obtener la combinación de los registros de cada tabla. ProductName FROM Suppliers. Products.1 Consultas de Combinación entre tablas La operación join permite extraer datos de dos o más tablas· Join es la parte central del modelo relacional Combina tablas en base a valores iguales de los renglones de cada tabla Joins basados en la igualdad Un registro en una tabla hace referencia a un registro en otra tabla. Producto Cartesiano Si no se especifican en el where las columnas utilizadas para relacionar las tablas.doc © 2005 BearingPoint Global Technology Services . Consulta que muestra los productos que tiene cada proveedor.Optimización de consultas y SQL avanzado 3 Consultas de Unión Internas (Joins) 3.

o <>. tb2 Son los nombres de las tablas desde las que se combinan los registros. Esto crea una combinación por equivalencia.campo1 comp tb2.campo2) OR ON tabla1. <=. >=. >. También puede anidar instrucciones JOIN utilizando la siguiente sintaxis: Página 12 de 52 Curso Sql Avanzado.campo2 comp tabla2. Si no son numéricos. Las combinaciones de igualdad son las más comunes.EmployeeID = Orders.doc © 2005 BearingPoint Global Technology Services .2 Inners Joins Las vinculaciones entre tablas se realizan mediante la cláusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo común. También se pueden enlazar varias cláusulas ON en una instrucción JOIN.campo1 comp tabla2.campo3)]. conocida también como unión interna. los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos. <. pero no tienen que tener el mismo nombre.campo1 AND ON tabla1.Optimización de consultas y SQL avanzado 3.campo2 En donde: tb1. Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. éstas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo común a ambas tablas. ShipAddress FROM Employees INNER JOIN Orders ON Employees. campo1. comp Es cualquier operador de comparación relacional : =. utilizando la sintaxis siguiente: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tabla1. campo2 Son los nombres de los campos que se combinan.campo3 comp tabla2. Su sintaxis es: SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.EmployeeID. El ejemplo siguiente muestra cómo podría combinar las tablas Employees y Orders basándose en el campo EmployeeID: SELECT FirstName.

Orders.A.CustomerID = Orders.freight.p.campo3 comp tbx.campo1 comp tabla2. Tomando como referencia la siguiente sentencia: SELECT Customers..campo2 comp tabla3.CustomerId. Orders. Orders WHERE Customers.ShipCity FROM Customers. Página 13 de 52 Curso Sql Avanzado.CustomerID WHERE CompanyName = 'Franchi S.campo2. No obstante.CustomerId.campo3) ON tabla1. SELECT LastName.)] ON tabla3. Orders.CustomerID.CustomerID = Orders.p.CustomerID AND CompanyName = 'Franchi S.EmployeeID) ON Customers. La transformación de esta sentencia a formato ANSI sería la siguiente: SELECT Customers.doc © 2005 BearingPoint Global Technology Services .Optimización de consultas y SQL avanzado SELECT campos FROM tabla1 INNER JOIN (tabla2 INNER JOIN [( ] tabla3 [INNER JOIN [( ] tablaX [INNER JOIN . Orders.campox)] ON tabla2.EmployeeID = Employees.ShipCity FROM Customers INNER JOIN Orders ON Customers. ShipAddress.A.'. pero existe una sintaxis en formato ANSI para los INNER JOIN que funcionan en todos los sistemas.CustomerID = Orders.. CompanyName FROM Customers INNER JOIN (Orders INNER JOIN Employees ON Orders. los INNER JOIN ORACLE no es capaz de interpretarlos hasta la versión 8i.freight.'.

OrderID FROM Employees Left outer JOIN Orders ON Employees.Optimización de consultas y SQL avanzado 3. Puede haber clientes que no hayan realizado ningún pedido. no funcionan en ORACLE hasta la versión 8i. SELECT CompanyName. Albaranes. Albaranes.EmployeeID.* FROM Facturas.EmployeeID = Orders. FirstName.CustomerID = Orders. esto equivale a un LEFT JOIN: SELECT Facturas. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningún registro en la tabla de la izquierda.*.3 Outer Joins Si empleamos la cláusula INNER en la consulta se seleccionarán sólo aquellos registros de la tabla de la que hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos escrito a la derecha.IdCliente = 325 Página 14 de 52 Curso Sql Avanzado.*. En este caso la consulta muestra todos los registros de la tabla Empleados (Employees) aunque no tengan ningún registro asociado en la tabla Pedidos (Orders).doc © 2005 BearingPoint Global Technology Services . Albaranes WHERE Facturas.EmployeeID order by employees.CustomerID.IdAlbaran AND Facturas. La sintaxis en ORACLE se emplea añadiendo los caracteres (+) detrás del nombre de la tabla en la que deseamos aceptar valores nulos. Para solucionar esto tenemos dos cláusulas que sustituyen a la palabra clave INNER. RIGHT realiza la misma operación pero al contrario. toma todos los registros de la tabla de la derecha aunque no tenga ningún registro en la tabla de la izquierda. Referente a los OUTER JOIN.IdAlbaran = Albaranes. SELECT DISTINCT Employees. ShipAddress. OrderID FROM Orders Right Outer JOIN Customers ON Customers.IdCliente = 325 Y esto a un RIGHT JOIN: SELECT Facturas. ShipAddress.EmployeeID.IdAlbaran (+) = Albaranes. estas cláusulas son LEFT/RIGHT OUTER JOIN.IdAlbaran (+) AND Facturas. En este caso muestra todos los registros de la tabla Clientes (Customers) aunque no tengan ningún registro en la tabla Pedidos (Orders).* FROM Facturas. Albaranes WHERE Facturas.

LastName.OrderID FROM Categories INNER JOIN (Products Left JOIN OrderDetails ON Products. en aquellos casos para que ReportsTo = NULL.columna. S. En el caso de no existir ningún pedido relacionado a alguno de los productos el campo OrderID aparecerá con valor NULL. ProductName. CategoryName. junto con el número. 3.ProductID. es decir. Title).ReportsTo = S.ProductID) ON Categories. nombre y puesto de cada empleado (EmployeeID. La sintaxis en la siguiente: SELECT alias1. tabla1 as alias2 WHERE alias1.Optimización de consultas y SQL avanzado Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN.doc © 2005 BearingPoint Global Technology Services .columna = alias2.Title.LastName.columna. LastName.' WHERE EmployeeID NOT IN Página 15 de 52 Curso Sql Avanzado. y la otra entre las tablas Products y OrderDetails.ProductID. comparando valores de dos columnas con el mismo tipo de datos. FROM tabla1 as alias1.Title FROM Employees AS E.ProductID = OrderDetails.CategoryID order by Products. . nombre y puesto del supervisor (ReportsTo. OrderDetails.4 Consultas de Autocombinación La autocombinación se utiliza para unir una tabla consigo misma. S. pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN. Crea dos combinaciones equivalentes: una entre las tablas Products y Categories. para visualizar el número. E. E. Employees AS S WHERE E. alias2. Por ejemplo: SELECT Products.. UPDATE Employees SET TitleOfCourtesy = 'Sup.EmployeeID .LastName. Title )de cada uno de ellos se utilizaría la siguiente sentencia: SELECT E.EmployeeID.columna AND otras condiciones Por ejemplo. El resultado de la consulta no mostrará a aquellos empleados los cuales no tengan asignados supervisor.CategoryID = Products.ReportsTo. La consulta retorna una lista de todos los productos existententes con su categoría correspondiente y los pedidos realizados de dichos productos.. E.

ProductID AND [Order Details]. 3.OrderDate ASC. etc.ReportsTo = S.EmployeeID FROM Employees AS E. BETWEEN.EmployeeID). el precio unitario del producto.[Order Details] . La select muestra el nombre del producto. CategoryID. Modifica el título de cortesía para aquellos empleados los cuales no dependen de ningún supervisor.ProductID = [Order Details].OrderID = Orders. CustomerID FROM Products. <>. Orders WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-30' AND Products. SELECT ProductName. Página 16 de 52 Curso Sql Avanzado.5 Consultas de Combinaciones no Comunes La mayoría de las combinaciones están basadas en la igualdad de valores de las columnas que son el criterio de la combinación. Employees AS S WHERE E.UnitPrice . Las no comunes se basan en otros operadores de combinación. es decir ellos mismos son su propio supervisor. Products. Orders.OrderID. tales como NOT.OrderID ORDER BY Orders. la categoría. el número de pedido. Ordenados por la fecha en que se realizó el pedido.Optimización de consultas y SQL avanzado (SELECT E. de todos los pedidos realizados entre el periodo comprendido entre ’0107-1996 y el 30-07-1996’ ambos inclusive.doc © 2005 BearingPoint Global Technology Services . la fecha de pedido y el ID del cliente que lo realizó. OrderDate.

consulta2. consultan Son instrucciones SELECT. City FROM Customers WHERE Country = 'USA'. Su sintaxis es: [TABLE] consulta1 UNION [ALL] [TABLE] consulta2 [UNION [ALL] [TABLE] consultan [ . combinando los resultados de dos o más consultas o tablas independientes. Esto hace que la consulta se ejecute más rápidamente. City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName]. en una única operación UNION. SELECT [CompanyName]. en cualquier orden.. Se puede utilizar una cláusula GROUP BY y/o HAVING en cada argumento consulta para agrupar los datos devueltos. tablas e instrucciones SELECT. Recupera los nombres (CompanyName) y las ciudades (City) de todos proveedores (Suppliers) y clientes (Customers) de USA. Puede combinar los resultados de dos o más consultas. El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas y una instrucción SELECT: TABLE [Nuevas Cuentas] UNION ALL SELECT * FROM Clientes WHERE [Cantidad pedidos] > 1000. no obstante los campos no tienen porqué tener el mismo tamaño o el mismo tipo de datos. City FROM Customers WHERE Country = 'USA' ORDER BY City. el nombre de una consulta almacenada o el nombre de una tabla almacenada precedido por la palabra clave TABLE.. SELECT [CompanyName]. no obstante puede incluir el predicado ALL para asegurar que se devuelven todos los registros. Puede utilizar una cláusula ORDER BY al final del último argumento consulta para visualizar los datos devueltos en un orden específico. Todas las consultas en una operación UNION deben pedir el mismo número de campos. Página 17 de 52 Curso Sql Avanzado. City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName]. no se devuelven registros duplicados cuando se utiliza la operación UNION. Tip: Si no se indica lo contrario. ]] En donde: consulta1.Optimización de consultas y SQL avanzado 4 Consultas de Unión Externas (Unions) Se utiliza la operación UNION para crear una consulta de unión.doc © 2005 BearingPoint Global Technology Services .

Optimización de consultas y SQL avanzado Recupera los nombres (CompanyName) y las ciudades (City) de todos proveedores (Suppliers) y clientes (Customers) de USA.doc © 2005 BearingPoint Global Technology Services . SELECT [CompanyName]. City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName].. City FROM Customers WHERE Country = 'USA' UNION SELECT [LastName]. Recupera los nombres (CompanyName) y las ciudades (City) de todos proveedores (Suppliers) y clientes (Customers) de USA. ordenados por el nombre de la ciudad (City). City FROM Employees WHERE Region ='WA'. y los apellidos (LastName) y ciudades (City) de todos los empleados cuya región es WA. Página 18 de 52 Curso Sql Avanzado.

..INTO. Para efectuar algunas tareas que en otro caso sería imposible realizar utilizando un join (por ejemplo usar una función agregada) Las particularidades de las subconsultas son: Su resultado no se visualiza. Este último caso se llama subconsulta con columnas múltiples. No puede usar el operador BETWEEN. y se define como una sentencia SELECT que está incluida en la orden WHERE de la consulta principal. puede contener otra subconsulta y así hasta un máximo de 16 niveles. llamada principal. INSERT. a su vez. Una subconsulta. Puede devolver un valor único o una lista de valores y en dependencia de esto se debe usar el operador del tipo correspondiente. por tanto deberán utilizarse como último recurso ya que siempre es mejor tratar de realizar las consultas mediantes joins Las subconsultas son usadas: Porque algunas veces son más fáciles de entender que un join. El predicado IN se emplea para recuperar únicamente aquellos registros de la consulta principal para los que algunos registros de la subconsulta contienen un valor igual.doc © 2005 BearingPoint Global Technology Services . o UPDATE o dentro de otra subconsulta. Cuando dos o más columnas serán comprobadas al mismo tiempo. En una subconsulta.. Página 19 de 52 Curso Sql Avanzado. deben encerrarse entre paréntesis. o varias columnas.. DELETE. que es lo más común. Puede contener una sola columna. Se puede utilizar una subconsulta en lugar de una expresión en la lista de campos de una instrucción SELECT o en una cláusula WHERE o HAVING. se utiliza una instrucción SELECT para proporcionar un conjunto de uno o más valores especificados para evaluar en la expresión de la cláusula WHERE o HAVING.25). sino que se pasa a la consulta principal para su comprobación.INTO. Tip: Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT. El ejemplo siguiente devuelve todos los productos vendidos con un descuento igual o mayor al 25 por ciento: SELECT * FROM Orders WHERE OrderID IN (SELECT OrderID FROM OrderDetails WHERE Discount >= 0. Tip: Las consultas normalmente son ineficientes.Optimización de consultas y SQL avanzado 5 Subconsultas 5. SELECT.1 Empleo de Subconsultas Una Subconsulta es aquella consulta de cuyo resultado depende otra consulta. ni contener la orden ORDER BY.

Que también puede escribirse: SELECT ProductName.ProductName = Products.EmployeeID = E.CustomerId) Esta consulta es equivalente a esta otra: SELECT Customers. Customers.CustomerId FROM Orders WHERE Orders. EmployeeID).ProductName = Products.CustomerId FROM Orders) Tip: Es útil utilizar también alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la cláusula FROM fuera de la subconsulta. Página 20 de 52 Curso Sql Avanzado. SELECT ProductName. Selecciona el nombre de todos los empleados que han reservado al menos un pedido. SELECT FirstName.doc © 2005 BearingPoint Global Technology Services .Phone FROM Customers WHERE EXISTS (SELECT Orders.Phone FROM Customers WHERE CustomerId IN (SELECT Orders. Customers.ProductName) ORDER BY ProductName. LastName FROM Employees AS E WHERE EXISTS (SELECT * FROM Orders AS O WHERE O. UnitPrice FROM Products WHERE UnitPrice >= (SELECT Avg(UnitPrice) FROM Products as T2 WHERE T2.CompanyName.CompanyName.CustomerId = Customers. UnitPrice FROM Products AS T1 WHERE UnitPrice >= (SELECT Avg(UnitPrice) FROM Products WHERE T1.Optimización de consultas y SQL avanzado Inversamente se puede utilizar NOT IN para recuperar únicamente aquellos registros de la consulta principal para los que no hay ningún registro de la subconsulta que contenga un valor igual. El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso para determinar si la subconsulta devuelve algún registro. Supongamos que deseamos recuperar todos aquellos clientes que hayan realizado al menos un pedido: SELECT Customers.ProductName) ORDER BY ProductName.

O sea.productName = 'Chang') Supongamos que en nuestra tabla de empleados deseamos buscar todos los empleados cuyas edades superen a la media de la compañía: SELECT T1. Products.Optimización de consultas y SQL avanzado Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el producto Chang.ProductName.BirthDate))FROM Employees) 5.2 Grupos con subconsultas Para combinar grupos con subconsultas debemos incluir en la sentencia SELECT la orden HAVING.UnitPrice =(SELECT Products. El ejemplo a diseñar para nuestra aplicación es la consulta ¿cuál fue el artículo más vendido y en qué cantidad?. Puede usar una función de grupo diferente a la de la orden SELECT. trabaja como si fuera una orden WHERE. Se ubica después de la orden GROUP BY. en oposición a las columnas o funciones para registros individuales que se seleccionan mediante la orden WHERE. la orden HAVING de la consulta principal selecciona aquellos artículos (GROUP BY) que tienen una venta total (SUM(valor)) igual a la mayor venta realizada por artículo (MAX(SUM(valor))) que devuelve la subconsulta.UnitPrice FROM Products WHERE Products. SELECT DISTINCT Products. pero sobre grupos de registros.BirthDate) > (SELECT avg(Year(Employees. SUM(column) FROM GROUP BY column HAVING SUM(column) condition value En el ejemplo se seleccionan las unidades en stock del producto más caro: Página 21 de 52 Curso Sql Avanzado. SELECT column.doc © 2005 BearingPoint Global Technology Services . En este caso. pero sobre los resultados de las funciones de grupo.UnitPrice FROM Products WHERE Products. que tiene las siguientes características: Funciona como la orden WHERE.FirstName FROM Employees T1 WHERE Year(T1.

Búsqueda de registros no relacionados Este tipo de consulta se emplea en situaciones tales como saber qué productos no se han vendido.doc © 2005 BearingPoint Global Technology Services .FirstName In (SELECT FirstName FROM Employees As Tmp GROUP BY FirstName HAVING Count(*)>1) ORDER BY Employees.ProductId WHERE (Orderdetails.Optimización de consultas y SQL avanzado SELECT ProductName AS Producto. estableciendo como condición que el campo relacionado de la segunda sea Null. UnitsinStock AS StockActual FROM Products GROUP BY ProductName.FirstName.ProductId = Products. si deseamos localizar aquellos empleados con igual nombre y visualizar su código correspondiente. SELECT DISTINCT Products.EmployeeId FROM Employees WHERE Employees.ProductName FROM Products Left JOIN OrderDetails ON Orderdetails. Página 22 de 52 Curso Sql Avanzado.FirstName.ProductId. se trata de realizar una unión interna entre dos tablas seleccionadas mediante un LEFT JOIN. UnitPrice HAVING UnitPrice =( Select MAX(UnitPrice) from Products) 5. UnitsinStock.3 Casos Prácticos Búsqueda de registros duplicados SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As pseudónimo GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY CampoDeBusqueda. Products. Un caso práctico. La sintaxis es sencilla. Employees. la consulta sería la siguiente: SELECT DISTINCT Employees.ProductId Is Null).

1 Consejos generales La construcción de una sentencia y los operadores y condiciones empleados determinan como la interpreta el analizador y por tanto su plan de ejecución. Hay que procurar que las condiciones de la cláusula WHERE sean lo más restringidas posibles. hay que indicarle como tiene que hacerlo si queremos que el tiempo de respuesta sea el mínimo. Tip: Si utilizamos varias tablas en la consulta. la reescritura de una sentencia puede cambiar radicalmente su plan de ejecución y su rendimiento en el sistema. Como norma más general. En la medida de lo posible hay que evitar que las sentencias SQL estén embebidas dentro del código de la aplicación. 6. Si se trata de una sentencia embebida el gestor debe compilarla antes de ejecutarla.1. muchas veces no basta con especificar una sentencia SQL correcta.doc © 2005 BearingPoint Global Technology Services . se deben seguir los siguientes consejos: Página 23 de 52 Curso Sql Avanzado.1 Diseño de las tablas La optimización pasa por un correcto diseño del modelo de datos (Tablas).) evitando así recuperar columnas que luego no utilizaremos y por que el gestor debe leer primero la estructura de la tabla antes de ejecutar la sentencia. en las sentencias se indica que queremos conseguir y no como lo tiene que hacer el interprete para conseguirlo. Es mucho más eficaz usar vistas o procedimientos almacenados por que el gestor los guarda compilados. es decir.. Hay que especificar siempre las columnas a las que queremos acceder (No hacer nunca SELECT *. Facturacion WHERE IdCliente = IdClienteFacturado Usar : SELECT Clientes. En muchos casos.Nombre. especificar siempre a que tabla pertenece cada campo. Facturacion. sino que además.Optimización de consultas y SQL avanzado 6 Optimización de consultas El lenguaje SQL es no procedimental. una sentencia está optimizada cuando implica realizar el número más pequeño posible de accesos a los datos. En lugar de: SELECT Nombre.Factura WHERE Clientes.IdClienteFacturado. Factura FROM Clientes. En este apartado veremos como mejorar el tiempo de respuesta de nuestro interprete ante unas determinadas situaciones: 6.. Por tanto.IdCliente = Facturacion. debemos evitar accesos a filas innecesarias. pues en la práctica a todos los gestores de SQL hay que especificar sus propias reglas para optimizar el rendimiento. Esto es sólo teoría. le ahorraremos al gestor el tiempo de localizar a que tabla pertenece el campo.

Si hay que desnormalizar alguna tabla pensar en la ocupación y en el rendimiento antes de proceder.Año = 1996 el gestor recorrerá todos los alumnos para buscar sus matriculas y devolver las correspondientes. no puede usar el primer índice y ambas sentencias son equivalentes porque la condición APELLIDO Like '%' devolvería todos los registros. el gestor filtra las matrículas y después selecciona los alumnos.1. Alumnos WHERE Matriculas. al menos hasta la tercera forma normal.1. Matriculas WHERE Alumno.3 Orden de las Tablas Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado con el orden empleado en la clausula FROM. Si escribimos FROM Matriculas.Año = 1996 AND Matriculas. de esta forma tiene que recorrer menos registros. 6. Los primeros campos de cada tabla deben ser aquellos campos requeridos y dentro de los requeridos primero se definen los de longitud fija y después los de longitud variable. la sintaxis “= Null” es válida pero no recomendada Un valor Null nunca es igual a otro valor Null Página 24 de 52 Curso Sql Avanzado. Tip: Interrogar siempre por campos que sean clave. por si acaso.Optimización de consultas y SQL avanzado Normalizar las tablas.1. Ajustar al máximo el tamaño de los campos para no desperdiciar espacio.2 Campos de Filtro Se procurará elegir en la cláusula WHERE aquellos campos que formen parte de la clave de la tabla por el cual interrogamos.IdAlumno = Alumnos. Si deseamos saber cuantos alumnos se matricularon en el año 1996 y escribimos: FROM Alumnos. 6.IdAlumno = Matriculas.IdAlumnos. Si este campo se va a utilizar con poca frecuencia o si se ha definido con gran tamaño. Además se especificarán en el mismo orden en el que estén definidos en la clave. Es muy habitual dejar un campo de texto para observaciones en las tablas. 6.doc © 2005 BearingPoint Global Technology Services . Supongamos que tenemos un índice formado por el campo NOMBRE y el campo APELLIDO y otro índice formado por el campo EDAD. es mejor crear una nueva tabla que contenga la clave primaria de la primera y el campo para observaciones.IdAlumno AND Matriculas. en este segundo caso. Si deseamos interrogar por campos pertenecientes a índices compuestos es mejor utilizar todos los campos de todos los índices. La sentencia WHERE NOMBRE='Juan' AND APELLIDO Like '%' AND EDAD = 20 sería más optima que WHERE NOMBRE = 'Juan' AND EDAD = 20 por que el gestor. es un valor que significa “información no disponible”· Is Null debe ser utilizado para determinar valores Null contenidos en una columna.4 Valores NULL Con los valores Null debemos tener en cuenta las siguientes premisas: Un valor NULL es un valor desconocido Un Null no implica un cero o un espacio en blanco. para asegurar que no hay duplicidad de datos y se aprovecha al máximo el almacenamiento en las tablas.

naturaleza y distribución de los datos a tratar (una sentencia que funciona bien con algunos valores puede ser inadmisible si hay un valor muy mayoritario). sin olvidar las previsiones de crecimiento. esta ventaja se ve contrarrestada por el hecho de ocupar mucha más memoria (el doble más o menos) y de requerir para su inserción y actualización un tiempo de proceso superior. hay que tener en cuenta las siguientes consideraciones: Utilizar índice para consultas muy restrictivas. En este caso. la aplicación se tiene que ajustar con una carga de datos realista. Algunas columnas son definidas para permitir valores NULL Si un elemento es Null en una operación el resultado será Null 6. y si éste ya existe. A mayor selectividad del índice mayor probabilidad de que sea usado por el optimizador de consultas. actualización y borrado en los datos. Se deben usar los índices con moderación. en este sentido. En relación a todo esto.2 Empleo de índices Los índices son campos elegidos arbitrariamente por el constructor de la base de datos que permiten la búsqueda a partir de dicho campo a una velocidad notablemente superior. averiguar porqué no lo utiliza y reescribir la sentencia para que lo haga. además del problema de memoria ya mencionado. Los índices pueden resultar contraproducentes si los introducimos sobre campos triviales a partir de los cuales no se realiza ningún tipo de petición ya que. Se debe tratar que los índice tengan la mayor selectividad posible (es decir el número de filas obtenido por cada valor del clave del índice). La mayoría de consultas se optimizan si acceden a través de un índice. Es por ello que vale la pena pensárselo dos veces antes de indexar un campo que no sirve de criterio para búsquedas o que es usado con muy poca frecuencia por razones de mantenimiento. El volumen máximo de datos recuperados sería del orden del 15 20 % de los registros de la tabla. Sin embargo. es decir. la información de una base de desarrollo puede ser totalmente errónea. Un caso en el que los índices pueden resultar muy útiles es cuando realizamos peticiones simultáneas sobre varias tablas. el proceso de selección puede acelerarse sensiblemente si indexamos los campos que sirven de nexo entre las dos tablas. Ante una sentencia que no realice un acceso por índice y que consideremos ineficiente se ha de considerar el introducir un índice en la base. unos pocos índices pueden ser útiles pero demasiados índices pueden afectar negativamente al rendimiento porque hay que mantenerlos actualizados cada vez que se realizan operación de inserción. El analizador no utilizará índice en caso contrario.Optimización de consultas y SQL avanzado Los valores Null se consideran en el ordenamiento y en los grupos.doc © 2005 BearingPoint Global Technology Services . Página 25 de 52 Curso Sql Avanzado. Para esto hay que conocer siempre el volumen (no es igual el 20 % de una tabla de 1M registros que de una tabla de 20M registros) . estamos ralentizando otras tareas de la base de datos como son la edición. Referenciar la columna o columnas del índice en la cláusula WHERE. inserción y borrado.

FECHA_ENTRADA) El Analizador utilizará el índice con una cláusula WHERE de la forma: NUM_CLIENTE = valor AND NOMBRE_CLIENTE = valor AND FECHA_ENTRADA = valor Ó la siguiente: NUM_CLIENTE = valor AND NOMBRE_CLIENTE = valor Ó la siguiente: NUM_CLIENTE = valor Ó la siguiente: NUM_CLIENTE = valor AND FECHA_ENTRADA = valor En cambio NO utilizará el índice si el WHERE contiene: NOMBRE_CLIENTE = valor AND FECHA_ENTRADA = valor Tampoco utilizará cuando: NOMBRE_CLIENTE = valor Página 26 de 52 Curso Sql Avanzado.Optimización de consultas y SQL avanzado No poner índices en tablas pequeñas. y si hay más condiciones deberían ir sobre las siguientes columnas en el orden del índice. Igualmente. Las referencias de las columnas de un índice compuesto en la cláusula WHERE tienen que estar en el mismo orden que en el índice. ya que estos ocupan menos espacio y necesitan menos sobrecarga de mantenimiento. Utilizar el menor número posible de columnas en el índice (índices estrechos). pero sí sobre la primera. No es obligatorio incluir condiciones sobre todas. NOMBRE_CLIENTE.doc © 2005 BearingPoint Global Technology Services . Lo ilustraremos con un ejemplo: (Índice: NUM_CLIENTE. No podemos indexar todos los campos de una tabla extensa ya que doblaríamos el tamaño de la base de datos.

TO_CHAR(FECHA_ENTRADA. 'DD/MM/YYYY')=.' => Acceso a toda la tabla. En relación con esto. Esto deshabilita el uso del índice. Oracle realiza implícitamente una conversión de tipo. Que no utilizan índice.. NOMBRE_CLIENTE LIKE 'AA%' => Acceso por índice. hay que tener en cuenta que las conversiones automáticas que realiza Oracle al comparar datos de tipos diferentes entran dentro de esta categoría y por tanto inhabilitan el uso del índice. TO_DATE. y si es posible. queremos obligar al optimizador a realizar un acceso a toda la tabla a pesar de que en la condición del WHERE se referencie a una columna indexada (Es el caso de tablas muy pequeñas o con un índice poco restrictivo). CLIENTE||'_01' = . por tanto. Si en algún caso. SELECT NOMBRE FROM CLIENTES WHERE SUBSTR(NOMBRE. no sobre columnas. 1. De aquí: Si hay que hacer conversiones de tipos en la cláusula WHERE.. SELECT NOMBRE FROM CLIENTES WHERE NOMBRE LIKE = 'A%'. En este caso.Optimización de consultas y SQL avanzado No modificar la columna del índice en el WHERE con funciones o expresiones..doc © 2005 BearingPoint Global Technology Services . En cambio. Tip: No utilizar LIKE con columnas que no sean de tipo carácter. no se usarían índice condiciones en el WHERE de la forma: SUBSTR(NOMBRE. Sí que se utilizará índice si la cadena empieza por un carácter fijo. Notar que podemos encontrar casos tan sencillos como los siguientes: (Índice 1: SUELDO . etc. nunca se utilizará índice. Índice 2: NOMBRE) SELECT SUELDO FROM EMPLEADOS WHERE SUELDO*12 > 1500000..1) = 'A'... No utilizar el operador LIKE con un valor cuyo primer carácter sea el comodín '%'.1. pero en cambio sí que lo hacen: SELECT SUELDO FROM EMPLEADOS WHERE SUELDO > 1500000/12. 5) = ... ya que esto obliga a acceder a toda la tabla.. siempre sobre datos fijos. podemos utilizar una técnica tan sencilla como: Página 27 de 52 Curso Sql Avanzado. Por ejemplo.. las haremos nosotros explícitamente con las funciones al efecto como TO_CHAR. Ejemplo: (Índice: NOMBRE_CLIENTE) NOMBRE_CLIENTE LIKE '%AA.

no utiliza el índice. Así: (Índice: ZONA) SELECT CLIENTE FROM CLIENTES WHERE ZONA != 5. Las columnas de un índice compuesto han de estar en el mismo orden que en el índice. Se puede utilizar un acceso por índice con las funciones MAX y MIN en consultas simples (no Joins) si: No hay cláusula WHERE o GROUP BY MAX o MIN son la única expresión en la consulta. sin más operadores. Para una columna de tipo numérico: TOTAL + 0 = .. Si la(s) columna(s) de la cláusula ORDER BY no están indexadas o no se puede utilizar el índice. Para acceder vía índice con la cláusula ORDER BY hay que atender a las mismas consideraciones que las hechas para WHERE: La columna del índice no puede estar modificada por una expresión o función. Página 28 de 52 Curso Sql Avanzado. Tip: La optimización basada en costos de Oracle (Default) ya realiza esta operación Evitar los operadores NOT EQUAL (!=) ya que siempre acceden a toda la tabla al presuponer el analizador que se va a acceder a la mayoría de los registros.. pero sí que lo hará: SELECT CLIENTE FROM CLIENTES WHERE ZONA > 5 AND ZONA < 5. se realiza un 'Sort' de la tabla (o de las filas devueltas por la cláusula WHERE)..Optimización de consultas y SQL avanzado Para una columna de tipo carácter: NOMBRE || '' =. siendo válidas también las otras restricciones hechas para el caso de WHERE. No hay problema en utilizar las otras condiciones NOT. Se refieren a una sola columna.. como por ejemplo: SELECT CLIENTE FROM CLIENTES WHERE NOT ZONA > 5. Donde la condición: NOT ZONA > 5 se transformará en ZONA =< 5 y utilizará el índice sobre ZONA de antes.doc © 2005 BearingPoint Global Technology Services .

ya que entonces hay I/O extra sobre el disco. y por tanto se utilizará un índice si la columna de la condición está indexada. SELECT MAX(IMPORTE)*2 FROM FACTURAS. Nunca utilizan índice y realizan siempre una ordenación (Sort) de la tabla: Las operaciones de Sort son unas de las que más cargan el servidor. Con GROUP BY utilizar siempre que sea posible WHERE en lugar de HAVING para introducir la condición. no lo hacen: SELECT MAX(IMPORTE) FROM FACTURAS WHERE ID_CLI = 15. El analizador de Oracle interpreta una cláusula WHERE con n condiciones unidas con OR como n consultas independientes.doc © 2005 BearingPoint Global Technology Services . En todo caso. realizando una concentración al final. será necesario que cada condición referencie a una columna indexada. especialmente si tiene que recurrir al tablespace temporal al llenarse la SORT_AREA de la SGA. pero la sentencia: SELECT ZONA. SELECT MAX(IMPORTE*2) FROM FACTURAS. Utilizan índice. Por esta razón. Evitar siempre que sea posible las funciones de grupo: DISTINCT. cada una con una condición. siempre hay que incluir una cláusula WHERE previa que restrinja lo más posible las filas a ordenar y que sí que utilizará un índice para ello si es posible. SUM(FACTURACION) FROM CLIENTES GROUP BY ZONA Página 29 de 52 Curso Sql Avanzado. GROUP BY. También se transforma en N consultas independientes una condición con el operador: IN ( Conjunto de valores ).Optimización de consultas y SQL avanzado Por ejemplo: (Índice IMPORTE) SELECT MAX(IMPORTE) FROM FACTURAS. Si queremos tener accesos por índice en este caso. en cambio. es preferible GROUP BY frente a DISTINCT. Así la sentencia: SELECT ZONA. SUM(FACTURACION) FROM CLIENTES WHERE ZONA = 5 GROUP BY ZONA. Condiciones ligadas mediante OR. utilizará un índice sobre ZONA (si existe). Se pueden substituir por una Join aunque ello puede complicar mucho la consulta (hasta hacerla ineficiente) o no ser posible.

doc © 2005 BearingPoint Global Technology Services . SELECT nombre. sin utilizar el índice No obstante. existen casos en que la presencia de la columna no garantiza el uso de su índice.ventas WHERE UPPER(nombre)>' '. SELECT nombre.valor FROM clientes.valor FROM clientes. como en las siguientes situaciones cuando la columna indexada es: Evaluada con el uso de los operadores IS NULL o IS NOT NULL. cuando el índice se activa estos registros no se muestran como resultado de la consulta.articulo.ventas WHERE nombre LIKE '%DEPORTE%'. ya que éstos son ignorados. Página 30 de 52 Curso Sql Avanzado.ventas WHERE nombre IS NOT NULL. Modificada por alguna función. Por lo tanto. agrupará todos los registros descartando luego los que no tengan ZONA = 5.valor FROM clientes. excepto por las funciones MAX(columna) o MIN(columna). no forman parte del índice.Optimización de consultas y SQL avanzado HAVING ZONA = 5. Finalmente debemos aclarar que los registros cuyo valor es NULL para la columna indexada. SELECT nombre. Usada en una comparación con el operador LIKE a un patrón de consulta que comienza con alguno de los signos especiales (% _).articulo.articulo.

Si realizamos una Join entre una vista y una tabla. mientras que en el segundo sólo se recuperará una fila de la tabla secundaria por fila de la conductora. si el volumen de las tablas es parecido. también es preferible usar un Hash sobre la tabla secundaria. Para el uso de Joins. En principio.doc © 2005 BearingPoint Global Technology Services . mientras que UNION sí). Hay que tener en cuenta la relación entre la tabla conductora y la secundaria: 1 a n (ídem m a n) ó 1 a 1 (ídem n a 1). hemos de considerar lo siguiente: En general. es preferible hacer un NL Join. la vista ha de actuar como conductora. al menos con tablas de volúmenes parecidos. si es posible. Algunas consideraciones sobre el uso de Hints en Joins: o o Si la tabla conductora es mucho más pequeña que la secundaria. en lugar de accesos con Join. sobre todo si podemos hacerla sobre las tablas.Optimización de consultas y SQL avanzado 6. Con dos tablas pequeñas podemos utilizar un Sort-Merge Join. Hay que intentar que ésta sea lo más pequeña posible para reducir el trabajo sobre temporal. En el primer caso. montaremos un Hash Join sobre la pequeña. accederemos a n filas de la tabla secundaria por cada una de la conductora. Siempre es preferible este segundo caso. aparte de lo dicho antes para índices.3 Sentencias con Joins. ya que todas ellas formarán parte de la tabla Hash. Para ello decide que camino de acceso a los datos se ha de seguir (siendo válidas las consideraciones anteriores sobre el acceso a las tablas por índice) y el algoritmo de Join a emplear. UNION (mejor UNION ALL si da el resultado buscado. El analizador realizará una Join siempre que encuentre más de una tabla en la cláusula FROM. y se ha de intentar obtenerlo mediante funciones de agrupación o eliminación de duplicados. es preferible utilizar. Una Join es una consulta que combina filas de dos o más tablas. ya que no realiza 'sort' sobre las tablas. No es recomendable realizar una Join entre vistas. o o Página 31 de 52 Curso Sql Avanzado. si es posible obtener el mismo resultado. Siempre que se use un Hash Join hay que tener en cuenta las columnas seleccionadas. Si es la tabla secundaria la que es mucho más pequeña que la conductora.

el analizador transforma una subconsulta en una Join así que. suele ser más efectivo utilizar una Join en lugar de una subconsulta. es más efectivo utilizar un Outer Join (Producto externo). o bien una subconsulta con MINUS.ID_CLI = CLIENTES. En optimización por reglas. UNION y INTERSECT no utilizan nunca índices. Con subconsultas. Los operadores NOT IN y NOT EXISTS siempre realizan un Full Scan de la tabla de la subconsulta. Los operadores MINUS.ID_CLI AND MES = 'ENERO') Este tipo de subconsultas de transforman en una Join donde la tabla conductora es la de la consulta principal que utilizará índices si es posible. el analizador reescribe la sentencia en un formato más general. Sólo son convenientes si la consulta principal es muy restrictiva. Internamente.doc © 2005 BearingPoint Global Technology Services . MINUS. pero el uso de éstas clarifica mucho la estructura de la sentencia. UNION o INTERSECT resultan ser la mejor optimización. ID_CLI FROM CLIENTES WHERE ID_CLI IN (SELECT ID_CLI FROM FACTURAS WHERE MES = 'ENERO') (Clientes que han facturado en el mes de Enero) Este tipo de subconsultas se transforman en una Join donde la tabla conductora es la de la consulta interna. Página 32 de 52 Curso Sql Avanzado. las normas generales serían: o Subconsultas no correlacionadas: Aquellas en que las tablas y condiciones de cada consulta son independientes. ID_CLI FROM CLIENTES WHERE ID_CLI EXISTS (SELECT ID_CLI FROM FACTURAS WHERE FACTURAS. o Subconsultas correlacionadas: Aquellas donde la consulta interna incorpora en el WHERE valores de la tabla de la consulta principal. por ejemplo: SELECT CLIENTE. no hay que descartar las subconsultas. en principio. en algunos casos. Como.4 Sentencias con subconsultas Una subconsulta es una sentencia SELECT (consulta interna) que proporciona el valor de una condición en el WHERE de otra consulta (consulta principal). realizan una ordenación sobre los datos y optimizan las dos consultas por separado. es mejor utilizar una Join que los operadores IN o EXISTS. En general. A pesar de lo dicho. Sólo son convenientes si la consulta interna es muy restrictiva.Optimización de consultas y SQL avanzado 6. Ejemplo (reescritura del ejemplo anterior): ELECT CLIENTE. UNION o INTERSECT.

una vista se almacena simplemente como una instrucción SQL previamente definida. Se pueden crear varios tipos de vistas. De hecho. La instrucción SELECT que define una vista sólo se ejecuta cuando se accede a la vista. todos los cambios de la tabla subyacente se reflejan en la vista. el DBMS une la instrucción SQL que se ejecuta en ese momento con la consulta que se use para definir la vista. Puede tener un nivel diferente de seguridad del que posea la tabla subyacente. El tipo de vista que se ha de crear depende completamente de para qué se quiera usar la vista. Esta tabla virtual está creada con datos de una o más tablas reales y. La consulta que define la vista se ejecuta con el nivel de seguridad que posea el usuario que crea la vista. cada uno de los cuales tienen ventajas en ciertas situaciones. una vista puede ser tratada del mismo modo que una tabla normal. De esta manera. una vista parece una tabla real.Optimización de consultas y SQL avanzado 6. Página 33 de 52 Curso Sql Avanzado. Siempre ofrecen los datos actualizados. Se pueden crear vistas de cualquiera de las siguientes maneras: Subconjunto de columnas de una tabla Subconjunto de filas de una tabla Unión de dos o más tablas Información de agregación Ventajas de las vistas La ventaja de utilizar vistas es que se pueden crear vistas que tienen atributos diferentes sin tener que duplicar los datos.doc © 2005 BearingPoint Global Technology Services . Cuando se accede a la vista. por tanto. para los usuarios.5 Vistas Una vista es una tabla virtual que está definida por una consulta que consiste en una instrucción SELECT. se puede crear una vista que enmascare los datos que no se quieran mostrar a ciertas clases de usuarios. En realidad.

la sentencia se trasforma en la siguiente TO_NUMBER(colvchar) = <num_expr> y al aplicarse la función de conversión el optimizador no utilizaría el índice. Sin embargo en el caso de utilizar una función WHERE b.1. Sin embargo. independientemente de los resultados obtenidos podemos tener en cuenta los siguientes criterios generales. es preferible el IN en aquellos casos en que la sentencia principal recupere un gran número de filas.campo1 = b. nos van a permitir determinar cuales de las sentencias de nuestra aplicación son ineficientes. en caso contrario. Página 34 de 52 Curso Sql Avanzado.000 filas. realizar los equijoins de las mismas con = y con el operador AND.campo1. cuando es la subconsulta la que presenta una alta cardinalidad es más eficiente el uso de EXITS.campo2 = SUBSTR(a. En las sentencias que se utilice más de una tabla. Los resultados de salida de las utilidades mencionadas deben ser analizados para tomar las medidas necesarias que mejoren el rendimiento.campo2 è en este caso el optimizador utilizaría el índice al ejecutar la sentencia. Oracle nos proporciona la utilidad SQL_TRACE que combinada con la utilidad TKPROF. Simplificar querys complejas con el operador UNION. Cualquier expresión que utilice una función provoca que el optimizador no utilice el índice correspondiente. Si queremos usar el índice definido sobre la columna colvchar de tipo VARCHAR2 Colvchar = <num_expr> y <num_expr> es de tipo NUMBER.1 Optimización ORACLE: Database Tuning Generalidades para la optimización de sentencias SQL El objetivo de la optimización de las sentencias SQL presentes en las aplicaciones es doble. por un lado reducir el tiempo de respuesta de los usuarios y por otro reducir los recursos utilizados por el sistema para ejecutar las sentencias. Es preciso identificar aquellas sentencias SQL que consumen la mayor parte de los recursos del sistema y que ralentizan los tiempos de respuesta. Ejemplo: La tabla clientes tiene 27. Prestar atención a las conversiones implícitas de datos.doc © 2005 BearingPoint Global Technology Services . es decir.4) el optimizador no utilizaría el índice lo que redundaría en una pérdida de eficiencia.Optimización de consultas y SQL avanzado 7 7. En caso de ser necesario su uso. Evitar uso de IN y EXITS. Ejemplo: supongamos un índice definido sobre el campo1 de la tabla a WHERE a. Evitar el uso de funciones SQL en la cláusula WHERE.

cliente_no = p. borrado y actualización. recupera los 27.cliente_nombre FROM clientes c WHERE EXISTS (SELECT 1 FROM pedidos p WHERE c.cliente_no IN (SELECT p.cliente_no AND p. La SELECT selecciona los pedidos realizados por el cliente 1000.cliente_no.cliente_no.cliente_nombre FROM clientes c WHERE c.000 filas. lo que redunda en un mejor rendimiento de la sentencia.doc © 2005 BearingPoint Global Technology Services .cliente_no = 1000) El plan de ejecución de la sentencia.cliente_no = 1000) El plan de ejecución de la sentencia. No usar índices de manera generalizada. Tip: En las cargas masivas de datos deshabilitar constraints y triggers. lo que hace que la ejecución sea ineficiente.000 registros de la tabla clientes y los filtra con la tabla pedidos. pero ralentizan las operaciones de inserción.cliente_no FROM pedidos p WHERE p. Rescribiendo la sentencia con IN: SELECT c. recupera los pedidos del cliente 1000 para realizar posteriormente el join con la tabla clientes. Página 35 de 52 Curso Sql Avanzado. SELECT c.Optimización de consultas y SQL avanzado La tabla pedidos tiene 10. c. Los índices suelen mejorar el rendimiento de las sentencias de consulta. c.

Se puede particionar sin modificar las aplicaciones existentes.1 Tipos de Tablas Tablas Particionadas El manejo de tabla de gran tamaño puede producir problemas de rendimiento en nuestra Base de Datos. pctused.2. Ventajas de particionar Se reducen los tiempos de respuesta en las operaciones de manipulación DML puesto que la operación se realiza sobre una partición en concreto y no sobre toda la tabla. tiene las mismas columnas. Página 36 de 52 Curso Sql Avanzado. Una vez definidas las particiones. Una tabla particionada: Puede ser particionada hasta un máximo de 64. Partition Key Debemos establecer en base a cual de las columnas o conjuntos de columnas se va a realizar la partición. es decir.Optimización de consultas y SQL avanzado 7.2 7. las sentencias SQL acceden y manipulan los datos de la misma manera que si la tabla no estuviese particionada. cada partición puede tener diferentes atributos físicos (pctfree.…). es lo que se denomina partition key. Se puede convertir una tabla no particionada en particionada sin necesidad de modificar ninguna de las sentencias DML que acceden y manipulan los datos de dicha tabla.doc © 2005 BearingPoint Global Technology Services . problema que puede ser resuelto dividiendo o descomponiendo dichas tablas en pequeñas sub-tablas denominadas particiones. los mismos tipos de datos y las mismas restricciones de integridad. Se reduce el tiempo de acceso a los datos si estos accesos afectan a una o varias particiones y no a toda la tabla. ROWID no puede formar parte de la partition key. No puede contener columnas a NULL. A través de la partition key Oracle 9i determina sobre que partición va a realizar las operaciones DML. Cada una de las particiones en que dividimos una tabla tiene los mismos atributos lógicos que las demás. La partition key: Puede estar formada de 1 a 16 columnas. sin embargo. tablespace. Las tablas particionadas son especialmente útiles en entornos de Datawarehouse donde la cantidad de datos que se almacenan y analizan es enorme.000 particiones. Las operaciones de mantenimiento se simplifican puesto que se pueden realizar sobre particiones.

por la partición anterior. definidas sobre rangos del partition key. que mapea los datos en particiones. VARCHAR2(6).Optimización de consultas y SQL avanzado No puede contener campos LONG y LONG RAW. NUMBER(6). Composite Partitioning. Métodos de particionamiento Oracle proporciona los siguientes métodos de particionamiento: Range Partitioning. Todas las particiones excepto la primera tienen un valor inferior del rango definido de manera implícita. Para la última partición se puede definir un MAXVALUE que indica el valor máximo admitido en dicha partición.doc © 2005 BearingPoint Global Technology Services . Range Partitioning Método de particionamiento. VARCHAR2(40). Ejemplo: Tabla de ventas por cuatrimestres CREATE TABLE VENTAS_CUATRIMESTRES (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4). DATE) PARTITION BY RANGE (fecha_venta) Página 37 de 52 Curso Sql Avanzado. Si puede contener campos LOB y CLOB. Se deberán tener en cuenta las siguientes consideraciones: Cada partición tiene una cláusula VALUES LESS THAN que indica los límites de la partición. List Partitioning. Hash Partitioning.

‘MURCIA’)). PARTITION ventas_2cuat VALUES LESS THAN (TO_DATE (‘01/09/2004’. Las ventajas de este método es que permite organizar los datos del modo adecuado a nuestras necesidades. PARTITION ventas_2region VALUES (‘ARAGON’.’DD/MM/YYYY’)). List Partitioning Método de particionamiento. Ejemplo: Tabla de ventas particionada agrupando los datos de diferentes regiones. ‘VALENCIA’.’DD/MM/YYYY’))).’BALEARES’). Página 38 de 52 Curso Sql Avanzado.doc © 2005 BearingPoint Global Technology Services . ’CANTABRIA’. ‘GALICIA’. LA MANCHA’. NUMBER(6). definidas sobre una lista de valores del partition key. que mapea los datos en particiones.Optimización de consultas y SQL avanzado (PARTITION ventas_1cuat VALUES LESS THAN (TO_DATE (‘01/05/2004’. DATE) PARTITION BY RANGE (region_venta) (PARTITION ventas_1region VALUES (‘ASTURIAS’. VARCHAR2(6). PARTITION ventas_3region VALUES (‘ANDALUCIA’. PARTITION ventas_3cuat VALUES LESS THAN TO_DATE (‘01/01/20005’.’CATALUÑA’.’MADRID’).’DD/MM/YYYY’)).’C. CREATE TABLE ventas_regiones (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4). VARCHAR2(40).

Página 39 de 52 Curso Sql Avanzado. VARCHAR2(40). Ejemplo: Tabla ventas particionada agrupando los datos por el identificador del comercial. Es la mejor opción de particionamiento en los siguientes casos: No sabemos a priori el volumen de datos.Optimización de consultas y SQL avanzado Hash Partitioning Método de particionamiento para datos que no admiten una partición por rangos o por lista. Composite Partitioning Método que combina los métodos anteriores. realizando particiones por rango. y dentro de cada partición subparticiones hash o basadas en listas. Ejemplo: Tabla ventas range-list. VARCHAR2(40). DATE) PARTITION BY HASH (comercial_id) PARTITIONS 4. NUMBER(6). VARCHAR2(6). Los tamaños de las particiones varían sustancialmente de unas a otras lo que hace difícil equilibrarlas de manera manual. VARCHAR2(6). NUMBER(6). CREATE TABLE ventas_composite_rl (comercial_id comercial_nombre region_venta importe_venta NUMBER(4). CREATE TABLE ventas_regiones (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4).doc © 2005 BearingPoint Global Technology Services .

’DD/MM/YYYY’))). Página 40 de 52 Curso Sql Avanzado. PARTITION ventas_2cuat VALUES LESS THAN (TO_DATE (‘01/09/2004’.’MADRID’). LA MANCHA’)) (PARTITION ventas_1cuat VALUES LESS THAN (TO_DATE (‘01/05/2004’.’GALICIA’. ‘C.’BALEARES’).’MURCIA’. SUBPARTITION ventas_2region VALUES (‘ARAGON’.doc © 2005 BearingPoint Global Technology Services . ‘VALENCIA’. ‘CANTABRIA’. PARTITION ventas_3cuat VALUES LESS THAN TO_DATE (‘01/01/20005’. SUBPARTITION ventas_3region VALUES(‘ANDALUCIA’.’CATALUÑA’.Optimización de consultas y SQL avanzado fecha_venta DATE) PARTITION BY HASH (fecha_venta) SUBPARTITION BY LIST (region_venta) SUBPARTITION TEMPLATE ( SUBPARTITION ventas_1region VALUES (‘ASTURIAS’.’DD/MM/YYYY’)).’DD/MM/YYYY’)).

(campo1 NUMBER) ON COMMIT DELETE ROWS. El uso de estas tablas aumneta de manera considerable el rendimiento ya que los datos permanecen únicamente durante la sesión. Página 41 de 52 Curso Sql Avanzado. TEMPORARY: el contenido de la tabla sólo es visible para la sesión en curso. Oracle permite la creación de tablas temporales (temporary tables) que mantienen los datos únicamente durante la sesión o la transacción en curso.doc © 2005 BearingPoint Global Technology Services . CREATE GLOBAL TEMPORARY TABLE prueba_temp. Ejemplo: Tabla temporal que elimina las filas (DELETE ROWS) una vez que la transacción ha finalizado. Ejemplo: Tabla temporal que mantiene las filas (PRESERVE ROWS) una vez que la transacción ha finalizado.2. Existen dos tipos de tablas temporales: GLOBAL TEMPORARY: el contenido de la tabla es accesible desde cualquier sesión.2 Tablas Temporales Además de las tablas estandar. (campo1 NUMBER) ON COMMIT PRESERVE ROWS.Optimización de consultas y SQL avanzado 7. CREATE GLOBAL TEMPORARY TABLE prueba_temp.

Índices basados en funciones Se pueden crear índices basados en cálculos más o menos complejos entre columnas de las tablas. Para tablas con gran volumen de datos. Ejemplo. Las primary keys y las unique key constraints generan implícitamente un índice. En índices compuestos ordenar las columnas por el orden en que son accedidas con mayor frecuencia. Todas las columnas que formen parte de una foreign key deben ser indexadas para evitar problemas de bloqueos.Optimización de consultas y SQL avanzado 7. Página 42 de 52 Curso Sql Avanzado. El siguiente ejemplo muestra como definir un índice basado en una función PL/SQL. Las columnas que con frecuencia se usan para ordenar los resultados de las consultas deberán tener asociado un índice. ya que una mala utilización puede provocar problemas de rendimiento. e incluso aplicando funciones PL/SQL. Existen varios tipos de índices: Simples Compuestos Basados en funciones (Function-based) Bit map Reglas de uso generales: Los índices aumentan la velocidad de ejecución de las consultas cuando se recupera entre un 10% . Sin embargo. actualizaciones y borrados. los índices ralentizan tanto las consultas como las inserciones. La función usada para crear el índice puede ser una expresión aritmética. no siempre los índices producen el efecto deseado.15% de los datos de la tabla.3 Indices. Todas las columnas unique deben ser indexadas. una expresión que contenga una función definida en un paquete o una función PL/SQL… La mejora del rendimiento se obtiene cuando las consultas se realizan en base a dichos cálculos. Tipos de índices Los índices son estructuras de datos asociados a tablas y clúster que incrementan la velocidad de ejecución de las sentencias SQL.doc © 2005 BearingPoint Global Technology Services .

En un índice normal esto se consigue almacenando una lista de rowid para cada valor clave que se corresponde con las filas que contienen dicho valor. CREATE INDEX upper_empleados ON empleados (UPPER(emp_nombre)).Optimización de consultas y SQL avanzado CREATE TABLE empleados (emp_id emp_nombre NUMBER(2). INDICE Id_vendedor ROWID 1000 2000 AFAAAA… ABAAAA… ROWID Id_vendedor AFAAAA ABAAAA TABLA DE VENTAS Importe_ventas 1000 2000 3700 850 En un índice bitmap no se almacena una lista de ROWID sino un valor 0 o 1 para cada una de las columnas que componen el índice. Página 43 de 52 Curso Sql Avanzado. Por lo tanto la eficiencia de estos índices aumenta de manera considerable cuando el número de condiciones que existen en la cláusula WHERE es elevado. Índices bitmap Un índice proporciona un puntero a las filas de las tablas que contienen el valor buscado. SELECT emp_nombre FROM empleados WHERE UPPER(emp_nombre) = ‘ALBERTO’. VARCHAR2(40)).doc © 2005 BearingPoint Global Technology Services .

Las operaciones realizadas sobre los datos: filtros. Ejecución de EXPLAIN PLAN A cada una de las sentencias analizadas le asignamos un identificador diferente.Optimización de consultas y SQL avanzado 7. ordenaciones. El plan de ejecución es la secuencia ordenada de operaciones que Oracle realiza para ejecutar la sentencia correspondiente.. Los métodos de acceso empleados para cada una de las tablas.4 Plan de Ejecución: Interpretación de resultados Oracle generalmente aplica una optimización basada es costes. El resultado de EXPLAIN PLAN es un árbol que muestra la siguiente información: Las tablas referenciadas en la sentencia SQL. EXPLAIN PLAN utiliza la tabla PLAN_TABLE para almacenar los resultados del plan de ejecución. contiene los siguientes valores: STATEMENT_ID TIMESTAMP OPERATION SELECT STATEMENTINSERT STATEMENTUPDATE STATEMENTDELETE STATEMENT Página 44 de 52 Curso Sql Avanzado. UPDATE y DELETE. para poder consultar el plan de ejecución de cada una de ellas de manera individual.doc © 2005 BearingPoint Global Technology Services . acumulaciones. que es una estrategia que consiste en la elaboración de múltiples planes de ejecución de una sentencia. eligiéndose aquella de menor coste de ejecución. EXPLAIN PLAN muestra el plan de ejecución elegido por el Optimizador de Oracle para ejecutar las sentencias SELECT.SQL almacenado por lo general en el path $ORACLE_HOME/rdbms/admin. INSERT. EXPLAIN PLAN SET STATEMENT_ID = <identificador_sentencia> FOR <sentencia SQL> Revisión de resultados de EXPLAIN PLAN Los campos de la tabla PLAN_TABLE más significativos son los siguientes: Columna Descripción Valor del identificador especificado en EXPLAIN PLAN Fecha y hora de ejecución Operación ejecutada. Los métodos de unión (join) de las tablas. Para crear dicha tabla en nuestro esquema será necesario ejecutar el script UTLXPLAN.

y lecturas realizadas Tiempos de proceso de CPU Número de lecturas lógicas y físicas realizadas Número de filas procesadas Página 45 de 52 Curso Sql Avanzado. Compara cada fila de un conjunto con la del otro.doc © 2005 BearingPoint Global Technology Services . BY INDEX ROWID BY GLOBAL INDEX ROWID BY LOCAL INDEX ROWID 7.5.1 Utilidades de información estadística sobre la ejecución de sentencias SQL_Trace SQL_TRACE proporciona información estadística sobre la ejecución de sentencias SQL. Genera para cada una de las sentencias los siguientes valores: Compilaciones (parse). NESTED LOOPS Operación sobre dos conjuntos de registros.5 7.Optimización de consultas y SQL avanzado OPTIONS Descripción de la operación Nombre de la tabla analizada Número de bytes accedidos en la ejecución de la sentencia (Optimizador Basado en Costes) OBJECT_NAME BYTES COST CARDINALITY Coste estimado de la sentencia (Optimizador Basado en Costes) Número de filas accedidas en la ejecución de la sentencia (Optimizador Basado en Costes) Los valores más usuales de OPERATION y OPTIONS son los siguientes: OPERATION INDEX OPTION Descripción RANGE SCAN Devuelve uno o más ROWID de un índice MERGE JOIN Operación que acepta dos conjuntos de filas. devolviendo las filas que cumplen la condición. combina las filas de uno con las del otro y devuelve el resultado. ordenado cada uno por un valor específico. TABLE ACCESS FULL Recupera todos los registros de la tabla Recupera los registros por el índice en tablas no particionadas Recupera los registros por el índice global en tablas particionadas Recupera los registros por el índice local en tablas particionadas. ejecuciones.

exe). Se activaría la traza ejecutando la sentencia: EXECUTE DBMS_SYSTEM. En el caso de querer trazar una sesión determinada de un usuario determinado. El fichero generado con la traza no es editable por lo que esta utilidad debe ser combinada con TKPROF.SET_SQL_TRACE_IN_SESSION(sid. Y se desactivaría: EXECUTE DBMS_SYSTEM. Para poder ejecutar TKPROF es requisito previo que el parámetro TIMED_STATICS tenga valor TRUE.FALSE). También puede ser activada desde un proceso PL/SQL del siguiente modo: BEGIN DBMS_SESSION.TRUE).SET_SQL_TRACE (TRUE).SET_SQL_TRACE_IN_SESSION(sid. Esta utilidad se encuentra normalmente en el path $ORACLE_HOME/BIN y su nombre varía según las versiones de Oracle (normalmente tkprof.serial#.serial#.2 TKPROF El fichero con la traza obtenido con SQL_TRACE no es editable. Sintaxis TKPROF tiene como parámetros principales de ejecución los siguientes Página 46 de 52 Curso Sql Avanzado. Y se desactivaría: ALTER SESSION SET SQL_TRACE = FALSE. <plsql_procedure_call>. Para poder analizar su contenido es preciso ejecutar la utilidad TKPROF.Optimización de consultas y SQL avanzado Fallos producidos en la cache Esta información es recogida en un fichero con extension . Podemos activar la traza con SQL_TRACE para una sesión determinada de la siguiente manera: ALTER SESSION SET SQL_TRACE = TRUE.SET_SQL_TRACE(FALSE).5. END. Dicho fichero se almacena en el path indicado por el parámetro USER_DUMP_DEST. 7. es preciso obtener previamente el valor de los campos SID y SERIAL# de la vista del sistema V$SESSION.doc © 2005 BearingPoint Global Technology Services . DBMS_SESSION.trc.

I/O) Página 47 de 52 Curso Sql Avanzado. … El optimizador basado en costes (CBOCost Based Optimizer) utiliza esta información para estimar cual es el plan óptimo de ejecución de las sentencias SQL.6 Estadísticas Como administradores de base de datos. 7. si el tamaño y la distribución de los datos en las tablas cambia frecuentemente. Las estadísticas se almacenan en el diccionario de datos y pueden ser exportadas de una base de datos a otra. Generación de estadísticas El optimizador basado en costes (CBO) utiliza las estadísticas para determinar los métodos de acceso más efectivos. podemos generar estadísticas que cuantifiquen la distribución de los datos y los modos de almacenamiento de las tablas. índices. En particular deben generarse cuando: Será necesario para optimizar tener en cuenta los siguientes puntos: Después de cargar gran cantidad de datos. particiones. el generar las estadísticas regularmente asegura que estas representen con precisión el estado de los datos.doc © 2005 BearingPoint Global Technology Services . Después de cambiar la estructura de los objetos que componen la base de datos. Por tanto. Es conveniente generar estadísticas de manera periódica para un rendimiento óptimo de la base de datos. El paquete DBMS_STATS contiene los procedimientos para la generación de estadísticas: Procedimiento GATHER_INDEX_STATS GATHER_TABLE_STATS GATHER_SCHEMA_STATS GATHER_DATABASE_STATS GATHER_SYSTEM_STATS Descripción Estadísticas de índices (bitmap) Estadísticas de tablas.Optimización de consultas y SQL avanzado TKPROF <fichero_traza><fichero_salida> Donde <fichero_traza> es el fichero generado por SQL_TRACE y fichero_salida> el fichero formateado por TKPROF y a partir del cual se pueden analizar los resultados de la traza. de manera que se pueden simular las condiciones de ejecución de un entorno de desarrollo en uno de producción y viceversa. columnas e índices estáticos Estadísticas para todos los objetos del esquema Estadísticas para todos los objetos de la BD Estadísticas del sistema (CPU. vistas.

vistas.Optimización de consultas y SQL avanzado 8 Diccionario de datos ORACLE Principalmente se usa de tres maneras: Oracle accesa el diccionario de datos para hallar la información acerca de los usuarios. procs. Oracle modifica el diccionario de datos cada vez que una instrucción DDL es usada. Cualquier usuario puede usar el diccionario de datos Hay tres grupos de vistas que contienen información similar y que se distinguen por su prefijo: Prefijo Descripción USER_ Vistas con información del esquema del usuario en sesión ALL_ Estas vistas presentan al usuario una perspectiva global de la base de datos. esquemas y estructuras almacenadas. funciones. DBA_ Vistas con la información de lo existe en todos los esquemas Algunas de las principales vistas del diccionario de datos Oracle: Significado Dba user all Información sobre todos los objetos: tablas. Le da al usuario información sobre todos los objetos en la base de datos a los que tiene acceso. triggers.doc © 2005 BearingPoint Global Technology Services . etc. índices. dba_objects user_objects all_objects Código de funciones y procedimientos user_source all_source Usuarios dba_users user_users all_users Roles dba_roles Roles asignados a roles o usuarios Dba_role_privs user_role_privs Página 48 de 52 Curso Sql Avanzado.

Optimización de consultas y SQL avanzado Privilegios asignados a roles o usuarios Dba_sys_privs Permisos sobre tablas asignados a roles o usuarios Dba_tab_privs Perfiles y sus límites de recursos asociados Dba_profiles Límites de recursos en cuanto a restricciones en claves user_password_limits Tablespaces Dba_tablespaces user_tablespaces Secuencias Dba_sequences user_sequences all_sequences Tablas. vistas. externa. integridad referencial Dba_constraints user_constraints all_constraints Índices Dba_indexes user_indexes all_indexes Columnas de los índices Dba_ind_columns user_ind_columns all_ind_columns Página 49 de 52 Curso Sql Avanzado.doc © 2005 BearingPoint Global Technology Services . not null. sinónimos y secuencias Dba_catalog user_catalog all_catalog Tablas Dba_tables user_tables all_tables Campos de tablas Dba_cons_columns user_cons_columns all_cons_columns Columnas de las tablas all_cons_columns user_tab_columns all_tab_columns Vistas Dba_views user_views all_views Sinónimos Dba_synonyms user_synonyms all_synonyms Restricciones de clave primaria.

por ejemplo: select OBJECT_NAME. Para seleccionar sólo un cierto número de registros: SELECT * FROM EMP WHERE ROWNUM <= 10. OBJECT_TYPE from ALL_OBJECTS where OBJECT_NAME like '%ROLE%'.doc © 2005 BearingPoint Global Technology Services . y probablemente sea necesario filtrarla. Se puede obtener un listado de todas con select OBJECT_NAME from ALL_OBJECTS.Optimización de consultas y SQL avanzado Estas son sólo algunas de las tablas y vistas. Página 50 de 52 Curso Sql Avanzado. pero la lista es muy larga.

Optimización de consultas y SQL avanzado 9 Diccionario de datos SQL Server Algunas de las principales vistas del diccionario SQL Server: Contenido INFORMATION_ESCHEMA.doc © 2005 BearingPoint Global Technology Services . Claves definidas en la Base de Datos CHECK_CONSTRAINTS Tablas y Vistas de la Base de Datos TABLES Permisos sobre tablas asignados al usuario actual TABLES_PRIVILEGES Columnas de las Tablas COLUMNS Permisos sobre las columnas asignados al usuario actual COLUMNS_PRIVILEGES Columnas utilizadas en una Vista VIEW_COLUMN_USAGE Tablas utilizadas en una vista VIEW_TABLE_USAGE Vistas VIEWS Columnas clave definidas de las tablas CONSTRAINT_COLUMN_USAGE Claves Foráneas REFERENTIAL_CONSTRAINTS Página 51 de 52 Curso Sql Avanzado.

Constraint name. Type of table.Optimización de consultas y SQL avanzado Tables Column name TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE Data type nvarchar(128) nvarchar(128) Sysname varchar(10) Description Table qualifier. Constraint owner. PRIMARY KEY. Specifies whether constraint checking is deferrable. Table name. Table qualifier. VIEW or BASE TABLE. Table owner. Table name. Type of constraint. CHECK. IS_DEFERRABLE varchar(2) Página 52 de 52 Curso Sql Avanzado. UNIQUE. Table owner. or FOREIGN KEY. Table Constraints CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE nvarchar(128) nvarchar(128) Sysname nvarchar(128) nvarchar(128) Sysname varchar(11) Constraint qualifier.doc © 2005 BearingPoint Global Technology Services . Always returns NO.

Sign up to vote on this title
UsefulNot useful