Vous êtes sur la page 1sur 52

OPTIMIZACIN DE CONSULTAS Y SQL AVANZADO

Optimizacin de consultas y SQL avanzado

CONTENIDO
1 INTRODUCCIN ....................................................................................................................................... 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 PROPSITO DEL DOCUMENTO................................................................................................................ 3 INTRODUCCIN AL STRUCTURED QUERY LANGUAGE .......................................................................... 3 COMPONENTES DEL SQL ....................................................................................................................... 4 CONSULTAS DE SELECCIN .................................................................................................................. 4 CRITERIOS DE SELECCIN ..................................................................................................................... 6 AGRUPAMIENTO DE REGISTROS Y FUNCIONES AGREGADAS ................................................................ 7 CONSULTAS DE MANIPULACIN DE DATOS ........................................................................................... 9 CONSULTAS DE COMBINACIN ENTRE TABLAS ................................................................................... 11 INNERS JOINS ....................................................................................................................................... 12 OUTER JOINS ........................................................................................................................................ 14 CONSULTAS DE AUTOCOMBINACIN .................................................................................................. 15 CONSULTAS DE COMBINACIONES NO COMUNES ................................................................................. 16

REVISIN DE CONCEPTOS BSICOS DE SQL ................................................................................. 4

CONSULTAS DE UNIN INTERNAS (JOINS) ................................................................................... 11

CONSULTAS DE UNIN EXTERNAS (UNIONS) .............................................................................. 17 SUBCONSULTAS ..................................................................................................................................... 19 5.1 5.2 5.3 EMPLEO DE SUBCONSULTAS ................................................................................................................ 19 GRUPOS CON SUBCONSULTAS.............................................................................................................. 21 CASOS PRCTICOS ............................................................................................................................... 22 CONSEJOS GENERALES......................................................................................................................... 23 EMPLEO DE NDICES ............................................................................................................................. 25 SENTENCIAS CON JOINS. ...................................................................................................................... 31 SENTENCIAS CON SUBCONSULTAS....................................................................................................... 32 VISTAS ................................................................................................................................................. 33 GENERALIDADES PARA LA OPTIMIZACIN DE SENTENCIAS SQL ........................................................ 34 TIPOS DE TABLAS ................................................................................................................................36 INDICES, TIPOS DE NDICES.................................................................................................................. 42 PLAN DE EJECUCIN: INTERPRETACIN DE RESULTADOS................................................................... 44 UTILIDADES DE INFORMACIN ESTADSTICA SOBRE LA EJECUCIN DE SENTENCIAS ......................... 45 ESTADSTICAS ...................................................................................................................................... 47

OPTIMIZACIN DE CONSULTAS ...................................................................................................... 23 6.1 6.2 6.3 6.4 6.5

OPTIMIZACIN 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

Pgina 3 de 52

Optimizacin de consultas y SQL avanzado

Pgina 2 de 52

1 1.1

Introduccin Propsito del Documento

El presente documento es una introduccin 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 mximo los recursos disponibles. El objetivo de este documento es, por tanto, servir de gua 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 aplicacin ineficiente har intil 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

Introduccin 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 estndar de consulta de datos especficos Es una forma de extraer y manipular datos de una base de datos Usado para todas las funciones de bases de datos, incluyendo administracin, creacin de esquemas y datos recuperables Puede ser usado de forma implcita dentro de una aplicacin

Pero como sucede con cualquier sistema de normalizacin 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 segn peculiaridades, aunque si se puede asegurar que cualquier sentencia escrita en ANSI ser interpretable por cualquier motor de datos.

Pgina 4 de 52

Optimizacin de consultas y SQL avanzado

Revisin de conceptos bsicos de SQL

2.1

Componentes del SQL

El lenguaje SQL est compuesto por comandos, clusulas, 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, Clusulas: FROM, WHERE, GROUP BY, HAVING, ORDER BY Operadores lgicos: AND, OR, NOT Operadores de Comparacin: < , >, <>, <=, >=, =, BETWEEN, LIKE, In Funciones de Agregado: AVG, COUNT, SUM, MAX, MIN

2.2

Consultas de Seleccin

Las consultas de seleccin se utilizan para indicar al motor de datos que devuelva informacin de las bases de datos, esta informacin es devuelta en forma de conjunto de registros.

2.2.1 Consultas Bsicas


La sintaxis bsica de una consulta de seleccin 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 seleccin: SELECT FROM ProductName, 'Precio unidad:', UnitPrice 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 clasula ORDER BY Lista de Campos: SELECT LastName, Address FROM Employees ORDER BY LastName;

Pgina 5 de 52

Optimizacin 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 clasula 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 instruccin 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 ms rpido 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. Tambin podemos asignar alias a las tablas dentro de la consulta de seleccin, 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 clusula SELECT.

Pgina 6 de 52

Optimizacin de consultas y SQL avanzado

2.3

Criterios de Seleccin

Son las posibilidades de filtrar los registros con el fin de recuperar solamente aquellos que cumplan una condiciones preestablecidas.

2.3.1 Operadores Lgicos


Los operadores lgicos soportados por SQL son: AND, OR, Is y Not. A excepcin de los dos ltimos todos poseen la siguiente sintaxis: <expresin1> operador <expresin2>

En donde expresin1 y expresin2 son las condiciones a evaluar. Si a cualquiera de las anteriores condiciones le anteponemos el operador NOT el resultado de la operacin ser el contrario al devuelto sin el operador NOT. El operador denominado IS se emplea para comparar dos variables de tipo objeto <Objeto1> Is <Objeto2>. Este operador devuelve Verdadero si los dos objetos son iguales. SELECT * FROM Employees WHERE BirthDate > '1947-09-15' AND BirthDate < '1960-04-01'; SELECT * FROM Employees WHERE NOT City = 'London'; SELECT * FROM Employees WHERE (BirthDate > '1956-09-15' AND BirthDate < '1965-04-01') OR City = 'London' AND Title = 'Sales Manager';

2.3.2 Intervalos de Valores


Para indicar que deseamos recuperar los registros segn el intervalo de valores de un campo emplearemos el operador Between: SELECT * FROM Products WHERE UnitPrice Between 50.0000 And 100.0000;

2.3.3 El Operador Like


Se utiliza para comparar una expresin de cadena con un modelo en una expresin SQL. SELECT * FROM Products WHERE ProductName like 'M%'

2.3.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', 'Tacoma', 'Redmond');

Pgina 7 de 52

Optimizacin de consultas y SQL avanzado

2.4 2.4.1

Agrupamiento de Registros y Funciones Agregadas La clusula GROUP BY

2.4.1.1 Agrupamiento de datos


SQL proporciona una forma eficiente para manejar la informacin con el agrupamiento de datos a travs de la formacin de grupos y las funciones correspondientes, dando la posibilidad de procesar no solo registros individuales. Cada grupo tendr como resultado de la consulta una fila resumen que contiene la informacin del grupo. Para la formacin de grupos adicionamos, a la forma bsica de la sentencia SELECT vista anteriormente, la orden GROUP BY ubicada antes de ORDER BY, como se muestra a continuacin: SELECT GROUP BY ORDER BY Lista... FROM Tabla, Tabla... WHERE Condiciones

Expresin, Expresin,... Expresin, Expresin,...;

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. Cantidad de registros que hay en la tabla, incluyendo los valores nulos. Valor mnimo del grupo. Valor mximo del grupo. Suma los valores del grupo. Calcula valor medio del grupo, sin considerar los valores nulos.

La lista de columnas a mostrar en la consulta puede contener las funciones de grupo, as como la columna o expresin usada para formar los grupos en la orden GROUP BY. En una misma consulta no se pueden mezclar funciones de grupo con columnas o funciones que trabajan con registros individuales. GROUP BY es opcional. Los valores de resumen se omiten si no existe una funcin SQL agregada en la instruccin SELECT. Tip: Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalan en ninguna de las funciones SQL agregadas. Las cargas de pedidos por cliente es un buen ejemplo para mostrar el uso de los grupos: SELECT CompanyName "CLIENTE", COUNT(Freight) "CARGA",

Pgina 8 de 52

Optimizacin de consultas y SQL avanzado

MIN(Freight) "MINIMA", AVG(Freight) "MEDIA", MAX(Freight) "MAXIMA", SUM(Freight) "TOTAL" FROM Customers,Orders WHERE Customers.CustomerID=Orders.CustomerID GROUP BY CompanyName; Tip: El orden en las consultas por grupos, cuando no est presente la orden ORDER BY, est dado por la columna que forma los grupos. Si deseamos cambiar ese orden, como es el caso de ordenar por el valor total de ventas, se debe adicionar al final la orden ORDER BY SUM(VALOR). SELECT CustomerID, COUNT(Freight) "CARGA",MIN(Freight) "MINIMA", AVG(Freight) "MEDIA",MAX(Freight) "MAXIMA",SUM(Freight) "TOTAL" FROM Orders GROUP BY CustomerID ORDER BY SUM(Freight) DESC;

2.4.1.2 La clusula having


Aplica una condicin a los grupos despus de formarse.Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la clusula HAVING. HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar. SELECT ProductName, CategoryID, Sum(UnitsInStock) FROM Products GROUP BY CategoryID, ProductName HAVING Sum(UnitsInStock) < 100 AND ProductName Like 'Gra%'; Tip: Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados.

2.4.2

Count (Contar registros)

Count cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los registros.

Pgina 9 de 52

Optimizacin de consultas y SQL avanzado

SELECT Count(*) AS Total_Empleados FROM Employees; SELECT Count(DISTINCT City) AS Total FROM Employees; Tip: La funcin Count no cuenta los registros que tienen campos Null a menos que coloquemos el carcter comodn asterisco (*). Si utiliza un asterisco, Count calcula el nmero total de registros, incluyendo aquellos que contienen campos Null. Count(*) es considerablemente ms rpida que Count(Campo).

2.4.3

Max y Min (Valores Mximos y Mnimos)

Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo especifico de una consulta. Su sintaxis es: Min(expr) Max(expr) Expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). SELECT Min(UnitsInStock) AS stockMin FROM Products WHERE CategoryID = 1; SELECT Max(UnitsInStock) AS stockMax FROM Products WHERE CategoryID = 1;

2.4.4

Sum (Sumar Valores)

Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es: Sum(expr) En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos. SELECT Sum(UnitPrice * UnitsOnOrder) AS Total FROM Products;

2.5

Consultas de manipulacin de datos

Las consultas de accin son aquellas que no devuelven ningn registro, son las encargadas de acciones como aadir y borrar y modificar registros.

2.5.1

Delete

Elimina los registros de una o ms de las tablas listadas en la clusula FROM que satisfagan la clusula WHERE. DELETE FROM Region WHERE RegionDescription = 'Southern';

Pgina 10 de 52

Optimizacin de consultas y SQL avanzado

Tip: Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la operacin. Si desea saber qu registros se eliminarn, primero examine los resultados de una consulta de seleccin que utilice el mismo criterio y despus ejecute la consulta de borrado. Si elimina los registros equivocados podr recuperarlos desde las copias de seguridad.

2.5.2

Insert into

Agrega un registro en una tabla. Esta consulta puede ser de dos tipos: Insertar un nico registro Insertar en una tabla los registros contenidos en otra tabla. Insertar un nico registro: INSERT INTO Tabla (campo1, campo2, .., campoN) VALUES (valor1, valor2, ..., valorN) Para seleccionar registros e insertarlos en una tabla nueva SELECT campo1, campo2, ..., campoN INTO nuevatabla FROM tablaorigen [WHERE criterios] Insertar registros de otra tabla: INSERT INTO Tabla [IN base_externa] (campo1, campo2, ..., campoN) SELECT TablaOrigen.campo1, TablaOrigen.campo2, ..., TablaOrigen.campoN FROM TablaOrigen Si Tabla y TablaOrigen poseen la misma estrucutra podemos simplificar la sintaxis a: INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen Tip: Con Oracle podemos crear una tabla a partir de una seleccin, insertando los datos implcitamente CREATE TABLE Tabla1 AS SELECT * FROM Tabla2

2.5.3

Update

Crea una consulta de actualizacin que cambia los valores de los campos de una tabla especificada basndose en un criterio especfico. UPDATE Employees SET ReportsTo = 1 WHERE ReportsTo = NULL; UPDATE Products SET UnitPrice = UnitPrice * 1.1 WHERE SupplierID = 1 AND CategoryID = 2; Si en una consulta de actualizacin suprimimos la clusula WHERE todos los registros de la tabla sealada sern actualizados. UPDATE Products SET UnitPrice = UnitPrice * 1.1;

Pgina 11 de 52

Optimizacin de consultas y SQL avanzado

Consultas de Unin Internas (Joins)

3.1

Consultas de Combinacin entre tablas

La operacin join permite extraer datos de dos o ms 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, porque el contenido de las columnas de cada tabla son iguales. SELECT Suppliers.SupplierID, ProductName FROM Suppliers, Products WHERE Suppliers.SupplierID = Products.SupplierID; Consulta que muestra los productos que tiene cada proveedor.

Producto Cartesiano Si no se especifican en el where las columnas utilizadas para relacionar las tablas, el sistema asume que se desea obtener la combinacin de los registros de cada tabla. Esto se conoce como producto cartesiano. SELECT CompanyName, ProductName FROM Suppliers, Products;

Pgina 12 de 52

Optimizacin de consultas y SQL avanzado

3.2

Inners Joins

Las vinculaciones entre tablas se realizan mediante la clusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo comn. Su sintaxis es: SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2 En donde: tb1, tb2 Son los nombres de las tablas desde las que se combinan los registros. campo1, campo2 Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre. comp Es cualquier operador de comparacin relacional : =, <, >, <=, >=, o <>. Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones de igualdad son las ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn a ambas tablas. El ejemplo siguiente muestra cmo podra combinar las tablas Employees y Orders basndose en el campo EmployeeID: SELECT FirstName, ShipAddress FROM Employees INNER JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID; Tambin se pueden enlazar varias clusulas ON en una instruccin JOIN, utilizando la sintaxis siguiente: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tabla1.campo1 comp tabla2.campo1 AND ON tabla1.campo2 comp tabla2.campo2) OR ON tabla1.campo3 comp tabla2.campo3)]; Tambin puede anidar instrucciones JOIN utilizando la siguiente sintaxis:

Pgina 13 de 52

Optimizacin de consultas y SQL avanzado

SELECT campos FROM tabla1 INNER JOIN (tabla2 INNER JOIN [( ] tabla3 [INNER JOIN [( ] tablaX [INNER JOIN ...)] ON tabla3.campo3 comp tbx.campox)] ON tabla2.campo2 comp tabla3.campo3) ON tabla1.campo1 comp tabla2.campo2;

SELECT LastName, ShipAddress, CompanyName FROM Customers INNER JOIN (Orders INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID) ON Customers.CustomerID = Orders.CustomerID;

No obstante, los INNER JOIN ORACLE no es capaz de interpretarlos hasta la versin 8i, pero existe una sintaxis en formato ANSI para los INNER JOIN que funcionan en todos los sistemas. Tomando como referencia la siguiente sentencia: SELECT Customers.CustomerId, Orders.freight, Orders.ShipCity FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE CompanyName = 'Franchi S.p.A.'; La transformacin de esta sentencia a formato ANSI sera la siguiente: SELECT Customers.CustomerId, Orders.freight, Orders.ShipCity FROM Customers, Orders WHERE Customers.CustomerID = Orders.CustomerID AND CompanyName = 'Franchi S.p.A.';

Pgina 14 de 52

Optimizacin de consultas y SQL avanzado

3.3

Outer Joins

Si empleamos la clusula INNER en la consulta se seleccionarn slo 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. Para solucionar esto tenemos dos clusulas que sustituyen a la palabra clave INNER, estas clusulas son LEFT/RIGHT OUTER JOIN. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningn registro en la tabla de la izquierda. RIGHT realiza la misma operacin pero al contrario, toma todos los registros de la tabla de la derecha aunque no tenga ningn registro en la tabla de la izquierda. SELECT DISTINCT Employees.EmployeeID, FirstName, ShipAddress, OrderID FROM Employees Left outer JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID order by employees.EmployeeID; En este caso la consulta muestra todos los registros de la tabla Empleados (Employees) aunque no tengan ningn registro asociado en la tabla Pedidos (Orders). SELECT CompanyName, ShipAddress, OrderID FROM Orders Right Outer JOIN Customers ON Customers.CustomerID = Orders.CustomerID; En este caso muestra todos los registros de la tabla Clientes (Customers) aunque no tengan ningn registro en la tabla Pedidos (Orders). Puede haber clientes que no hayan realizado ningn pedido.

Referente a los OUTER JOIN, no funcionan en ORACLE hasta la versin 8i. La sintaxis en ORACLE se emplea aadiendo los caracteres (+) detrs del nombre de la tabla en la que deseamos aceptar valores nulos, esto equivale a un LEFT JOIN: SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes WHERE Facturas.IdAlbaran = Albaranes.IdAlbaran (+) AND Facturas.IdCliente = 325 Y esto a un RIGHT JOIN: SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes WHERE Facturas.IdAlbaran (+) = Albaranes.IdAlbaran AND Facturas.IdCliente = 325

Pgina 15 de 52

Optimizacin de consultas y SQL avanzado

Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN. Por ejemplo: SELECT Products.ProductID, ProductName, CategoryName, OrderDetails.OrderID FROM Categories INNER JOIN (Products Left JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID) ON Categories.CategoryID = Products.CategoryID order by Products.ProductID; Crea dos combinaciones equivalentes: una entre las tablas Products y Categories, y la otra entre las tablas Products y OrderDetails. La consulta retorna una lista de todos los productos existententes con su categora correspondiente y los pedidos realizados de dichos productos. En el caso de no existir ningn pedido relacionado a alguno de los productos el campo OrderID aparecer con valor NULL.

3.4

Consultas de Autocombinacin

La autocombinacin se utiliza para unir una tabla consigo misma, comparando valores de dos columnas con el mismo tipo de datos. La sintaxis en la siguiente: SELECT alias1.columna, alias2.columna, ... FROM tabla1 as alias1, tabla1 as alias2 WHERE alias1.columna = alias2.columna AND otras condiciones Por ejemplo, para visualizar el nmero, nombre y puesto de cada empleado (EmployeeID, LastName, Title), junto con el nmero, nombre y puesto del supervisor (ReportsTo, LastName, Title )de cada uno de ellos se utilizara la siguiente sentencia: SELECT E.EmployeeID , E.LastName, E.Title, E.ReportsTo, S.LastName, S.Title FROM Employees AS E, Employees AS S WHERE E.ReportsTo = S.EmployeeID; El resultado de la consulta no mostrar a aquellos empleados los cuales no tengan asignados supervisor, es decir, en aquellos casos para que ReportsTo = NULL. UPDATE Employees SET TitleOfCourtesy = 'Sup.' WHERE EmployeeID NOT IN

Pgina 16 de 52

Optimizacin de consultas y SQL avanzado

(SELECT E.EmployeeID FROM Employees AS E, Employees AS S WHERE E.ReportsTo = S.EmployeeID); Modifica el ttulo de cortesa para aquellos empleados los cuales no dependen de ningn supervisor, es decir ellos mismos son su propio supervisor.

3.5

Consultas de Combinaciones no Comunes

La mayora de las combinaciones estn basadas en la igualdad de valores de las columnas que son el criterio de la combinacin. Las no comunes se basan en otros operadores de combinacin, tales como NOT, BETWEEN, <>, etc. SELECT ProductName, CategoryID, Products.UnitPrice , Orders.OrderID, OrderDate, CustomerID FROM Products,[Order Details] , Orders WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-30' AND Products.ProductID = [Order Details].ProductID AND [Order Details].OrderID = Orders.OrderID ORDER BY Orders.OrderDate ASC; La select muestra el nombre del producto, la categora, el precio unitario del producto, el nmero de pedido, la fecha de pedido y el ID del cliente que lo realiz, de todos los pedidos realizados entre el periodo comprendido entre 0107-1996 y el 30-07-1996 ambos inclusive. Ordenados por la fecha en que se realiz el pedido.

Pgina 17 de 52

Optimizacin de consultas y SQL avanzado

Consultas de Unin Externas (Unions)

Se utiliza la operacin UNION para crear una consulta de unin, combinando los resultados de dos o ms consultas o tablas independientes. Su sintaxis es: [TABLE] consulta1 UNION [ALL] [TABLE] consulta2 [UNION [ALL] [TABLE] consultan [ ... ]] En donde: consulta1, consulta2, consultan Son instrucciones SELECT, el nombre de una consulta almacenada o el nombre de una tabla almacenada precedido por la palabra clave TABLE. Puede combinar los resultados de dos o ms consultas, tablas e instrucciones SELECT, en cualquier orden, en una nica operacin UNION. El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas y una instruccin SELECT: TABLE [Nuevas Cuentas] UNION ALL SELECT * FROM Clientes WHERE [Cantidad pedidos] > 1000; Tip: Si no se indica lo contrario, no se devuelven registros duplicados cuando se utiliza la operacin UNION, no obstante puede incluir el predicado ALL para asegurar que se devuelven todos los registros. Esto hace que la consulta se ejecute ms rpidamente. Todas las consultas en una operacin UNION deben pedir el mismo nmero de campos, no obstante los campos no tienen porqu tener el mismo tamao o el mismo tipo de datos. Se puede utilizar una clusula GROUP BY y/o HAVING en cada argumento consulta para agrupar los datos devueltos. Puede utilizar una clusula ORDER BY al final del ltimo argumento consulta para visualizar los datos devueltos en un orden especfico. SELECT [CompanyName], City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName], City FROM Customers WHERE Country = 'USA'; Recupera los nombres (CompanyName) y las ciudades (City) de todos proveedores (Suppliers) y clientes (Customers) de USA.

SELECT [CompanyName], City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName], City FROM Customers WHERE Country = 'USA' ORDER BY City;

Pgina 18 de 52

Optimizacin de consultas y SQL avanzado

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).

SELECT [CompanyName], City FROM Suppliers WHERE Country = 'USA' UNION SELECT [CompanyName], City FROM Customers WHERE Country = 'USA' UNION SELECT [LastName], City FROM Employees WHERE Region ='WA'; Recupera los nombres (CompanyName) y las ciudades (City) de todos proveedores (Suppliers) y clientes (Customers) de USA, y los apellidos (LastName) y ciudades (City) de todos los empleados cuya regin es WA.

Pgina 19 de 52

Optimizacin de consultas y SQL avanzado

Subconsultas

5.1

Empleo de Subconsultas

Una Subconsulta es aquella consulta de cuyo resultado depende otra consulta, llamada principal, y se define como una sentencia SELECT que est incluida en la orden WHERE de la consulta principal. Una subconsulta, a su vez, puede contener otra subconsulta y as hasta un mximo de 16 niveles. Tip: Las consultas normalmente son ineficientes, por tanto debern utilizarse como ltimo recurso ya que siempre es mejor tratar de realizar las consultas mediantes joins Las subconsultas son usadas: / / Porque algunas veces son ms fciles de entender que un join. Para efectuar algunas tareas que en otro caso sera imposible realizar utilizando un join (por ejemplo usar una funcin agregada)

Las particularidades de las subconsultas son: / / Su resultado no se visualiza, sino que se pasa a la consulta principal para su comprobacin. Puede devolver un valor nico o una lista de valores y en dependencia de esto se debe usar el operador del tipo correspondiente. No puede usar el operador BETWEEN, ni contener la orden ORDER BY. Puede contener una sola columna, que es lo ms comn, o varias columnas. Este ltimo caso se llama subconsulta con columnas mltiples. Cuando dos o ms columnas sern comprobadas al mismo tiempo, deben encerrarse entre parntesis.

/ /

Tip: Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta. Se puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clusula WHERE o HAVING. En una subconsulta, se utiliza una instruccin SELECT para proporcionar un conjunto de uno o ms valores especificados para evaluar en la expresin de la clusula WHERE o HAVING. 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. 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.25);

Pgina 20 de 52

Optimizacin 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 ningn 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 algn registro. Supongamos que deseamos recuperar todos aquellos clientes que hayan realizado al menos un pedido: SELECT Customers.CompanyName, Customers.Phone FROM Customers WHERE EXISTS (SELECT Orders.CustomerId FROM Orders WHERE Orders.CustomerId = Customers.CustomerId) Esta consulta es equivalente a esta otra: SELECT Customers.CompanyName, Customers.Phone FROM Customers WHERE CustomerId IN (SELECT Orders.CustomerId FROM Orders)

Tip: Es til utilizar tambin alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la clusula FROM fuera de la subconsulta. SELECT ProductName, UnitPrice FROM Products AS T1 WHERE UnitPrice >= (SELECT Avg(UnitPrice) FROM Products WHERE T1.ProductName = Products.ProductName) ORDER BY ProductName;

Que tambin puede escribirse: SELECT ProductName, UnitPrice FROM Products WHERE UnitPrice >= (SELECT Avg(UnitPrice) FROM Products as T2 WHERE T2.ProductName = Products.ProductName) ORDER BY ProductName;

Selecciona el nombre de todos los empleados que han reservado al menos un pedido. SELECT FirstName, LastName FROM Employees AS E WHERE EXISTS (SELECT * FROM Orders AS O WHERE O.EmployeeID = E. EmployeeID);

Pgina 21 de 52

Optimizacin 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. SELECT DISTINCT Products.ProductName, Products.UnitPrice FROM Products WHERE Products.UnitPrice =(SELECT Products.UnitPrice FROM Products WHERE Products.productName = 'Chang')

Supongamos que en nuestra tabla de empleados deseamos buscar todos los empleados cuyas edades superen a la media de la compaa: SELECT T1.FirstName FROM Employees T1 WHERE Year(T1.BirthDate) > (SELECT avg(Year(Employees.BirthDate))FROM Employees)

5.2

Grupos con subconsultas

Para combinar grupos con subconsultas debemos incluir en la sentencia SELECT la orden HAVING, que tiene las siguientes caractersticas: / Funciona como la orden WHERE, pero sobre los resultados de las funciones de grupo, en oposicin a las columnas o funciones para registros individuales que se seleccionan mediante la orden WHERE. O sea, trabaja como si fuera una orden WHERE, pero sobre grupos de registros. Se ubica despus de la orden GROUP BY. Puede usar una funcin de grupo diferente a la de la orden SELECT.

/ /

El ejemplo a disear para nuestra aplicacin es la consulta cul fue el artculo ms vendido y en qu cantidad?. En este caso, la orden HAVING de la consulta principal selecciona aquellos artculos (GROUP BY) que tienen una venta total (SUM(valor)) igual a la mayor venta realizada por artculo (MAX(SUM(valor))) que devuelve la subconsulta. SELECT column, SUM(column) FROM GROUP BY column HAVING SUM(column) condition value

En el ejemplo se seleccionan las unidades en stock del producto ms caro:

Pgina 22 de 52

Optimizacin de consultas y SQL avanzado

SELECT ProductName AS Producto, UnitsinStock AS StockActual FROM Products GROUP BY ProductName, UnitsinStock, UnitPrice HAVING UnitPrice =( Select MAX(UnitPrice) from Products)

5.3

Casos Prcticos

Bsqueda de registros duplicados SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As pseudnimo GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY CampoDeBusqueda;

Un caso prctico, si deseamos localizar aquellos empleados con igual nombre y visualizar su cdigo correspondiente, la consulta sera la siguiente: SELECT DISTINCT Employees.FirstName, Employees.EmployeeId FROM Employees WHERE Employees.FirstName In (SELECT FirstName FROM Employees As Tmp GROUP BY FirstName HAVING Count(*)>1) ORDER BY Employees.FirstName;

Bsqueda de registros no relacionados Este tipo de consulta se emplea en situaciones tales como saber qu productos no se han vendido. SELECT DISTINCT Products.ProductId, Products.ProductName FROM Products Left JOIN OrderDetails ON Orderdetails.ProductId = Products.ProductId WHERE (Orderdetails.ProductId Is Null); La sintaxis es sencilla, se trata de realizar una unin interna entre dos tablas seleccionadas mediante un LEFT JOIN, estableciendo como condicin que el campo relacionado de la segunda sea Null.

Pgina 23 de 52

Optimizacin de consultas y SQL avanzado

Optimizacin de consultas

El lenguaje SQL es no procedimental, es decir, en las sentencias se indica que queremos conseguir y no como lo tiene que hacer el interprete para conseguirlo. Esto es slo teora, pues en la prctica a todos los gestores de SQL hay que especificar sus propias reglas para optimizar el rendimiento. Por tanto, muchas veces no basta con especificar una sentencia SQL correcta, sino que adems, hay que indicarle como tiene que hacerlo si queremos que el tiempo de respuesta sea el mnimo. En este apartado veremos como mejorar el tiempo de respuesta de nuestro interprete ante unas determinadas situaciones:

6.1

Consejos generales

La construccin de una sentencia y los operadores y condiciones empleados determinan como la interpreta el analizador y por tanto su plan de ejecucin. En muchos casos, la reescritura de una sentencia puede cambiar radicalmente su plan de ejecucin y su rendimiento en el sistema. Como norma ms general, una sentencia est optimizada cuando implica realizar el nmero ms pequeo posible de accesos a los datos. / Hay que procurar que las condiciones de la clusula WHERE sean lo ms restringidas posibles; debemos evitar accesos a filas innecesarias. Hay que especificar siempre las columnas a las que queremos acceder (No hacer nunca SELECT *...) 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 la medida de lo posible hay que evitar que las sentencias SQL estn embebidas dentro del cdigo de la aplicacin. Es mucho ms eficaz usar vistas o procedimientos almacenados por que el gestor los guarda compilados. Si se trata de una sentencia embebida el gestor debe compilarla antes de ejecutarla. Tip: Si utilizamos varias tablas en la consulta, especificar siempre a que tabla pertenece cada campo, le ahorraremos al gestor el tiempo de localizar a que tabla pertenece el campo. En lugar de: SELECT Nombre, Factura FROM Clientes, Facturacion WHERE IdCliente = IdClienteFacturado Usar : SELECT Clientes.Nombre, Facturacion.Factura WHERE Clientes.IdCliente = Facturacion.IdClienteFacturado.

6.1.1

Diseo de las tablas

La optimizacin pasa por un correcto diseo del modelo de datos (Tablas), se deben seguir los siguientes consejos:

Pgina 24 de 52

Optimizacin de consultas y SQL avanzado

Normalizar las tablas, al menos hasta la tercera forma normal, para asegurar que no hay duplicidad de datos y se aprovecha al mximo el almacenamiento en las tablas. Si hay que desnormalizar alguna tabla pensar en la ocupacin y en el rendimiento antes de proceder. Los primeros campos de cada tabla deben ser aquellos campos requeridos y dentro de los requeridos primero se definen los de longitud fija y despus los de longitud variable. Ajustar al mximo el tamao de los campos para no desperdiciar espacio. Es muy habitual dejar un campo de texto para observaciones en las tablas. Si este campo se va a utilizar con poca frecuencia o si se ha definido con gran tamao, por si acaso, es mejor crear una nueva tabla que contenga la clave primaria de la primera y el campo para observaciones.

/ /

6.1.2

Campos de Filtro

Se procurar elegir en la clusula WHERE aquellos campos que formen parte de la clave de la tabla por el cual interrogamos. Adems se especificarn en el mismo orden en el que estn definidos en la clave. Tip: Interrogar siempre por campos que sean clave. Si deseamos interrogar por campos pertenecientes a ndices compuestos es mejor utilizar todos los campos de todos los ndices. Supongamos que tenemos un ndice formado por el campo NOMBRE y el campo APELLIDO y otro ndice formado por el campo EDAD. La sentencia WHERE NOMBRE='Juan' AND APELLIDO Like '%' AND EDAD = 20 sera ms optima que WHERE NOMBRE = 'Juan' AND EDAD = 20 por que el gestor, en este segundo caso, no puede usar el primer ndice y ambas sentencias son equivalentes porque la condicin APELLIDO Like '%' devolvera todos los registros.

6.1.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 deseamos saber cuantos alumnos se matricularon en el ao 1996 y escribimos: FROM Alumnos, Matriculas WHERE Alumno.IdAlumno = Matriculas.IdAlumno AND Matriculas.Ao = 1996 el gestor recorrer todos los alumnos para buscar sus matriculas y devolver las correspondientes. Si escribimos FROM Matriculas, Alumnos WHERE Matriculas.Ao = 1996 AND Matriculas.IdAlumno = Alumnos.IdAlumnos, el gestor filtra las matrculas y despus selecciona los alumnos, de esta forma tiene que recorrer menos registros.

6.1.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; es un valor que significa informacin no disponible Is Null debe ser utilizado para determinar valores Null contenidos en una columna; la sintaxis = Null es vlida pero no recomendada Un valor Null nunca es igual a otro valor Null

Pgina 25 de 52

Optimizacin de consultas y SQL avanzado

Los valores Null se consideran en el ordenamiento y en los grupos, Algunas columnas son definidas para permitir valores NULL Si un elemento es Null en una operacin el resultado ser Null

6.2

Empleo de ndices

Los ndices son campos elegidos arbitrariamente por el constructor de la base de datos que permiten la bsqueda a partir de dicho campo a una velocidad notablemente superior. Sin embargo, esta ventaja se ve contrarrestada por el hecho de ocupar mucha ms memoria (el doble ms o menos) y de requerir para su insercin y actualizacin un tiempo de proceso superior. Un caso en el que los ndices pueden resultar muy tiles es cuando realizamos peticiones simultneas sobre varias tablas. En este caso, el proceso de seleccin puede acelerarse sensiblemente si indexamos los campos que sirven de nexo entre las dos tablas. Los ndices pueden resultar contraproducentes si los introducimos sobre campos triviales a partir de los cuales no se realiza ningn tipo de peticin ya que, adems del problema de memoria ya mencionado, estamos ralentizando otras tareas de la base de datos como son la edicin, insercin y borrado. Es por ello que vale la pena pensrselo dos veces antes de indexar un campo que no sirve de criterio para bsquedas o que es usado con muy poca frecuencia por razones de mantenimiento. La mayora de consultas se optimizan si acceden a travs de un ndice. 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, y si ste ya existe, averiguar porqu no lo utiliza y reescribir la sentencia para que lo haga. En relacin a todo esto, hay que tener en cuenta las siguientes consideraciones: / Utilizar ndice para consultas muy restrictivas. El volumen mximo de datos recuperados sera del orden del 15 20 % de los registros de la tabla. 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) , naturaleza y distribucin 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; en este sentido, la informacin de una base de desarrollo puede ser totalmente errnea, la aplicacin se tiene que ajustar con una carga de datos realista. / Referenciar la columna o columnas del ndice en la clusula WHERE. El analizador no utilizar ndice en caso contrario. Se debe tratar que los ndice tengan la mayor selectividad posible (es decir el nmero de filas obtenido por cada valor del clave del ndice). A mayor selectividad del ndice mayor probabilidad de que sea usado por el optimizador de consultas. Se deben usar los ndices con moderacin, es decir, unos pocos ndices pueden ser tiles pero demasiados ndices pueden afectar negativamente al rendimiento porque hay que mantenerlos actualizados cada vez que se realizan operacin de insercin, actualizacin y borrado en los datos.

Pgina 26 de 52

Optimizacin de consultas y SQL avanzado

/ /

No poner ndices en tablas pequeas. No podemos indexar todos los campos de una tabla extensa ya que doblaramos el tamao de la base de datos. Igualmente. Utilizar el menor nmero posible de columnas en el ndice (ndices estrechos), ya que estos ocupan menos espacio y necesitan menos sobrecarga de mantenimiento. Las referencias de las columnas de un ndice compuesto en la clusula WHERE tienen que estar en el mismo orden que en el ndice. No es obligatorio incluir condiciones sobre todas, pero s sobre la primera, y si hay ms condiciones deberan ir sobre las siguientes columnas en el orden del ndice. Lo ilustraremos con un ejemplo: (ndice: NUM_CLIENTE, NOMBRE_CLIENTE, FECHA_ENTRADA) El Analizador utilizar el ndice con una clusula 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

Pgina 27 de 52

Optimizacin de consultas y SQL avanzado

No modificar la columna del ndice en el WHERE con funciones o expresiones. Esto deshabilita el uso del ndice. Por ejemplo, no se usaran ndice condiciones en el WHERE de la forma: SUBSTR(NOMBRE, 1, 5) = ... CLIENTE||'_01' = ... TO_CHAR(FECHA_ENTRADA, 'DD/MM/YYYY')=...;

Notar que podemos encontrar casos tan sencillos como los siguientes: (ndice 1: SUELDO ; ndice 2: NOMBRE) SELECT SUELDO FROM EMPLEADOS WHERE SUELDO*12 > 1500000; SELECT NOMBRE FROM CLIENTES WHERE SUBSTR(NOMBRE,1,1) = 'A'; Que no utilizan ndice, pero en cambio s que lo hacen: SELECT SUELDO FROM EMPLEADOS WHERE SUELDO > 1500000/12; SELECT NOMBRE FROM CLIENTES WHERE NOMBRE LIKE = 'A%'; En relacin con esto, hay que tener en cuenta que las conversiones automticas que realiza Oracle al comparar datos de tipos diferentes entran dentro de esta categora y por tanto inhabilitan el uso del ndice. De aqu: Si hay que hacer conversiones de tipos en la clusula WHERE, las haremos nosotros explcitamente con las funciones al efecto como TO_CHAR, TO_DATE, etc., y si es posible, siempre sobre datos fijos, no sobre columnas. / No utilizar el operador LIKE con un valor cuyo primer carcter sea el comodn '%'; ya que esto obliga a acceder a toda la tabla. En cambio, S que se utilizar ndice si la cadena empieza por un carcter fijo. Ejemplo: (ndice: NOMBRE_CLIENTE) NOMBRE_CLIENTE LIKE '%AA...' => Acceso a toda la tabla. NOMBRE_CLIENTE LIKE 'AA%' => Acceso por ndice. Tip: No utilizar LIKE con columnas que no sean de tipo carcter. En este caso, Oracle realiza implcitamente una conversin de tipo, por tanto, nunca se utilizar ndice.

Si en algn caso, queremos obligar al optimizador a realizar un acceso a toda la tabla a pesar de que en la condicin del WHERE se referencie a una columna indexada (Es el caso de tablas muy pequeas o con un ndice poco restrictivo), podemos utilizar una tcnica tan sencilla como:

Pgina 28 de 52

Optimizacin de consultas y SQL avanzado

Para una columna de tipo carcter: NOMBRE || '' =... Para una columna de tipo numrico: TOTAL + 0 = ... Tip: La optimizacin basada en costos de Oracle (Default) ya realiza esta operacin / Evitar los operadores NOT EQUAL (!=) ya que siempre acceden a toda la tabla al presuponer el analizador que se va a acceder a la mayora de los registros. As: (ndice: ZONA) SELECT CLIENTE FROM CLIENTES WHERE ZONA != 5; no utiliza el ndice, pero s que lo har: SELECT CLIENTE FROM CLIENTES WHERE ZONA > 5 AND ZONA < 5; No hay problema en utilizar las otras condiciones NOT, como por ejemplo: SELECT CLIENTE FROM CLIENTES WHERE NOT ZONA > 5; Donde la condicin: NOT ZONA > 5 se transformar en ZONA =< 5 y utilizar el ndice sobre ZONA de antes.

Para acceder va ndice con la clusula ORDER BY hay que atender a las mismas consideraciones que las hechas para WHERE: La columna del ndice no puede estar modificada por una expresin o funcin. Las columnas de un ndice compuesto han de estar en el mismo orden que en el ndice, siendo vlidas tambin las otras restricciones hechas para el caso de WHERE. Si la(s) columna(s) de la clusula ORDER BY no estn indexadas o no se puede utilizar el ndice, se realiza un 'Sort' de la tabla (o de las filas devueltas por la clusula WHERE).

Se puede utilizar un acceso por ndice con las funciones MAX y MIN en consultas simples (no Joins) si: No hay clusula WHERE o GROUP BY MAX o MIN son la nica expresin en la consulta. Se refieren a una sola columna, sin ms operadores.

Pgina 29 de 52

Optimizacin de consultas y SQL avanzado

Por ejemplo: (ndice IMPORTE) SELECT MAX(IMPORTE) FROM FACTURAS; SELECT MAX(IMPORTE)*2 FROM FACTURAS; Utilizan ndice, en cambio, no lo hacen: SELECT MAX(IMPORTE) FROM FACTURAS WHERE ID_CLI = 15; SELECT MAX(IMPORTE*2) FROM FACTURAS;

Condiciones ligadas mediante OR. El analizador de Oracle interpreta una clusula WHERE con n condiciones unidas con OR como n consultas independientes, cada una con una condicin, realizando una concentracin al final. Si queremos tener accesos por ndice en este caso, ser necesario que cada condicin referencie a una columna indexada. Tambin se transforma en N consultas independientes una condicin con el operador: IN ( Conjunto de valores ), y por tanto se utilizar un ndice si la columna de la condicin est indexada.

Evitar siempre que sea posible las funciones de grupo: DISTINCT, GROUP BY. Nunca utilizan ndice y realizan siempre una ordenacin (Sort) de la tabla: Las operaciones de Sort son unas de las que ms cargan el servidor, especialmente si tiene que recurrir al tablespace temporal al llenarse la SORT_AREA de la SGA, ya que entonces hay I/O extra sobre el disco. Se pueden substituir por una Join aunque ello puede complicar mucho la consulta (hasta hacerla ineficiente) o no ser posible. En todo caso, siempre hay que incluir una clusula WHERE previa que restrinja lo ms posible las filas a ordenar y que s que utilizar un ndice para ello si es posible. Por esta razn, es preferible GROUP BY frente a DISTINCT. Con GROUP BY utilizar siempre que sea posible WHERE en lugar de HAVING para introducir la condicin. As la sentencia: SELECT ZONA, SUM(FACTURACION) FROM CLIENTES WHERE ZONA = 5 GROUP BY ZONA; utilizar un ndice sobre ZONA (si existe), pero la sentencia: SELECT ZONA, SUM(FACTURACION) FROM CLIENTES GROUP BY ZONA

Pgina 30 de 52

Optimizacin de consultas y SQL avanzado

HAVING ZONA = 5; agrupar todos los registros descartando luego los que no tengan ZONA = 5, sin utilizar el ndice / No obstante, existen casos en que la presencia de la columna no garantiza el uso de su ndice, ya que stos son ignorados, como en las siguientes situaciones cuando la columna indexada es: Evaluada con el uso de los operadores IS NULL o IS NOT NULL. SELECT nombre,articulo,valor FROM clientes,ventas WHERE nombre IS NOT NULL; Modificada por alguna funcin, excepto por las funciones MAX(columna) o MIN(columna). SELECT nombre,articulo,valor FROM clientes,ventas WHERE UPPER(nombre)>' '; Usada en una comparacin con el operador LIKE a un patrn de consulta que comienza con alguno de los signos especiales (% _). SELECT nombre,articulo,valor FROM clientes,ventas WHERE nombre LIKE '%DEPORTE%'; / Finalmente debemos aclarar que los registros cuyo valor es NULL para la columna indexada, no forman parte del ndice. Por lo tanto, cuando el ndice se activa estos registros no se muestran como resultado de la consulta.

Pgina 31 de 52

Optimizacin de consultas y SQL avanzado

6.3

Sentencias con Joins.

Una Join es una consulta que combina filas de dos o ms tablas. El analizador realizar una Join siempre que encuentre ms de una tabla en la clusula FROM. Para ello decide que camino de acceso a los datos se ha de seguir (siendo vlidas las consideraciones anteriores sobre el acceso a las tablas por ndice) y el algoritmo de Join a emplear. Para el uso de Joins, aparte de lo dicho antes para ndices, hemos de considerar lo siguiente: / En general, es preferible utilizar, si es posible, UNION (mejor UNION ALL si da el resultado buscado, ya que no realiza 'sort' sobre las tablas, mientras que UNION s), en lugar de accesos con Join, al menos con tablas de volmenes parecidos. Hay que tener en cuenta la relacin entre la tabla conductora y la secundaria: 1 a n (dem m a n) 1 a 1 (dem n a 1). En el primer caso, accederemos a n filas de la tabla secundaria por cada una de la conductora, mientras que en el segundo slo se recuperar una fila de la tabla secundaria por fila de la conductora. Siempre es preferible este segundo caso, y se ha de intentar obtenerlo mediante funciones de agrupacin o eliminacin de duplicados, si es posible obtener el mismo resultado. Si realizamos una Join entre una vista y una tabla, la vista ha de actuar como conductora. No es recomendable realizar una Join entre vistas, sobre todo si podemos hacerla sobre las tablas. Algunas consideraciones sobre el uso de Hints en Joins: o o Si la tabla conductora es mucho ms pequea que la secundaria, es preferible hacer un NL Join. Si es la tabla secundaria la que es mucho ms pequea que la conductora, montaremos un Hash Join sobre la pequea. En principio, si el volumen de las tablas es parecido, tambin es preferible usar un Hash sobre la tabla secundaria. Siempre que se use un Hash Join hay que tener en cuenta las columnas seleccionadas, ya que todas ellas formarn parte de la tabla Hash. Hay que intentar que sta sea lo ms pequea posible para reducir el trabajo sobre temporal. Con dos tablas pequeas podemos utilizar un Sort-Merge Join.

/ / /

Pgina 32 de 52

Optimizacin de consultas y SQL avanzado

6.4

Sentencias con subconsultas

Una subconsulta es una sentencia SELECT (consulta interna) que proporciona el valor de una condicin en el WHERE de otra consulta (consulta principal). Internamente, el analizador transforma una subconsulta en una Join as que, en principio, suele ser ms efectivo utilizar una Join en lugar de una subconsulta, pero el uso de stas clarifica mucho la estructura de la sentencia. / Los operadores MINUS, UNION y INTERSECT no utilizan nunca ndices, realizan una ordenacin sobre los datos y optimizan las dos consultas por separado. Los operadores NOT IN y NOT EXISTS siempre realizan un Full Scan de la tabla de la subconsulta, es ms efectivo utilizar un Outer Join (Producto externo), o bien una subconsulta con MINUS, UNION o INTERSECT. En general, es mejor utilizar una Join que los operadores IN o EXISTS. En optimizacin por reglas, el analizador reescribe la sentencia en un formato ms general. Con subconsultas, las normas generales seran: o Subconsultas no correlacionadas: Aquellas en que las tablas y condiciones de cada consulta son independientes. Como, por ejemplo: SELECT CLIENTE, 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. Slo son convenientes si la consulta interna es muy restrictiva. o Subconsultas correlacionadas: Aquellas donde la consulta interna incorpora en el WHERE valores de la tabla de la consulta principal. Ejemplo (reescritura del ejemplo anterior): ELECT CLIENTE, ID_CLI FROM CLIENTES WHERE ID_CLI EXISTS (SELECT ID_CLI FROM FACTURAS WHERE FACTURAS.ID_CLI = CLIENTES.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. Slo son convenientes si la consulta principal es muy restrictiva. / A pesar de lo dicho, no hay que descartar las subconsultas; en algunos casos, MINUS, UNION o INTERSECT resultan ser la mejor optimizacin.

/ /

Pgina 33 de 52

Optimizacin de consultas y SQL avanzado

6.5

Vistas

Una vista es una tabla virtual que est definida por una consulta que consiste en una instruccin SELECT. Esta tabla virtual est creada con datos de una o ms tablas reales y, para los usuarios, una vista parece una tabla real. De hecho, una vista puede ser tratada del mismo modo que una tabla normal. En realidad, una vista se almacena simplemente como una instruccin SQL previamente definida. Cuando se accede a la vista, el DBMS une la instruccin SQL que se ejecuta en ese momento con la consulta que se use para definir la vista. Se pueden crear varios tipos de vistas, cada uno de los cuales tienen ventajas en ciertas situaciones. El tipo de vista que se ha de crear depende completamente de para qu se quiera usar la vista. Se pueden crear vistas de cualquiera de las siguientes maneras: / / / / Subconjunto de columnas de una tabla Subconjunto de filas de una tabla Unin de dos o ms tablas Informacin de agregacin

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. Siempre ofrecen los datos actualizados. La instruccin SELECT que define una vista slo se ejecuta cuando se accede a la vista, por tanto, todos los cambios de la tabla subyacente se reflejan en la vista. Puede tener un nivel diferente de seguridad del que posea la tabla subyacente. La consulta que define la vista se ejecuta con el nivel de seguridad que posea el usuario que crea la vista. De esta manera, se puede crear una vista que enmascare los datos que no se quieran mostrar a ciertas clases de usuarios.

Pgina 34 de 52

Optimizacin de consultas y SQL avanzado

7 7.1

Optimizacin ORACLE: Database Tuning Generalidades para la optimizacin de sentencias SQL

El objetivo de la optimizacin 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. Oracle nos proporciona la utilidad SQL_TRACE que combinada con la utilidad TKPROF, nos van a permitir determinar cuales de las sentencias de nuestra aplicacin son ineficientes. Los resultados de salida de las utilidades mencionadas deben ser analizados para tomar las medidas necesarias que mejoren el rendimiento. Sin embargo, independientemente de los resultados obtenidos podemos tener en cuenta los siguientes criterios generales. / En las sentencias que se utilice ms de una tabla, realizar los equijoins de las mismas con = y con el operador AND. Evitar el uso de funciones SQL en la clusula WHERE. Cualquier expresin que utilice una funcin provoca que el optimizador no utilice el ndice correspondiente. Ejemplo: supongamos un ndice definido sobre el campo1 de la tabla a WHERE a.campo1 = b.campo2 en este caso el optimizador utilizara el ndice al ejecutar la sentencia. Sin embargo en el caso de utilizar una funcin WHERE b.campo2 = SUBSTR(a.campo1,1,4) el optimizador no utilizara el ndice lo que redundara en una prdida de eficiencia. / Prestar atencin a las conversiones implcitas de datos. Si queremos usar el ndice definido sobre la columna colvchar de tipo VARCHAR2 Colvchar = <num_expr> y <num_expr> es de tipo NUMBER, la sentencia se trasforma en la siguiente TO_NUMBER(colvchar) = <num_expr> y al aplicarse la funcin de conversin el optimizador no utilizara el ndice. / / Simplificar querys complejas con el operador UNION. Evitar uso de IN y EXITS. En caso de ser necesario su uso, es preferible el IN en aquellos casos en que la sentencia principal recupere un gran nmero de filas; en caso contrario, es decir, cuando es la subconsulta la que presenta una alta cardinalidad es ms eficiente el uso de EXITS. Ejemplo: La tabla clientes tiene 27.000 filas.

Pgina 35 de 52

Optimizacin de consultas y SQL avanzado

La tabla pedidos tiene 10.000 filas.

La SELECT selecciona los pedidos realizados por el cliente 1000. SELECT c.cliente_no, c.cliente_nombre FROM clientes c WHERE EXISTS (SELECT 1 FROM pedidos p WHERE c.cliente_no = p.cliente_no AND p.cliente_no = 1000)

El plan de ejecucin de la sentencia, recupera los 27.000 registros de la tabla clientes y los filtra con la tabla pedidos, lo que hace que la ejecucin sea ineficiente. Rescribiendo la sentencia con IN: SELECT c.cliente_no, c.cliente_nombre FROM clientes c WHERE c.cliente_no IN (SELECT p.cliente_no FROM pedidos p WHERE p.cliente_no = 1000)

El plan de ejecucin de la sentencia, recupera los pedidos del cliente 1000 para realizar posteriormente el join con la tabla clientes, lo que redunda en un mejor rendimiento de la sentencia. / No usar ndices de manera generalizada. Los ndices suelen mejorar el rendimiento de las sentencias de consulta, pero ralentizan las operaciones de insercin, borrado y actualizacin. Tip: En las cargas masivas de datos deshabilitar constraints y triggers.

Pgina 36 de 52

Optimizacin de consultas y SQL avanzado

7.2 7.2.1

Tipos de Tablas Tablas Particionadas

El manejo de tabla de gran tamao puede producir problemas de rendimiento en nuestra Base de Datos, problema que puede ser resuelto dividiendo o descomponiendo dichas tablas en pequeas sub-tablas denominadas particiones. Una vez definidas las particiones, las sentencias SQL acceden y manipulan los datos de la misma manera que si la tabla no estuviese particionada. Las tablas particionadas son especialmente tiles en entornos de Datawarehouse donde la cantidad de datos que se almacenan y analizan es enorme. Cada una de las particiones en que dividimos una tabla tiene los mismos atributos lgicos que las dems, es decir, tiene las mismas columnas, los mismos tipos de datos y las mismas restricciones de integridad; sin embargo, cada particin puede tener diferentes atributos fsicos (pctfree, pctused, tablespace,). Ventajas de particionar / Se reducen los tiempos de respuesta en las operaciones de manipulacin DML puesto que la operacin se realiza sobre una particin en concreto y no sobre toda la tabla. Se reduce el tiempo de acceso a los datos si estos accesos afectan a una o varias particiones y no a toda la tabla. Las operaciones de mantenimiento se simplifican puesto que se pueden realizar sobre particiones. Se puede particionar sin modificar las aplicaciones existentes. 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.

/ / /

Partition Key Debemos establecer en base a cual de las columnas o conjuntos de columnas se va a realizar la particin, es lo que se denomina partition key. A travs de la partition key Oracle 9i determina sobre que particin va a realizar las operaciones DML. La partition key: / / / Puede estar formada de 1 a 16 columnas. ROWID no puede formar parte de la partition key. No puede contener columnas a NULL.

Una tabla particionada: / Puede ser particionada hasta un mximo de 64.000 particiones.

Pgina 37 de 52

Optimizacin de consultas y SQL avanzado

/ /

No puede contener campos LONG y LONG RAW. Si puede contener campos LOB y CLOB.

Mtodos de particionamiento Oracle proporciona los siguientes mtodos de particionamiento: / / / / Range Partitioning. List Partitioning. Hash Partitioning. Composite Partitioning.

Range Partitioning Mtodo de particionamiento, que mapea los datos en particiones, definidas sobre rangos del partition key. Se debern tener en cuenta las siguientes consideraciones: / / Cada particin tiene una clusula VALUES LESS THAN que indica los lmites de la particin. Todas las particiones excepto la primera tienen un valor inferior del rango definido de manera implcita, por la particin anterior. Para la ltima particin se puede definir un MAXVALUE que indica el valor mximo admitido en dicha particin. Ejemplo: Tabla de ventas por cuatrimestres CREATE TABLE VENTAS_CUATRIMESTRES (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4), VARCHAR2(40), VARCHAR2(6), NUMBER(6), DATE)

PARTITION BY RANGE (fecha_venta)

Pgina 38 de 52

Optimizacin de consultas y SQL avanzado

(PARTITION ventas_1cuat VALUES LESS THAN (TO_DATE (01/05/2004,DD/MM/YYYY)), PARTITION ventas_2cuat VALUES LESS THAN (TO_DATE (01/09/2004,DD/MM/YYYY)), PARTITION ventas_3cuat VALUES LESS THAN TO_DATE (01/01/20005,DD/MM/YYYY)));

List Partitioning Mtodo de particionamiento, que mapea los datos en particiones, definidas sobre una lista de valores del partition key. Las ventajas de este mtodo es que permite organizar los datos del modo adecuado a nuestras necesidades. Ejemplo: Tabla de ventas particionada agrupando los datos de diferentes regiones. CREATE TABLE ventas_regiones (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4), VARCHAR2(40), VARCHAR2(6), NUMBER(6), DATE)

PARTITION BY RANGE (region_venta) (PARTITION ventas_1region VALUES (ASTURIAS, GALICIA, CANTABRIA,MADRID), PARTITION ventas_2region VALUES (ARAGON,CATALUA, VALENCIA,BALEARES), PARTITION ventas_3region VALUES (ANDALUCIA,C. LA MANCHA, MURCIA));

Pgina 39 de 52

Optimizacin de consultas y SQL avanzado

Hash Partitioning Mtodo de particionamiento para datos que no admiten una particin por rangos o por lista. Es la mejor opcin de particionamiento en los siguientes casos: / / No sabemos a priori el volumen de datos. Los tamaos de las particiones varan sustancialmente de unas a otras lo que hace difcil equilibrarlas de manera manual.

Ejemplo: Tabla ventas particionada agrupando los datos por el identificador del comercial. CREATE TABLE ventas_regiones (comercial_id comercial_nombre region_venta importe_venta fecha_venta NUMBER(4), VARCHAR2(40), VARCHAR2(6), NUMBER(6), DATE)

PARTITION BY HASH (comercial_id) PARTITIONS 4;

Composite Partitioning Mtodo que combina los mtodos anteriores, realizando particiones por rango, y dentro de cada particin subparticiones hash o basadas en listas. Ejemplo: Tabla ventas range-list. CREATE TABLE ventas_composite_rl (comercial_id NUMBER(4), comercial_nombre region_venta importe_venta VARCHAR2(40), VARCHAR2(6), NUMBER(6),

Pgina 40 de 52

Optimizacin 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,GALICIA, CANTABRIA,MADRID), SUBPARTITION ventas_2region VALUES (ARAGON,CATALUA, VALENCIA,BALEARES), SUBPARTITION ventas_3region VALUES(ANDALUCIA,MURCIA, C. LA MANCHA)) (PARTITION ventas_1cuat VALUES LESS THAN (TO_DATE (01/05/2004,DD/MM/YYYY)), PARTITION ventas_2cuat VALUES LESS THAN (TO_DATE (01/09/2004,DD/MM/YYYY)), PARTITION ventas_3cuat VALUES LESS THAN TO_DATE (01/01/20005,DD/MM/YYYY)));

Pgina 41 de 52

Optimizacin de consultas y SQL avanzado

7.2.2

Tablas Temporales

Adems de las tablas estandar, Oracle permite la creacin de tablas temporales (temporary tables) que mantienen los datos nicamente durante la sesin o la transaccin en curso. El uso de estas tablas aumneta de manera considerable el rendimiento ya que los datos permanecen nicamente durante la sesin. Existen dos tipos de tablas temporales: / / GLOBAL TEMPORARY: el contenido de la tabla es accesible desde cualquier sesin. TEMPORARY: el contenido de la tabla slo es visible para la sesin en curso.

Ejemplo: Tabla temporal que mantiene las filas (PRESERVE ROWS) una vez que la transaccin ha finalizado. CREATE GLOBAL TEMPORARY TABLE prueba_temp. (campo1 NUMBER)

ON COMMIT PRESERVE ROWS;

Ejemplo: Tabla temporal que elimina las filas (DELETE ROWS) una vez que la transaccin ha finalizado. CREATE GLOBAL TEMPORARY TABLE prueba_temp. (campo1 NUMBER)

ON COMMIT DELETE ROWS;

Pgina 42 de 52

Optimizacin de consultas y SQL avanzado

7.3

Indices, Tipos de ndices

Los ndices son estructuras de datos asociados a tablas y clster que incrementan la velocidad de ejecucin de las sentencias SQL. Sin embargo, no siempre los ndices producen el efecto deseado, ya que una mala utilizacin puede provocar problemas de rendimiento. Existen varios tipos de ndices: / / / / Simples Compuestos Basados en funciones (Function-based) Bit map

Reglas de uso generales: / Los ndices aumentan la velocidad de ejecucin de las consultas cuando se recupera entre un 10% - 15% de los datos de la tabla. Para tablas con gran volumen de datos, los ndices ralentizan tanto las consultas como las inserciones, actualizaciones y borrados. Las primary keys y las unique key constraints generan implcitamente un ndice. En ndices compuestos ordenar las columnas por el orden en que son accedidas con mayor frecuencia. Las columnas que con frecuencia se usan para ordenar los resultados de las consultas debern tener asociado un ndice. Todas las columnas unique deben ser indexadas. Todas las columnas que formen parte de una foreign key deben ser indexadas para evitar problemas de bloqueos.

/ / /

/ /

ndices basados en funciones Se pueden crear ndices basados en clculos ms o menos complejos entre columnas de las tablas, e incluso aplicando funciones PL/SQL. La funcin usada para crear el ndice puede ser una expresin aritmtica, una expresin que contenga una funcin definida en un paquete o una funcin PL/SQL La mejora del rendimiento se obtiene cuando las consultas se realizan en base a dichos clculos.

Ejemplo. El siguiente ejemplo muestra como definir un ndice basado en una funcin PL/SQL.

Pgina 43 de 52

Optimizacin de consultas y SQL avanzado

CREATE TABLE empleados (emp_id emp_nombre NUMBER(2), VARCHAR2(40));

CREATE INDEX upper_empleados ON empleados (UPPER(emp_nombre));

SELECT emp_nombre FROM empleados WHERE UPPER(emp_nombre) = ALBERTO;

ndices bitmap Un ndice proporciona un puntero a las filas de las tablas que contienen el valor buscado. 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. 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. Por lo tanto la eficiencia de estos ndices aumenta de manera considerable cuando el nmero de condiciones que existen en la clusula WHERE es elevado.

Pgina 44 de 52

Optimizacin de consultas y SQL avanzado

7.4

Plan de Ejecucin: Interpretacin de resultados

Oracle generalmente aplica una optimizacin basada es costes, que es una estrategia que consiste en la elaboracin de mltiples planes de ejecucin de una sentencia, eligindose aquella de menor coste de ejecucin. EXPLAIN PLAN muestra el plan de ejecucin elegido por el Optimizador de Oracle para ejecutar las sentencias SELECT, INSERT, UPDATE y DELETE. El plan de ejecucin es la secuencia ordenada de operaciones que Oracle realiza para ejecutar la sentencia correspondiente. / / / / / El resultado de EXPLAIN PLAN es un rbol que muestra la siguiente informacin: Las tablas referenciadas en la sentencia SQL. Los mtodos de acceso empleados para cada una de las tablas. Los mtodos de unin (join) de las tablas. Las operaciones realizadas sobre los datos: filtros, ordenaciones, acumulaciones.

EXPLAIN PLAN utiliza la tabla PLAN_TABLE para almacenar los resultados del plan de ejecucin. Para crear dicha tabla en nuestro esquema ser necesario ejecutar el script UTLXPLAN.SQL almacenado por lo general en el path $ORACLE_HOME/rdbms/admin..

Ejecucin de EXPLAIN PLAN A cada una de las sentencias analizadas le asignamos un identificador diferente, para poder consultar el plan de ejecucin de cada una de ellas de manera individual. EXPLAIN PLAN SET STATEMENT_ID = <identificador_sentencia> FOR <sentencia SQL> Revisin de resultados de EXPLAIN PLAN Los campos de la tabla PLAN_TABLE ms significativos son los siguientes: Columna Descripcin Valor del identificador especificado en EXPLAIN PLAN Fecha y hora de ejecucin Operacin ejecutada, contiene los siguientes valores:

STATEMENT_ID TIMESTAMP OPERATION

SELECT STATEMENTINSERT STATEMENTUPDATE STATEMENTDELETE STATEMENT

Pgina 45 de 52

Optimizacin de consultas y SQL avanzado

OPTIONS

Descripcin de la operacin Nombre de la tabla analizada Nmero de bytes accedidos en la ejecucin de la sentencia (Optimizador Basado en Costes)

OBJECT_NAME BYTES

COST CARDINALITY

Coste estimado de la sentencia (Optimizador Basado en Costes) Nmero de filas accedidas en la ejecucin de la sentencia (Optimizador Basado en Costes)

Los valores ms usuales de OPERATION y OPTIONS son los siguientes: OPERATION INDEX OPTION Descripcin

RANGE SCAN Devuelve uno o ms ROWID de un ndice

MERGE JOIN Operacin que acepta dos conjuntos de filas, ordenado cada uno por un valor especfico; combina las filas de uno con las del otro y devuelve el resultado. NESTED LOOPS Operacin sobre dos conjuntos de registros. Compara cada fila de un conjunto con la del otro, devolviendo las filas que cumplen la condicin. 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.

BY INDEX ROWID

BY GLOBAL INDEX ROWID BY LOCAL INDEX ROWID

7.5

Utilidades de informacin estadstica sobre la ejecucin de sentencias

7.5.1 SQL_Trace
SQL_TRACE proporciona informacin estadstica sobre la ejecucin de sentencias SQL. Genera para cada una de las sentencias los siguientes valores: / / / / Compilaciones (parse), ejecuciones, y lecturas realizadas Tiempos de proceso de CPU Nmero de lecturas lgicas y fsicas realizadas Nmero de filas procesadas

Pgina 46 de 52

Optimizacin de consultas y SQL avanzado

Fallos producidos en la cache

Esta informacin es recogida en un fichero con extension .trc. Dicho fichero se almacena en el path indicado por el parmetro USER_DUMP_DEST. El fichero generado con la traza no es editable por lo que esta utilidad debe ser combinada con TKPROF. Podemos activar la traza con SQL_TRACE para una sesin determinada de la siguiente manera: ALTER SESSION SET SQL_TRACE = TRUE; Y se desactivara: ALTER SESSION SET SQL_TRACE = FALSE; Tambin puede ser activada desde un proceso PL/SQL del siguiente modo: BEGIN DBMS_SESSION.SET_SQL_TRACE (TRUE); <plsql_procedure_call>; DBMS_SESSION.SET_SQL_TRACE(FALSE); END; En el caso de querer trazar una sesin determinada de un usuario determinado, es preciso obtener previamente el valor de los campos SID y SERIAL# de la vista del sistema V$SESSION. Se activara la traza ejecutando la sentencia: EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid,serial#,TRUE); Y se desactivara: EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid,serial#,FALSE);

7.5.2

TKPROF

El fichero con la traza obtenido con SQL_TRACE no es editable. Para poder analizar su contenido es preciso ejecutar la utilidad TKPROF. Esta utilidad se encuentra normalmente en el path $ORACLE_HOME/BIN y su nombre vara segn las versiones de Oracle (normalmente tkprof.exe). Para poder ejecutar TKPROF es requisito previo que el parmetro TIMED_STATICS tenga valor TRUE. Sintaxis TKPROF tiene como parmetros principales de ejecucin los siguientes

Pgina 47 de 52

Optimizacin 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.

7.6

Estadsticas

Como administradores de base de datos, podemos generar estadsticas que cuantifiquen la distribucin de los datos y los modos de almacenamiento de las tablas, ndices, vistas, particiones, El optimizador basado en costes (CBOCost Based Optimizer) utiliza esta informacin para estimar cual es el plan ptimo de ejecucin de las sentencias SQL. Las estadsticas se almacenan en el diccionario de datos y pueden ser exportadas de una base de datos a otra, de manera que se pueden simular las condiciones de ejecucin de un entorno de desarrollo en uno de produccin y viceversa. Es conveniente generar estadsticas de manera peridica para un rendimiento ptimo de la base de datos. En particular deben generarse cuando: Ser necesario para optimizar tener en cuenta los siguientes puntos: / / Despus de cargar gran cantidad de datos. Despus de cambiar la estructura de los objetos que componen la base de datos.

Generacin de estadsticas El optimizador basado en costes (CBO) utiliza las estadsticas para determinar los mtodos de acceso ms efectivos. Por tanto, si el tamao y la distribucin de los datos en las tablas cambia frecuentemente, el generar las estadsticas regularmente asegura que estas representen con precisin el estado de los datos. El paquete DBMS_STATS contiene los procedimientos para la generacin de estadsticas: Procedimiento Descripcin GATHER_INDEX_STATS Estadsticas de tablas, Estadsticas para todos Estadsticas para todos

Estadsticas de ndices (bitmap) GATHER_TABLE_STATS columnas e ndices estticos GATHER_SCHEMA_STATS los objetos del esquema GATHER_DATABASE_STATS los objetos de la BD GATHER_SYSTEM_STATS I/O)

Estadsticas del sistema (CPU,

Pgina 48 de 52

Optimizacin de consultas y SQL avanzado

Diccionario de datos ORACLE

Principalmente se usa de tres maneras: / Oracle accesa el diccionario de datos para hallar la informacin acerca de los usuarios, esquemas y estructuras almacenadas. Oracle modifica el diccionario de datos cada vez que una instruccin DDL es usada. Cualquier usuario puede usar el diccionario de datos

/ /

Hay tres grupos de vistas que contienen informacin similar y que se distinguen por su prefijo: Prefijo Descripcin

USER_

Vistas con informacin del esquema del usuario en sesin

ALL_

Estas vistas presentan al usuario una perspectiva global de la base de datos. Le da al usuario informacin sobre todos los objetos en la base de datos a los que tiene acceso.

DBA_

Vistas con la informacin de lo existe en todos los esquemas

Algunas de las principales vistas del diccionario de datos Oracle: Significado Dba user all

Informacin sobre todos los objetos: tablas, vistas, funciones, procs, ndices, triggers, etc.

dba_objects

user_objects

all_objects

Cdigo 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

Pgina 49 de 52

Optimizacin 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 lmites de recursos asociados

Dba_profiles

Lmites 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, sinnimos 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

Sinnimos

Dba_synonyms

user_synonyms

all_synonyms

Restricciones de clave primaria, externa, not null, 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

Pgina 50 de 52

Optimizacin de consultas y SQL avanzado

Estas son slo algunas de las tablas y vistas. Se puede obtener un listado de todas con select OBJECT_NAME from ALL_OBJECTS; pero la lista es muy larga, y probablemente sea necesario filtrarla, por ejemplo: select OBJECT_NAME, OBJECT_TYPE from ALL_OBJECTS where OBJECT_NAME like '%ROLE%'; Para seleccionar slo un cierto nmero de registros: SELECT * FROM EMP WHERE ROWNUM <= 10;

Pgina 51 de 52

Optimizacin de consultas y SQL avanzado

Diccionario de datos SQL Server

Algunas de las principales vistas del diccionario SQL Server: Contenido INFORMATION_ESCHEMA.

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 Forneas

REFERENTIAL_CONSTRAINTS

Pgina 52 de 52

Optimizacin 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. Table owner. Table name. Type of table. VIEW or BASE TABLE.

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. Constraint owner. Constraint name. Table qualifier. Table owner. Table name. Type of constraint. CHECK, UNIQUE, PRIMARY KEY, or FOREIGN KEY. Specifies whether constraint checking is deferrable. Always returns NO.

IS_DEFERRABLE

varchar(2)

Pgina 53 de 52

Vous aimerez peut-être aussi