Beruflich Dokumente
Kultur Dokumente
Resumen
Manual de Uso de SQL.
Registro de modificaciones
Versin 1.0 1.1 1.2 Descripcin [o descripcin de cambios] Versin Inicial Revisin versin inicial: se incluyen premisas para el desarrollo batch Actulizaciones 10G y manejo de tablas Autor everis everis D. Arias Fecha creacin 12/06/2006 29/08/2006 29/08/2011 Aprobado por Fecha aprobacin 12/06/2006 29/08/2006 29/08/2011
Contenido
1. Convenciones de Nomenclatura. ........................................................................................... 4 1.1 Nomenclatura ...................................................................................................................... 4 1.2 Indentacin .......................................................................................................................... 4 1.3 Programacin ...................................................................................................................... 4 2. ndices ....................................................................................................................................... 5 2.1 ndices compuestos ............................................................................................................. 5 2.2 ndices bitmap...................................................................................................................... 5 2.3 Forzar la no utilizacin de un ndice. ................................................................................... 6 2.4 Recomendaciones al momento de utilizar ndices. ............................................................. 6 2.5 Reducir el trfico en la base de datos ................................................................................. 7 2.6 Hints ..................................................................................................................................... 7 2.6.1 Hints para escoger el tipo de optimizacin ................................................................ 8 2.6.2 Hints para mtodo de acceso .................................................................................... 9 2.6.3 Hints para ordenacin de joins ................................................................................10 2.6.4 Hints para operaciones de joins ..............................................................................11 3. Recomendaciones prcticas ................................................................................................12 3.1 Sentencias con valores nulos ............................................................................................12 3.2 Sentencias con la clusula DECODE .............................................................................13 3.3 Sentencias con la clusula WHERE. Uso de los ndices ...............................................14 3.4 Contar filas de tablas .........................................................................................................15 3.5 Usar clusula WHERE en lugar de la clusula HAVING .............................................15 3.6 Minimizar el nmero de tablas en subconsultas ...............................................................16 3.7 No abusar de las JOIN de tablas.......................................................................................16 3.8 Usar JOINS de tablas en lugar de la clusula EXISTS ................................................16 3.9 Usar la clusula EXISTS en lugar de JOINS de tablas ................................................17 3.10 Usar la clusula EXISTS en lugar de DISTINCT ................................................17 3.11 Usar la clusula NOT EXISTS en lugar de la clusula NOT IN .........................18 3.12 Usar la clusula UNION ALL en lugar de la clusula UNION ............................18 3.13 Usar la clusula IN O UNION en lugar de la clusula OR ...............................19 3.14 Usar EXISTS en lugar de COUNT(*) .......................................................................19 3.15 Lgica condicional ...................................................................................................20 3.15.1 Usar ELSIF con clusulas mutuamente exclusivas ...................................20 3.15.2 Usar IFELSIF para evaluar condiciones simples ....................................20
2005 - everis
Page 1 of 41
3.15.3 Reemplazar sentencias IF con expresiones booleanas .............................21 3.15.4 Optimizacin de sentencias condicionales .................................................21 3.16 Control de flujo .........................................................................................................22 3.16.1 No usar sentencias GOTO .........................................................................22 3.17 No usar sentencias EXECUTE ................................................................................22 3.17.1 Uso de bloques annimos ..........................................................................22 3.18 Bucles ......................................................................................................................22 3.18.1 Uso de EXIT y RETURN en bucles WHILE y FOR ....................................22 3.18.2 Uso de EXIT en bucles LOOP ....................................................................22 3.18.3 Usar bucles LOOP para evitar el cdigo redundante requerido por los bucles WHILE ..............................................................................................23 3.18.4 No declarar el ndice para el bucle FOR ....................................................23 3.18.5 Recorrer colecciones usando FIRST, LAST y NEXT en bucles .................24 3.18.6 Mover expresiones estticas fuera de los bucles y sentencias SQL 24 3.19 Uso de datos ............................................................................................................25 3.19.1 Uso de %TYPE y %ROWTIPE para la definicin de variables ..................25 3.19.2 Evitar columnas LONG o LONG RAW .......................................................25 3.19.3 Uso de constantes y parmetros ................................................................25 3.20 Acceso a la Base de Datos ......................................................................................26 3.20.1 Construccin de consultas..........................................................................26 3.20.2 Construccin de cursores ...........................................................................27 3.21 Tamao de los Objetos PL-SQL ..............................................................................28 3.21.1 Objetos sin referenciar ................................................................................28 3.22 Procesos batch ........................................................................................................29 3.22.1 INSERT-SELECT .......................................................................................29 3.22.2 Eliminacin de ndices y recreacin de ndices ..........................................29 3.23 Otros ........................................................................................................................29 3.23.1 Usar bloques annimos dentro de sentencias IF para conservar recursos ..................................................................................................29 3.23.2 Excepciones ...............................................................................................30 3.24 Otras reglas a tener en cuenta ................................................................................30 3.25 Buenas Prcticas para versiones 10G. ...................................................................31 3.25.1 Optimizador basado en costo (CBO) ..........................................................31 3.25.2 Tablas. ........................................................................................................32 3.25.3 Tablespace (espacio de tablas) .................................................................33 3.25.4 Concepto de Datafile (fichero de datos) .....................................................35 3.25.5 Concepto de Segment (segmento, trozo, seccin) ....................................36 3.25.6 Concepto de Extent (extensin) .................................................................37 3.25.7 Concepto de Data block (bloque de datos) ................................................39 4. Referencias bibliogrficas ....................................................................................................41
2005 - everis
Page 2 of 41
COM
Objetivo
El presente documento tiene como objeto el establecer una serie de guas o normas estndar de referencia que sirvan para unificar los criterios en el desarrollo de nuevos programas escritos en lenguaje SQL, permitiendo realizar un diseo ptimo de nuestros procesos en cuanto al acceso a la base de datos se refiere, mejorando de este modo el rendimiento de las aplicaciones. Adems se abordarn conceptos tales como: Descripcin de los pasos involucrados en el proceso de una sentencia SQL. Necesidad de construccin de ndices. Obtencin del mximo rendimiento de las sentencia.(Estndares de programacin, sintaxis alternativas, uso de hint,..)
COM
1. Convenciones de Nomenclatura.
1.1 Nomenclatura
Prefijos de ficheros: pls (mdulo), trg (trigger), ddl (DDLs), sp (Stored Proc), Prefijos de mbito: g (global), v (local) Prefijos de variables: k (constante), c (cursor), r (record), Sufijos de variables: (input), o (output), io (input / output)
1.2 Indentacin
Tabulador para cdigo Espacios en blanco para sentencias SQL
1.3 Programacin
Una sentencia por lnea. No utilizar parntesis redundantes No reutilices variables Utiliza %type siempre que sea posible
COM
2. ndices
Los ndices pueden mejorar el rendimiento de las consultas o modificaciones que seleccionan un pequeo porcentaje de las filas de una tabla. En general, se deben crear ndices para las tablas sobre las cuales los accesos (consultas o modificaciones) son ms frecuentes, retornando un nmero de filas inferior al 25% del total. En estos casos, la utilizacin de un ndice puede ser efectiva. Para seleccionar las columnas a indexar seguir las siguientes pautas: Columnas que son frecuentemente utilizadas en clusulas WHERE. Columnas que son frecuentemente utilizadas en joins de tablas en sentencias SQL. nicamente indexar columnas con buena selectividad. La selectividad de un ndice es el porcentaje de filas de una tabla que tienen el mismo valor para la columna indexada. La selectividad de un ndice es buena si pocas filas tienen el mismo valor. Tener presente que Oracle implcitamente crea ndices sobre las columnas de todas las claves primarias y nicas que se hayan definido con reglas de integridad. Estos ndices son los ms selectivos y los ms eficientes. No indexar las columnas con pocos valores diferentes. Estas columnas normalmente tienen una selectividad baja y no se optimiza su rendimiento, menos en el caso que se seleccionen frecuentemente las filas con valores menos frecuentes que otros valores de la columna. En estos casos se recomienda crear ndices bitmap, al menos que sea una aplicacin OLTP con mucha concurrencia. No indexar columnas que frecuentemente son modificadas. Las sentencias UPDATE que modifican columnas indexadas y sentencias INSERT y DELETE que modifican las tablas indexadas tardan ms en ejecutarse que si no estuvieran indexadas. Cada sentencia SQL debe de modificar los datos en los ndices igual que los datos en las tablas. No indexar columnas que slo aparezcan en las clusulas WHERE con operadores o funciones. Una clusula WHERE que utiliza una funcin (como MIN o MAX) o un operador sobre una columna indexada no tiene disponible el acceso por ndice. En estos casos, existe la posibilidad de crear ndices basados en funciones. Indexar claves forneas de integridad referencial cuando un nmero elevado de sentencias concurrentes INSERT, UPDATE y DELETE acceden a tablas padre e hijo. As, un ndice permite a Oracle modificar un dato en el hijo sin bloquear la tabla padre.
COM
Los ndices bitmap pueden mejorar el rendimiento de las consultas que tienen las siguientes caractersticas: La clusula WHERE contiene mltiple predicados con baja o media cardinalidad en sus columnas. Estos predicados individualmente seleccionan un gran nmero de filas. Los ndices bitmap han sido creados en todas o algunas columnas de baja/media cardinalidad. Las tablas consultadas contienen muchas filas. Se pueden utilizar ndices bitmap para evaluar las condiciones de una sola tabla. Adems, son favorables para consultas complejas ad-hoc que contienen largas clusulas WHERE. Los ndices bitmap no son adecuados para aplicaciones OLTP con gran nmero de transacciones concurrentes que modifican datos. Estos ndices principalmente se utilizan en aplicaciones de datawarehouse donde los usuarios normalmente realizan consultas en vez de modificar datos.
COM
Cuando en una consulta se especifica un rango no limitado el optimizador utiliza el valor mayor y el menor de la columna y estima el nmero de filas que devuelve la consulta. Cuando la consulta especifica un rango limitado de valores el optimizador asume que la consulta devuelve el 25% de las filas. Cuando hay dos variables de recuperacin en una condicin de rango limitado, el optimizador asume que la consulta devuelve el 50% de las filas.
2.6 Hints
El diseador de una aplicacin tiene informacin sobre los datos que el optimizador Oracle desconoce. Por ejemplo, el diseador sabe que un cierto ndice es muy selectivo para ciertas consultas. Puede utilizar hints para forzar al optimizador a utilizar este ndice. Los hints slo son aplicables en el caso que se haya activado el optimizador basado en costes. Los hints son indicadores que se dan al optimizador. Permiten anteponer las decisiones del diseador a las del optimizador. Se pueden utilizar hints para especificar: El tipo de optimizacin a utilizar para una sentencia. El mtodo de acceso a una tabla accedida por la sentencia. El orden de join para una sentencia con join. Operacin de join en una sentencia con join. Los hints se aplican nicamente para la optimizacin del bloque de la sentencia donde aparece. Un bloque de una sentencia es una de las siguientes sentencias o partes de sentencias: Una simple sentencia SELECT, UPDATE o DELETE. Una sentencia padre o subquery de una sentencia compleja. Una parte de una consulta compuesta. Sintaxis Un bloque de una sentencia slo puede tener un comentario que contiene hints. El comentario slo se puede poner detrs de las palabras SELECT, UPDATE y DELETE: SELECT UPDATE DELETE Donde /*+ hint */
Hint
signo + que indica a Oracle que interprete el comentario como una lista de hints. Los signos + y /* se tienen que escribir juntos (sin ningn espacio en blanco). hint. Si hay ms de un hint, se deben de separar con un blanco.
COM RULE
Indica explcitamente que se debe escoger el optimizador basado en reglas para ese bloque de la sentencia. Este hint hace que el optimizador siempre ignore otros hints especificados en el mismo bloque de la sentencia.
INDEX_ASC Indica explcitamente que se debe escoger un acceso por ndice para la tabla especificada. Oracle accede a los valores del ndice en orden ascendente.
INDEX_ASC (tabla ndice )
INDEX_COMBINE Explcitamente escoge un acceso va bitmap para una tabla. Si no se especifica ningn ndice, el optimizador escoge cualquier combinacin booleana de ndices bitmap que tenga el mejor coste estimado para la tabla. Si se especifican varios ndices, el optimizador escoge utilizar alguna combinacin booleana de estos ndices bitmap.
COM
INDEX_JOIN Indica al optimizador que utilice un ndice join como va de acceso. Para que tenga efecto este hint, debe existir un nmero pequeo de ndices que contengan todas las columnas requeridas para resolver la seleccin. INDEX_DESC Indica explcitamente que se debe escoger un acceso por ndice para la tabla especificada. Oracle accede a los valores del ndice en orden descendente. Este hint no tiene efecto cuando en la sentencia hay ms de una tabla. En este caso siempre accede de forma ascendente. INDEX_FFS Este hint causa un fast full index scan en vez de un full table scan. NO_INDEX Explcitamente se rechaza un conjunto de ndices para la tabla especificada. Si el hint especifica un ndice disponible, el optimizador no lo considera. Otros ndices no especificados son considerados. Si el hint no especifica ningn ndice, el optimizador no considera un scan sobre cualquier ndice de la tabla. Este escenario es equivalente al hint NO_INDEX con la especificacin de todos los ndices de la tabla. Si un hint NO_INDEX y un hint de ndice (INDEX, INDEX_ASC, INDEX_DESC, INDEX_COMBINE, o INDEX_FFS) especifican los mismos ndices, entonces son ignorados y el optimizador considera los ndices especficos.
AND_EQUAL Indica que se debe escoger un plan de ejecucin que combine accesos sobre varios ndices de una sola columna (cada uno). USE_CONCAT Este hint fuerza a combinar condiciones OR en la clusula WHERE de una consulta para ser transformada en una consulta compuesta usando el operador UNION ALL. Normalmente, esta transformacin ocurre slo si el coste de la consulta, utilizando las concatenaciones, es ms barato que sin ellas. NO_EXPAND Evita que el optimizador basado en costes considere una OR-expansin para consultas que tienen condiciones de OR o listas IN en la clusula WHERE. Normalmente, el optimizador considera utilizar OR-expansin si el coste es menor que no utilizndola.
COM
Estndar de Codificacin Oracle Este hint fuerza el uso de un plan estrella. Un plan estrella tiene la tabla ms grande en la ltima consulta del join order y realiza el join con un nested loops join sobre un ndice concatenado. Este hint se aplica cuando hay al menos 3 tablas, el ndice concatenado de la tabla ms grande tiene al menos tres columnas, y no hay conflictos de acceso o hints de mtodos de join. El optimizador tambin considera diferentes permutaciones de las tablas pequeas. Usualmente, si se analizan las tablas, el optimizador selecciona un eficiente plan estrella.
COM
3. Recomendaciones prcticas
En este apartado se realiza unas recomendaciones sobre la creacin de sentencias SQL y su rendimiento en el gestor de base de datos. A continuacin, se van a realizar unas recomendaciones para obtener el mximo rendimiento a la consulta creada y al sistema gestor de la base de datos. Como norma principal, cualquier acceso a la base de datos tiene que estar realizado de forma ptima.
COM
En parmetros DISTINCT (donde haya un nmero de filas que tengan una columna con un valor NULL): SELECT count (DISTINCT ciudad) FROM ciudades; En funciones UNION/MINUS/INTERSECT (donde haya un nmero de filas que tengan una columna con un valor NULL): SELECT nombre, ciudad FROM ciudades UNION SELECT nombre, null FROM localidad
SELECT count(*), SUM (salario) FROM empleados WHERE n_dpto = 0030 AND nombre LIKE SMITH%; Esto, podemos hacerlo ms eficiente con la instruccin DECODE. SELECT COUNT (DECODE(n_dpto, 0020, X, NULL)) count20, COUNT (DECODE(n_dpto, 0030, X, NULL)) count30, SUM (DECODE(n_dpto, 0020, salario, NULL)) sal20, SUM (DECODE(n_dpto, 0030, salario, NULL)) sal30 FROM empleados WHERE nombre LIKE SMITH%; Usar DECODE en sentencias ORDER BY y GROUP BY. Se puede necesitar especificar muchas filtros en sentencias ORDER BY para recuperar filas. Como la consulta es idntica y lo nico que cambia es el ORDER BY, se puede realizar con la instruccin DECODE.
Archivo: 178900375.doc.ms_office 2005 - everis Pgina 13 de 41
ORDER BY DECODE (:BLK.SEQN_FLD, E, n_emp, D, n_dept); Lo mismo se puede hacer con la instruccin GROUP BY. SELECT FROM empleados WHERE nombre LIKE SMITH% GROUP BY DECODE (:INPUT, E, n_emp, D, n_dept); Debemos tener en cuenta algunas desventajas. Si se usa DECODE dentro de instrucciones ORDER BY y GROUP BY no se pueden utilizar ndices. Por ello, el procesamiento de filas puede ser lento. Por eso es recomendado solo cuando el nmero de filas retornado sea pequeo.
MAS EFICIENTE
SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cuenta LIKE CAPITAL%;
SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cantidad > 0; SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE fecha_trans BETWEEN TRUNC (SYSDATE) AND TRUNC(SYSDATE) + .99999; SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cuenta = AMEX AND tipo_cuenta = A; SELECT cuenta, fecha_trans, cantidad
SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE TRUNC(fecha_trans) = TRUNC (SYSDATE);
SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cuenta || tipo_cuenta = AMEXA;
Pgina 14 de 41
COM
(clculos)
FROM transaccion WHERE cantidad < 2000; SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cuenta LIKE NVL (:nombre_cuenta, %); SELECT nombre FROM pruebas.empleados WHERE salario=to_number(1000); select nombre from empleados where nif like 123%;
Los ndices no son usados tampoco cuando una columna o varias aparecen en ambos lados del operador
SELECT cuenta, fecha_trans, cantidad FROM transaccion WHERE cuenta = NVL (:nombre_cuenta, cuenta); SELECT nombre FROM pruebas.empleados WHERE to_char(salario)=1000;
El comando like sobre un campo con un ndice. Si se utilizan operadores %, a mayor tamao de la parte no variable inicial mejor rendimiento Uso del comando like con fechas y nmeros
select salario from empleados where contratado like '23/12/02'; select nombre from empleados where salario like 100
select salario from empleados where contratado='23/12/02'; select nombre from empleados where salario=100;
HAVING ciudad != MADRID AND ciudad != GUADALAJARA; MS EFICIENTE SELECT ciudad, AVG (poblacion) FROM localizacion WHERE ciudad != MADRID AND ciudad != GUADALAJARA GROUP BY ciudad;
COM SELECT nombre_empleado FROM depto D, empresa E WHERE E.dept_no = D.dept_no AND D.dept_cat = A;
COM
COM SELECT num, balance FROM credito_transaccion WHERE fecha = 31-DEC95; MS EFICIENTE SELECT num, balance FROM debito_transaccion WHERE fecha = 31-DEC-95 UNION ALL SELECT num, balance FROM credito_transaccion WHERE fecha = 31-DEC95;
En este caso estaremos haciendo un FULL SCAN de la tabla empleados. Puede ser ms interesante ejecutar lo siguiente: SELECT 1 FROM dual WHERE Exists (SELECT 1
Archivo: 178900375.doc.ms_office 2005 - everis Pgina 19 de 41
El FULL SCAN sobre empleados se detendr en cuanto encuentre la primera fila. (evitar FULL SCANS).
Debemos, sin embargo, encontrar un punto de equilibrio entre la legibilidad del cdigo y la complejidad de las clusulas condicionales ya que demasiadas sentencias condicionales anidadas pueden disminuir la legibilidad del cdigo. Se recomienda un mximo nivel de anidamiento de 4.
COM
En sentencias condicionales compuestas (IF..ELSIF) colocaremos al final ramas con las expresiones ms costosas.
3.18 Bucles
3.18.1 Uso de EXIT y RETURN en bucles WHILE y FOR
Cuando utilizamos las sentencias EXIT y RETURN dentro de un bucle causamos una brusca finalizacin del mismo que hace muy difcil su traza. Por ejemplo, contador := titulos.COUNT; FOR indice IN 1..contador LOOP IF mi_titulo = titulos(indice) THEN RETURN indice; ENDIF; ENDLOOP; RAISE Exit_Function; EXCEPTION WHEN Exit_Function THEN RETURN NULL; Este es un cdigo de mala calidad. Se eleva una excepcin o se encuentra el ttulo y se devuelve el valor en mitad de la seccin ejecutable. Imaginemos que el cuerpo de la funcin contiene 200 lneas de cdigo con diferentes bucles anidados y varias sentencias RETURN repartidas por el mismo. Un caos. Debemos evitar, por tanto, el uso de las sentencias EXIT y RETURN dentro de bucles.
COM LOOP read_line (file1, line1, file1_eof); read_line (file2, line2, file2_eof);
IF (file1_eof AND file2_eof) THEN retval := TRUE; EXIT; ELSIF (line1 != line2) THEN retval := FALSE; EXIT; ELSIF (file1_eof OR file2_eof) THEN retval := FALSE; EXIT; END IF; END LOOP; Podemos reescribir este cdigo condensando la lgica de los EXIT como sigue: LOOP read_line (file1, line1, file1_eof); read_line (file2, line2, file2_eof); IF (file1_eof AND file2_eof) THEN retval := TRUE; exit_loop := TRUE; ELSIF (line1 != line2) THEN retval := FALSE; exit_loop := TRUE; ELSIF (file1_eof OR file2_eof) THEN retval := FALSE; exit_loop := TRUE; END IF; EXIT WHEN exit_loop; END LOOP;
3.18.3 Usar bucles LOOP para evitar el cdigo redundante requerido por los bucles WHILE
Generalmente, usamos bucles LOOP si queremos que el cuerpo del bucle se ejecute, al menos, una vez. Usaremos bucles WHILE si queremos comprobar la condicin antes de que se ejecute el cuerpo. Ya que el bucle WHILE realiza la validacin antes las variables de la expresin condicional deben estar inicializadas. El cdigo para inicializarlas es usualmente el mismo cdigo necesario para realizar la siguiente iteracin. Esta redundancia de cdigo crea un problema al depurar y mantener el cdigo. Los ejemplos ms tpicos son el del incremento de un ndice para recorrer un array o el del clculo de una condicin que acta como guarda para las siguientes iteraciones. Si nos encontramos con esta situacin debemos cambiar el bucle WHILE por un bucle LOOP.
COM
El ndice puede ser un entero o un registro. En ambos casos es declarado implcitamente por el runtime de PL/SQL y la visibilidad de la variable ndice est restringida al cuerpo del bucle. Nunca debemos declarar una variable para el ndice del bucle. Si la declaramos estaremos declarando una variable (registro o numrica) completamente separada que, en el mejor de los casos, nunca ser usada o, en el peor de los casos, puede ser usada fuera del bucle de forma que pueda introducir cambios en el comportamiento del mismo.
COM
Este es el mismo cdigo sin los problemas detectados: CREATE OR REPLACE PROCEDURE sumaries_reviews ( summary_title_in IN VARCHAR2, isbn_in IN book.isbn%TYPE) IS l_summary book_types.summary_t := UPPER(summary_title_in); l_today CONSTANT DATE := TRUNC(SYSDATE); CURSOR review_cur IS SELECT UPPER( SUBSTR( text,1, 100) ) text FROM book_review WHERE isbn = isbn_in; BEGIN FOR review_rec IN review_cur LOOP review_pkg.summarize( l_summary, l_today, review_rec.text ); END LOOP; END;
COM
COM
COM
Estndar de Codificacin Oracle As, este tipo de bucles aumenta la legibilidad del cdigo ya que necesita mucho menos cdigo de control del propio cursor.
CURSOR-OPEN-FETCH-CLOSE: Este tipo de declaracin de cursores debe usarse en los casos en los que queramos poder interrumpir la lectura de registros en cualquier momento. Este tipo de declaracin de cursores debe ser utilizado siempre seguido de un bucle LOOP. BULK COLLECT INTO Esta opcin permite cargar de forma masiva mltiples registros en una coleccin (aumenta el rendimiento de la operacin)
DECLARE TYPE title_aat IS TABLE OF magazine.title%TYPE INDEX BY BINARY_INTEGER; l_titles title_aat; BEGIN SELECT title BULK COLLECT INTO l_titles FROM magazine; END;
COM
Para ello, es necesario eliminar estos objetos de modelo de datos y del cdigo, ya sean tabla, funciones o procedimientos de la base de datos.
MENOS EFICIENTE FOR rec IN emp_cur LOOP INSERT INTO my_employee (employee_id,name,salary) VALUES (rec.employee_id,rec.name,rec.salary); END LOOP;
MAS EFICIENTE INSERT /*+ APPEND */ INTO employee_tmp (employee_id,name,salary) SELECT employee_id,name,salary FROM employee;
Esta instruccin realiza un volcado masivo en una tabla del resultado de una consulta. Adems incorporando el hint APPEND (direct-paht insert) logramos eficienciar todava ms la accin del insert. Este hint provoca que la insercin en la tabla, en lugar de buscar huecos vacos y reaprovechar espacio, utilice espacio totalmente nuevo (ahorra el tiempo de buscar huecos vacos)
3.23 Otros
3.23.1 Usar bloques annimos dentro de sentencias IF para conservar recursos
Una de las caractersticas de PL/SQL es que el desarrollador puede agrupar cualquier conjunto de sentencias dentro de un bloque con su propias secciones de declaracin, ejecutable y excepciones. Si detectamos que un conjunto de operaciones y estructuras de datos no son necesarias a menos que se cumpla una condicin, moveremos todas esas sentencias y estructuras
Archivo: 178900375.doc.ms_office 2005 - everis Pgina 29 de 41
COM
de datos dentro de un bloque annimo dentro, a su vez, de una sentencia condicional. El resultado es que no se cargar la CPU y memoria a menos que sea necesario.
3.23.2 Excepciones
La clusula When-others debe estar presente en todo control de excepciones, as se controla todo tipo de excepciones que se puedan originar a la hora de ejecutar el cdigo.
COM
Conocer el modelo de datos es esencial como, por ejemplo, la relacin entre las entidades de negocios. Este entendimiento va ayudar la escrita de consultas ms eficientes para extraer los datos de mltiplas tablas. En este artigo abordar solamente el optimizador basado en costo (CBO), que fue introducido en la versin 7 del Oracle. El CBO intenta encontrar un plan de ejecucin que posee el menor costo para conectar los datos. Varios costos son calculados y el que presentar el menor costo de ejecucin es escogido. Deben ser colectadas estadsticas peridicamente para determinar un plan de ejecucin ptimo. Pero el CBO es limitado, l no conoce las caractersticas de la aplicacin y tambin no puede entender se la consulta est escrita de la mejor forma. Lo que l hace es intentar encontrar la mejor solucin para su consulta. Y como el CBO asume algunos valores relativos al costo, el plan que fue escogido por l puede no ser necesariamente el mejor plan de ejecucin. Para eso debemos estar siempre listos para optimizar esas consultas, ya que son responsables por 60% de los problemas de desempeo. . Las instrucciones SQL son analizadas por el optimizador Oracle, generando su respectivo plan de acceso. Esas informaciones referentes al anlisis y el propio plan de ejecucin, se quedan disponibles en memoria (SGA) y caso sea ejecutada una nueva instruccin IDNTICA, es realizado el compartimiento del plan de ejecucin ya hecho por el optimizador. Utilice ROWID siempre que posible. Cada lnea almacenada en el Oracle contiene su respectivo ROWID y nunca ser sustituida hasta que sea eliminada. Este ROWID es la direccin fsica del registro. Seleccione en declaraciones selects el ROWID siempre que posible para garantizar el mejor desempeo para sus comandos de update y delete.
Utilice WHERE en lugar de HAVING Evite incluir de forma inadecuada la clusula HAVING dentro de una instruccin SELECT. Having restringe las lneas despus de ellas hubieren sido procesadas. Esto incluye la realizacin de sort, sumarizacin etc
Evite el operador DISTINCT Evite incluir innecesariamente la clusula DISTINCT dentro de una declaracin SELECT. Distinct genera el mtodo de conexin SORT.
Evite select * ...... La columna dinmica * (asterisco) realiza la pesquisa de todas las columnas de las tablas envueltas.
COM
El optimizador ser obligado a convertir el asterisco para cada columna en la instruccin SELECT, consumiendo recurso. En la mayora de las veces NO necesitamos tener todas las columnas, evitando trfico de red innecesario. Evitar count(*), utilizar count(campo).
Evite utilizar la comparacin is null, porque no utilizar ndice. 7. Dejar las variables usadas para comparacin con campos, exactamente con el mismo tipo de dado. Evitar conversiones implcitas. Evite utilizar outer join. Evite utilizar union, privilegiar union all. Evite negaciones. De privilegio para = y no , utilizar in y no not in. Comprendiendo lo que es selectividad: La selectividad es la primera y ms importante medida del Optimizador Basado en Costo. Ella representa una fraccin de lneas de un conjunto resultante de una tabla o el resultado de un "join" o un "group by". El CBO utiliza estadsticas para determinar la selectividad de un determinado predicado (clusula where o having). La selectividad es directamente ligada al pre dicado de la consulta como ID = 1111, o una combinacin de predicados, como ID = 11111 AND STATUS=Y. El propsito del predicado de una consulta es limitar la propuesta a un nmero de lneas en que estamos interesados. Luego, la selectividad de un predicado indica cuantas lneas de un conjunto sern filtradas por una determinada condicin. La selectividad es igual al nmero de valores distintos que una columna posee.
ndices: Evite funciones en los campos (columnas del banco) indexadas, como substr, concatenacin, conversin implcita, trunc, lower, upper etc. Las funciones tienen por finalidad realizar una conversin sobre determinado contenido. Caso sea utilizada una funcin ORACLE en la clusula WHERE, y su argumento es una columna que contenga el ndice, el optimizador ir descartar el uso del ndice. Procure aplicar la conversin en el lado de la variable y no en el campo del banco. Desarrollado para garantizar mejora de desempeo en la recuperacin de los datos (procesamiento para lecturas). Las posiciones de las columnas en ndices compuestos tienen un importante papel en su utilizacin. Generalmente los ndices ms selectivos son aquellos donde sus columnas contienen una gran cantidad de valores nicos. La utilizacin de un ndice por el optimizador esta directamente asociada a la selectividad de las columnas envueltas en la restriccin de la consulta SQL.
3.25.2 Tablas.
Al momento de disear una tabla tenemos que tener en cuenta los siguientes puntos. Factor de crecimiento: Debemos tener en claro cul ser la carga de la tabla en el tiempo con una visin pesimista. Distribucin de los datos en los discos:
Archivo: 178900375.doc.ms_office 2005 - everis Pgina 32 de 41
COM
Estndar de Codificacin Oracle Para enteder esto debemos conocer como se almacenan las tablas.
Cuando un objeto se crea dentro de un cierto tablespace, este objeto adquiere todas las propiedades antes descritas del tablespace utilizado.
En este esquema podemos ver que, por ejemplo, la tabla ARTICULO se almacena dentro del tablespace A, y que por lo tanto tendr todas las propiedades del tablespace A que pueden ser:
Archivo: 178900375.doc.ms_office 2005 - everis Pgina 33 de 41
COM
Sus ficheros de datos estn en $ORACLE_HOME/datos/datos_tablespace_A Los objetos no pueden ocupar ms de 10Mb de espacio de base de datos.
-En cualquier momento se puede poner fuera de lnea todos los objetos de un cierto tablespace. -Se pueden hacer copiar de seguridad slo de ciertos tablespaces. Si nos fijamos, se puede apreciar que es posible tener una tabla en un tablespace, y los ndices de esa tabla en otro. Esto es debido a que los ndices no son ms que objetos independientes dentro de la base de datos, como lo son las tablas. Y al ser objetos independientes, pueden ir en tablespaces independientes. En l Tablespace SYSTEM se almacenan todos los datos de sistema, el catlogo y todo el cdigo fuente y compilado de procedimientos PL/SQL. Tambin es posible utilizar el mismo tablespace para guardar datos de usuario. En el esquema tambin vemos que hay un tablespace Temporal (en gris oscuro). Este representa las propiedades que tendrn los objetos que la base de datos cree temporalmente para sus clculos internos (normalmente para ordenaciones y agrupaciones). Su creacin difiere en una de sus clusulas de creacin. El tablespace RO (en gris claro) difiere de los dems en que es de solo lectura (Read Only), y que por lo tanto todos los objetos en l contenidos pueden recibir rdenes de consulta de datos, pero no de modificacin de datos. Estos puede residir en soportes de slo lectura, como pueden ser CDROMs, DVDs, etc. Cuando se crea un tablespace, ste se crea de lectura/escritura. Despus se puede modificar para que sea de solo lectura. Un tablespace puede estar en lnea o fuera de ella (Online o OffLine), esto es que todos los objetos contenidos en l estn a disposicin de los usuarios o estn inhabilitados para restringir su uso. Cualquier objeto almacenado dentro de un tablespace no podr ser accedido si este est fuera de lnea.
Se pueden ver los espacios de tablas definidos en nuestra BD con el comando SQL siguiente:
SQL> select * from user_tablespaces; Como Crear un tablespace Para Crear un tablespace
CREATE TABLESPACE nombreTableSpace DATAFILE 'nombreDataFile.dbf' size 100M;
COM
$ORACLE_HOME/Database. Un datafile tiene un tamao predefinido en su creacin (por ejemplo 100Mb) y este puede ser alterado en cualquier momento. Cuando creemos un datafile, este ocupar tanto espacio en disco como hayamos indicado en su creacin, aunque internamente est vaco. Oracle hace esto para reservar espacio continuo en disco y evitar as la fragmentacin. Conforme se vayan creando objetos en ese tablespace, se ir ocupando el espacio que cre inicialmente. Un datafile est asociado a un solo tablespace y, a su vez, un tablespace est asociado a uno o varios datafiles. Es decir, la relacin lgica entre tablespaces y datafiles es de 1-N, maestro-detalle.
En el esquema podemos ver como el Tablespace A est compuesto (fsicamente) por tres datafiles (DATOS_1.ORA, DATOS_2.ORA y DATOS_3.ORA). Estos tres datafiles son los ficheros fsicos que soportan los objetos contenidos dentro del tablespace A. Aunque siempre se dice que los objetos estn dentro del tablespace, en realidad las tablas estn dentro del datafile, pero tienen la propiedades asociadas al tablespace. Cada uno de los datafiles utilizados est ocupando su tamao en disco (50 Mb los dos primeros y 25 Mb el ltimo) aunque en realidad slo contengan dos objetos y estos objetos no llenen el espacio que est asignado para los datafiles.
COM
Los datafiles tienen una propiedad llamada AUTOEXTEND, que se si est activa, se encarga de que el datafile crezca automticamente (segn un tamao indicado) cada vez que se necesite espacio y no exista. Al igual que los tablespaces, los datafiles tambin puede estar en lnea o fuera de ella.
Podemos ver cmo el espacio que realmente se ocupa dentro del datafile es el segment y que cada segmento pertenece a un objeto. Existen 5 tipos de segmentos: De datos: almacenan las tablas. De ndices: permiten un acceso rpido a los datos dependiendo de la cantidad de los mismos (rboles B). Las consultas que slo referencian a columnas indexadas se resuelven en el ndice. Establecen un control de unicidad (los ndices son automticos cuando se definen claves primarias). Cada ndice ocupa un segmento independiente del segmento de datos y deberan estar en un espacio de tablas distinto al de los datos, para mejorar el rendimiento. De rollback: son objetos internos de la BD que permiten efectuar la restauracin de las transacciones no validadas asegurando la consistencia en lectura. La estructura de los registros de rollback es : o Identificador de la transaccin. o Direccin del bloque donde est la tabla.
COM o o o
Nmero de fila. Nmero de columna. Valor del dato antiguo (antes de ser modificado).
Son tan importantes que una BD no puede arrancar si no puede acceder al menos a un segmento de rollback. Si la BD tiene mltiples espacios de tablas, deben existir al menos dos segmentos de rollback y cada segmento de rollback debe tener al menos dos extensiones, reutilizables de manera cclica. Esto segmentos son un objeto compartido de la BD, aunque se puede asinar un segmento de rollback particular a una transaccin dada. Temporales: son creados por Oracle para un uso temporal cuando debe realizar una ordenacin que no le cabe en memoria, y en las operaciones: create index, order by, group by, distinct, union, intersect, minus. Son eliminados cuando la sentencia finaliza. De bootstrap: Se crea en SYSTEM y contiene definiciones del diccionario para sus tablas, que se cargan al abrir la BD. No requiere ninguna accin por parte del DBA. No cambia de tamao.
La tabla que guarda la informacin de los segmentos de usuario es user_segments, y se puede visualizar la informacin sobre los segmentos con la sentencia SQL siguiente:
COM
En el esquema vemos como el objeto (tabla) FACTURA tiene un segmento en el datafile A-1, y este segmento est compuesto de 3 extensiones. Una de estas extensiones tiene un color distinto. Esto es porque existen dos tipos de extensiones: INITIAL (extensiones iniciales): estas son las extensiones que se reservan durante la creacin del objeto. Una vez que un objeto est creado, no se puede modificar su extensin inicial. NEXT (siguientes o subsiguientes extensiones): toda extensin reservada despus de la creacin del objeto. Si el INITIAL EXTENT de una tabla est llena y se est intentando insertar ms filas, se intentar crear un NEXT EXTENT (siempre y cuando el datafile tenga espacio libre y tengamos cuota de ocupacin suficiente). Sabiendo que las extensiones se crean en momentos distintos de tiempo, es lgico pensar que unas extensiones pueden estar fragmentadas de otras. Un objeto de base de datos no reside todo junto dentro del bloque, sino que residir en tantos bloque como extensiones tenga. Por eso es crtico definir un buen tamao de extensin inicial, ya que, si es lo suficientemente grande, el objeto nunca estar fragmentado. Si el objeto tiene muchas extensiones y stas estn muy separadas en disco, las consultas pueden retardarse considerablemente, ya que las cabezas lectoras tienes que dar saltos constantemente. El tamao de las extensiones (tanto las INITIAL como las NEXT), se definen durante la creacin del objeto y no puede ser modificado despus de la creacin. Oracle recomienda que el tamao del INITIAL EXTENT sea igual al tamao del NEXT EXTENT. La mejor solucin es calcular el tamao que tendr el objeto (tabla o ndice), multiplicando el tamao de cada fila por una estimacin del nmero de filas. Cuando hemos hecho este clculo, debemos utilizar este tamao como extensin INITIAL y NEXT, y tendremos prcticamente la certeza de que no se va a producir fragmentacin en ese objeto. En caso de detectar ms de 10 extensiones en un objeto (consultando el catlogo de Oracle, como veremos), debemos recrear el objeto desde cero (aplicando el clculo anterior) e importar de nuevo los datos. Ciertas operaciones, necesitan de espacio en disco para poder realizarse. El espacio reservado se denomina segmentos temporales. Se pueden crear segmentos temporales cuando: Se crea un ndice Se utiliza ORDER BY, DISTINTC o GROUP BY en un SELECT.
COM
Se utilizan los operadores UNION, INTERSECT o MINUS. Se utilizan joins entre tablas. Se utilizan subconsultas.
(*) Espacio ocupado en el data block por la primera NEXT EXTENSION. (#) Espacio ocupado en unidades de asignacin del sistema operativo por los data blocks anteriores. El esquema muestra toda la cadena de almacenamiento de Oracle.
COM
Desde el nivel ms fsico al ms lgico: Unidades de asignacin del sistema operativo (El ms fsico. No depende de Oracle) Data blocks de Oracle Extents Segments DataFiles Tablespaces (El ms lgico) El tamao de las unidades de asignacin del sistema operativo se define durante el particionado del disco duro (FDISK, FIPS), y el espacio de los data blocks de Oracle se define durante la instalacin y no puede ser cambiado. Como es lgico, el tamao de un data block tiene que ser mltiplo del tamao de una unidad de asignacin, es decir, si cada unidad de asignacin ocupa 4 K, los data blocks pueden ser de 4K, 8K, 12K para que en el sistema operativo ocupen 1, 2, 3 unidades de asignacin. Esquema extrado del Oracle8 Concepts
COM
4. Referencias bibliogrficas
Oracle 8 Concepts (Oracle Corporation) Oracle 8 Sql Referente (Oracle Corporation) Oracle 8 Tuning (Oracle Corporation) Documento de Apoyo Arquitectura Oracle (everis) Documento de Apoyo ndices Oracle (everis) Documento de Apoyo Vista Oracle (everis) Documento de Apoyo Definicin de Estndares (everis)
Documentacin Documentacin Documentacin Apoyo ndices Oracle Apoyo v1.0.doc Vistas Oracle v1.0.doc Apoyo Arquitectura Oracle v1.0.doc