Sei sulla pagina 1di 5

PREMISA FUNDAMENTAL LOGICAL I/O El objetivo del afinamiento es mejorar el plan de ejecucin para recuperar los datos con

el menor nmero de accesos a la base de datos (LOGICAL I/O, o BUFFER GETS, y PHYSICAL I/O, o PHYSICAL READS). Elimine la mayuor cantidad de operaciones FULL SCAN. Antes de crear ndices u obligar a la consulta a utilizarlos, evale la cantidad de registros recuperados por la operacin Tenga presente que el uso de HINTS se debera restringir a operaciones de depuracin. Evite el cdigo permanente con estas clusulas.

SQL
Porqu los ndices no son usados? El optimizador decide que es ms eficiente NO usarlo. Se realiza una funcin sobre la columna indexada: where upper(nombre) = 'SARMIENTO' Se realizan operaciones en la columna indexada: where salario + 1 = 10001 Se concatenan columnas: where nombre || ' ' || apellido = 'Carlos Sarmiento' No se incluye la primera columna de un ndice compuesto en la clusula where de la sentencia (pre-9i) El uso de sentencias OR puede confundir al optimizador basado en costos (CBO) EXISTS vs. IN La clusula EXISTS comprueba la presencia de al menos un un registro que satisfaga el criterio establecido, en oposicin de la clusula IN, que busca TODAS las ocurrencias. Ejemplo: Tabla1 (1000 registros) Tabla2 (1000 registros) (A)
SELECT FROM WHERE t1.colx tabla1 t1 t1.coly IN (SELECT t2.coly FROM tabla2 t2)

(B)
SELECT FROM WHERE t1.colx tabla1 t1 EXISTS (SELECT '1' FROM tabla2 t2 WHERE t2.coly = t1.coly)

En la consulta A, todos los registros de TABLA2 se leen por cada registro de TABLA1. El efecto es de 1000000 de registros ledos. En la consulta B, un mximo de 1 registro de TABLA2 se lee por cada registro de TABLA1, reduciendo el total de procesamiento de la sentencia. Aunque es peligroso emitir una regla respecto al criterio de uso, podra recomendarse: Si la mayora de los criterios de filtrado estn en la subconsulta, IN puede tener mayor desempeo. Si la mayora de los criterios de filtaro estn en la consulta principal (externa), EXISTS puede tener mayor desempeo.

DESIGUALDADES En consultas con desigualdades (columna > valor) el optimizador debe estimar el nmero de registros que retornar antes de decidir cul es la mejor forma de recuperar los datos. La estimacin est sujeta a errores. Si se utilizan ndices en la columna que se desea validar, el rendimiento puede mejorar si se sustituye una desigualdad estricta (>) por una desigualdad incluyente (>=). La desigualdad estricta provoca una consulta de tipo FULL SCAN sobre el ndice; en el segundo caso, la consulta da inicio en el punto de la entrada con valor exacto. En ndices de gran tamao puede reducir el nmero de bloques ledos.

PIVOTES (DRIVING TABLES) En la poca previa al optimizador basado en costos, la nica forma para optimizar el desempeo de una sentencia SQL fue construir la sentencia de manera eficiente teniendo en cuenta algunas reglas bsicas. Oracle procesa resultados de uno a la vez. Da inicio a la recuperacin de los datos de una primera tabla a la que se llama pivote (DRIVING TABLE). Una vez se recuperan, stos son usados para limitar el nmero de registros procesados por subsecuentes tablas. En el caso de que intervengan mltiples tablas, la tabla pivote (DRIVING TABLE) limita los registros procesados para la segunda tabla. Una vez procesados, los datos combinados son el conjunto que limita los resultados de la tercera tabla, etc. En resumen, es mejor procesar inicialmente las tablas que recuperarn el menor nmero de registros. Si el optimizador no puede tomar una decisin en cuanto a cul es la tabla que ser pivote de la consulta, el orden de procesamiento ser desde el final de la clusula FROM hacia el inicio, de tal manera que siempre se debera poner la tabla pivote (DRIVING TABLE) al final de la clusula FROM. Las subsecuentes tablas sern puestas en el orden en el que las tablas con mayor nmero de registros estn al principio de la clusula FROM. Sin embargo, de manera confusa, las condiciones de la clusula WHERE debern ser escritas en el orden opuesto, es decir, las condiciones de filtro sobre la tabla pivote al principio, y sobre las ltimas tablas al final. Ejemplo:
... FROM d, c, b, a WHERE a.columna_join = 12345 AND a.columna_join = b.columna_join AND b.columna_join = c.columna_join AND c.columna_join = d.columna_join

si se pudiese limitar la mayor cantidad de resultados en la tabla D del ejemplo, se podra ajustar:
... FROM d, c, b, a WHERE a.columna_join = valor_filtro_1 AND a.columna_join = b.columna_join AND b.columna_join = c.columna_join AND c.columna_join = d.columna_join AND d.otra_columna = valor_filtro_2

Ahora, si el filtro fuese tan restrictivo que produjera la menor cantidad de registros, se podra pensar en la tabla D como pivote, por lo que se podra cambiar la sentencia por
... FROM c, b, a, d WHERE d.otra_columna = valor_filtro_2 AND d.columna_join = valor_filtro_1 AND d.columna_join = a.columna_join AND a.columna_join = b.columna_join AND b.columna_join= c.columna_join

TIEMPO UTILIZADO EN ANALISIS SINTCTICO Y SEMNTICO (PARSE) Dado que es la parte que mayor cantidad de recursos consume, se puede reducir este tiempo si en las sentencias se hace uso efectdivo de los ALIASES para las tablas. Si no hay un alias, el gestor debe resolver cules tablas son dueas de cules columnas. Ejemplo:
SELECT nombre, FROM WHERE AND pais, apellido, ciudad,

empleado apellido = 'SARMIENTO' pais_id = id

Es mejor:
SELECT e.nombre, e.apellido, c.ciudad, FROM pais p, empleado e WHERE e.apellido = 'SARMIENTO' AND e.pais_id = c.id

INDICES y FULL SCAN Un FULL SCAN no es diablico Una consulta indexada no siempre es benfica Las consultas deberan ser revisadas para su plan de ejecucin. Ante la presencia de un FULL SCAN, dude. A veces, un FULL SCAN en una tabla pequea es ms eficiente que un acceso indexado a la misma tabla.

FUNCIONES ANALITICAS Existen algunas operaciones que requieren un gran esfuerzo para construir con SQL tradicional: Porcentajes en un grupo Acumuladores Principales valores (Top N) Rangos y calificaciones (posicin en una lista) No solo porque facilitan la construccin de la sentencias, sino porque consumen una cantidad significativamente menor de recursos. Caractersticas: Funciones de tipo RANGO, VENTANA (las tradicionales funciones de agregacin) funciones de agregacin, con capacidad de ordenamiento y particionamiento). o REPORTE (las

Permiten tener alcance sobre informacin previa (LAG) o posterior (LEAD) para la realizacin de operaciones.

SIMPLIFICACION La clusula WITH, introducida en el estndar SQL99 permite que una clusula de subconsulta dentro de una sentencia asemeje su comportamiento al de una tabla de tipo GLOBAL TEMPORARY. Solo funciona en Oracle 9i R2 en adelante Se conoce formalmente como SUBQUERY FACTORING Es usada cuando una subconsulta se utiliza mltiples veces Facilita la construccin de sentencias complejas

Sintaxis bsica:
WITH subquery_1 AS ( SELECT ... ) , subquery_2 AS ( SELECT ... ) SELECT ... FROM subquery_1 sq_1 , subquery_2 sq_2 WHERE sq_1... = sq_2...

La cual es semnticamente igual a:


SELECT ... FROM (SELECT ...) inline_view_1 , (SELECT ...) inline_view_2 WHERE ...

Tambin es posible utilizar la clusula WITH para definir consultas complejas, como:
WITH subquery_1 AS ( SELECT ... FROM table ) , subquery_2 AS ( SELECT ... FROM subquery_1 ) SELECT ... FROM subquery_2 WHERE ...

La cual es semnticamente igual a:


SELECT ... FROM (SELECT ... FROM ( SELECT ...))

PROGRAMACION PL/SQL
VALIDACIN DE PRESENCIA Si el flujo de proceso est condicionado a la presencia de ciertos registros en una tabla:
SELECT INTO FROM WHERE count(*) v_cuenta tabla condicion;

IF v_cuenta = 0 THEN Flujo del proceso END IF;

En este caso, si existen muchos registros que cumplen la condicion la consulta tomar mucho tiempo, y los resultados no son necesarios. Se puede pensar en una lgica como:
SELECT INTO FROM WHERE AND count(*) v_cuenta tabla condicion rownum = 1;

IF v_cuenta = 0 THEN Flujo del proceso END IF;

SELECT INTO FROM WHERE count(*) v_cuenta dual EXISTS (SELECT 1 FROM tabla WHERE condicion);

IF v_cuenta = 0 THEN Flujo del proceso END IF;

En los dos ejemplos, basta un registro para validar la condicin. OPERACIONES MASIVAS (BULK)

SQL DINMICO Evitar la concatenacin de textos que generen sentencias diferentes. Favorecer las sentencias de SQL directo: EXECUTE IMMEDIATE. Oracle recomienda stas construcciones en lugar del uso del paquete DBMS_SQL como ha sido tradicional. Use variables de acoplamiento. Reemplace su valor mediante USING, no por concatenacin del valor que representa.

Potrebbero piacerti anche