Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Oracle: Taller de
Afinación y Sentencias
SQL.
Tabla de contenido
PREFACIO .................................................................................................................................................... 6
2
Oracle: Taller de Afinacion de Sentencias SQL
4
Oracle: Taller de Afinacion de Sentencias SQL
5
Prefacio
REQUISISTOS:
Antes de tomar este curso es necesario tener conocimiento sobre SQL y
SQL*Plus, además de experiencia como desarrollador de aplicaciones y haber
tomado los siguientes cursos:
- Introducción a Oracle (SQL y PL/SQL)
- Oracle para usuarios expertos de SQL.
Audiencia.
Este curso es ideal para todas aquellas personas que requieran de aumentar en
gran medida el rendimiento de sus aplicaciones por medio de afinación en sus
declaraciones de SQL y de procedimientos elaborados en PL/SQL, así como
también métodos de optimización y de almacenamiento.
Este Curso esta diseñado para dar a los participantes firmes fundamentos en el
arte de afinar declaraciones de SQL. El objetivo de este curso es dar al
participante los conocimientos necesarios y la habilidad para realizar afinaciones
efectivas sobre declaraciones de SQL.
Duración:
Tiene una duración aproximada de 8 horas diarias durante 3 días.
Introducción.
Cualquier persona involucrada en la afinación, podrá seguir una metodología
para lograr el máximo desempeño. Afinando declaraciones de SQL es un paso
muy importante ya que disminuye el costo, si es aplicado en el momento
apropiado dentro de la metodología.
Ejerciendo una metodología de afinación, es posible optimizar el desempeño del
optimizador, para un mejor tiempo de respuesta y dimensionalidad. La afinación
es uno, en el proceso en marcha del ciclo biológico de un proyecto que necesita
empezar en la fase de desarrollo y continúa a través de la fase de
mantenimiento.
• Manejar desempeño en una etapa tempranera
• Identificar problemas de desempeño
• Determinar afinar roles
• Afinar declaraciones de SQL
• Ejercer la metodología de afinación
Afinar declaraciones de SQL involucra usar herramientas de análisis, técnicas
de afinación de SQL, y el Optimizador eficazmente. Además, afinar el esquema
puede crear caminos adicionales de acceso para el Optimizador, como el uso de
un índice.
6
Oracle: Taller de Afinacion de Sentencias SQL
Objetivos
Después de completar esta lección, podrás realizar lo siguiente:
• Conocer los Pasos del procedimiento en el manejo del rendimiento
• Describir las causas de los problemas del rendimiento.
• Identificar las principales áreas del proceso en donde se deberá de llevar
acabo la afinación
• Describir la metodología de afinación
• Explicar la mejora de seguir en orden una buena metodología de afinación
• Listar los pasos de afinación los cuales son responsabilidad del
desarrollador de aplicaciones.
7
El manejo Excepciones y cambios
Cuando el monitoreo efectivo esté en su sitio y respaldado al nivel de los demás
de la aplicación, debes reaccionar prontamente para las excepciones cuando
son reportados. .Usa los datos disponibles seleccionar un curso de la acción y
entonces analizar el desempeño resultante para determinar si sus acciones
tienen éxito. . Si el mono cambia capacidad de patrones en uso o del equipo
ocurren, entonces deberías considerar ajustar objetivos nuevos.
La Regla del 80/20
Típicamente, 20 % de su cuenta de transacciones (incluyendo declaraciones
selectas) para 80 % del uso de sistema. . Las transacciones que forman este 20
% son los que necesitan ser sintonizados, y afinar cualquier otra cosa está
probablemente que no vale su tiempo y su energía.
También puedes formular este fenómeno con el siguiente corolario: : 50 % de la
utilización viene de 5 % de sus transacciones.
Factores que deben de ser manejados
• Esquema
− Diseño de los datos
− Indices
• Aplicación
− Estatus de SQL
− Código de procedimiento
• Instancia
• Base de datos
• Expectaciones del usuario
8
Oracle: Taller de Afinacion de Sentencias SQL
El esquema
Si una aplicación tiene diseño inadecuado o impropio de datos, entonces
afinando la fijación física, programas que reescribe con tal que índice, o no
sobrecogerán el problema.
Estatutos de SQL.
Si una aplicación es adecuadamente diseñada, entonces todavía puede quedar
mal. . Una razón común para esto es SQL mal escrito.
Las expectativas del usuario
Los usuarios esperan desempeño coherente. . Pueden hacer frente a las
funciones más lentas de aplicación si entienden por que la aplicación es más
lenta que usual. . El equipo de proyecto debería tratar de basar una expectativa
del usuario realista de desempeño, posiblemente incluyendo mensajes de
aplicación a advertir a los operadores que demandan las operaciones que son
hambrientas en recurso. . El mejor tiempo a hacer esto está antes del diseño y
constitución pone en fase y como parte de la fase de transición.
Problemas del rendimiento
• Inadecuado consumo de recursos
− CPU
− I/O
− Memoria (puede ser detectado como un problema
de I/O)
− Recurso de comunicación de los datos
• Inadecuado diseño de recursos
• Candados
Problemas de Rendimiento
Los problemas de desempeño ocurren cuando una función toma más tiempo
para funcionar que el tiempo permitió. . Esto está porque un recurso de un tipo
particular es insuficiente o inadecuado. . El recurso puede ser un recurso físico,
algo semejante como la memoria disponible modera para almacenar datos
bloquean, o un recurso artificial, como una cerradura.
Inadecuado consumo de recursos.
Un recurso simplemente puede ser inadecuado para responsabilizarse por la
necesidad bajo cualquier condiciones. Por ejemplo, si quieres una función para
completar en debajo una segunda, entonces una red con un intervalo de
basculamiento de mensaje de dos segundos nunca se responsabilizará por el
blanco.
Si el factor limitante es un recurso consumible, entonces como el poder de la
UPC, todos los usuarios de ese recurso son afectados.
Inadecuado diseño de recursos.
Si el factor limitante es la argumentación de procesos para un recurso del
diseño, entonces como una cerradura, entonces sólo los usuarios de esos
procesos específicos son probablemente para ser afectados.
9
Candados
La argumentación debido a poner candado por otras transacciones u otras
aplicaciones podría ser un problema.
Recurso critico
• El rendimiento depende lo siguiente:
− Cuantos clientes necesitan del recurso.
− Cuanto deben de esperar por este.
− Cuanto lo retendrá
• Considerar limites de demanda para mantener
tiempos de respuesta aceptables
Recurso crítico
El tiempo de respuesta está definido como el tiempo de servicio positivo la
espera cronometre de lograr una cierta tarea.
Como la demanda para un recurso con un solo servidor aumenta hacia la tasa
de servicio, las colas construyen arriba con el largo de la cola aumentando
exponencialmente para cada incremento en la demanda.
Aun si hay muchos servidores, puedes observar el mismo efecto con una sola
cola. . Sin embargo, los servidores múltiples dan un efecto valioso de alisamiento
cuando hay una variación ancha en el tiempo para el cual un recurso es ocupado
a las un de sus clientes antes de que esté disponible para la reafijación.
El cometido es diseñar, diseñar, y afinar el sistema a fin de que la carga nunca
permitida para despacio reparar veces de terminación debajo del nivel aceptable.
Exceso de demanda
• Gran incremento de tiempo de respuesta y reduce la
cantidad de información procesada
• Deberá ser procesada tanto como sea posible por un
limite de demanda para un nivel que aun permita una
razonable cantidad de información procesada.
Exceso de Demanda
El rendimiento específico está definido como el importe total de trabajo logrado
por el sistema en una cantidad dada de tiempo. . Demasiados procesos usando
un sistema simultáneamente pueden resultar en los siguientes síntomas.
10
Oracle: Taller de Afinacion de Sentencias SQL
La Metodología de Afinación
La lista en los espectáculos de la diapositiva que las fases del desarrollo reciclan
en cuál la afinación puede ser aplicada.
Después de los pasos en esta orden es recomendado para las siguientes
razones:
Lo anterior el paso, lo más alto el potencial para mejorar desempeño.
• Lo anterior el paso, lo más alto el costo para funcionar o revisarlo más tarde.
Por ejemplo, los cambios para las estructuras de datos y la aplicación
codifican después de que el diseño inicial tenga una tendencia a ser caro y
requerir el gasto adicional de reensayo de los componentes hipotecados.
• Las decisiones hechas en un paso pueden influenciar subsiguientes pasos. .
Por ejemplo, la declaración de SQL que escribes a compás 4 tendrá
compostura significante en analizar gramaticalmente y escondiendo en
reserva asuntos que son de los que se ocupó a compás 6.
11
• Lo más extensamente que usas técnicas de diseño orientado a objetos y
multiescalenó arquitectura, el apostador las oportunidades que tu con toda
seguridad logrará cualquier aplicación los cambia en un costo razonable.
Afinando Roles
Analista Empresarial 1. Función de la empresa
Diseñador 2.-Diseño de datos
3.-Diseño de procesos
Desarrollador de 4.-Estatus de SQL
Aplicaciones 5.-Estructuras físicas
6.-Signacion de memoria
7.-I/O
Administrador de DBA 8.-Contención de memoria
Administrador de 9.-Sistema operativo
Sistema operativo
Afinando Roles
El analista de empresas, el diseñador, el desarrollador de aplicación, el
administrador de la base de datos, y el administrador del sistema operativo son
responsables de pasos diferentes en el proceso de afinación. . En algunos
casos, una persona puede cumplir a cabalidad varia de estos papeles.
Las escaleras realizadas por el administrador de la base de datos y el
administrador del sistema operativo tienen un efecto inferior en el desempeño
que más temprano da un paso, excepto que ellos puede ser realizado en el costo
relativamente bajo con resultados inmediatamente disponibles y observables.
El cuarto paso en la metodología es primordialmente la responsabilidad del
desarrollador de aplicación. . Sin embargo, entender qué tan afinar SQL puede
facultar a los diseñadores a diseñar esquemas que afinarán fácilmente. . Los
administradores de la base de datos con esta comprensión pueden ayudar a
precisar necesidades de afinación de SQL y soluciones, así aliviando la carga en
sus bases de datos. Esto es especialmente útil si la aplicación está ya en la
producción y el desarrollador de aplicación está ya no disponible.
Nota: Una parte grande de afinación en el servidor - cliente o Web los ambientes guarda
relación con asuntos de la red, igualmente.
12
Oracle: Taller de Afinacion de Sentencias SQL
13
Aplicando la Metodología
• Se practico: trabajar de arriba hacia abajo.
• Si tu debes de ser reactivo, Trabajar de abajo
hacia arriba usando lo siguiente:
− Establecer objetivos cuantificables
− Crear a mínimo de pruebas repetibles.
− Ask questions of affected users, and avoid
preconceptions.
− Pruebas hipotéticas y realizar anotaciones.
− Para cuando se conozca el destino
Objetivos cuantificables
Establecen objetivos cuantificables, y evitan vagos objetivos. . Un ejemplo de un
objetivo aceptable sería lo siguiente:
" debemos poder soportar hasta 20 operadores, cada introducir 20 órdenes por
hora, y las listas de cogida deben estar producidas dentro de 30 minutos del fin
del cambio""
"La prueba Repetible mínima
Si tratas de cortar una carrera de cuatro horas para dos horas, se repitió,
entonces las oportunidades del momento se toman mucho tiempo. . Realice sus
pruebas iniciales en contra de un ambiente experimental parecido a la real (o
provee entrada para una condición negativa, como procesadora departamento
en lugar de 500 de ellas). . El precedente legal ideal debería presentar la
candidatura para más que un minuto a fin de que las mejoras son demostradas
intuitivamente y pueden ser medidas usando cronometrando características.
• Has preguntas de usuarios afectados y evite prejuicios.
• Prueba hipótesis y conserve notas.
• Deténte cuando se responsabiliza por el blanco.
Afinando a un Problema Específico para un Aplicación que ya existe en la
Producción
A menudo, los especialistas de desempeño son emplazados hacia fines del ciclo
biológico de un proyecto, cuando el sistema está en la producción y realizando
inaceptablemente.
En esta situación, comience al pie de la lista de método y maquine. . Los
artículos al final son el más barato y más rápido para funcionar. Si no solucionan
el problema, entonces tendrás que operar hacia atrás "cuesta arriba," y esto
comienza a aumentar expensas y retrasos de tiempo.
14
Oracle: Taller de Afinacion de Sentencias SQL
Objetivos
Sabiendo cómo pueden ayudar las declaraciones SQL de procesos Oracle8i
Server tu diseñas declaraciones de SQL que puede rehusar el análisis
gramatical y esfuerzos de optimización.
Después de completar esta lección, deberás poder:
• Describir los pasos básicos involucrados en tramitar una declaración de SQL
• Monitorear el uso de áreas compartidas de SQL
• Escribe una declaración de SQL de la que aprovecharse áreas compartidas
(Esto le facultará a rehusar esfuerzos de análisis gramatical y de
optimización) de SQL
Visión General
• Areas Compartidas de SQL
• Fases del Procesamiento de SQL
• Cursores compartidos
• Normas de Codificaciones SQL
Visión general
Sabiendo de compartió áreas de SQL, el procesamiento de SQL pone en fase, y
los cursores compartidos, puedes entender cómo codificando normas le faculta a
minimizar cada cuánto sus declaraciones debe ser al que se analizó
gramaticalmente y optimized.
Adicionalmente, como las declaraciones que escribes en lo que se convirtió más
estandarizó, puedes identificar declaraciones que y los dedican afinación
adicional para ellos.
Areas compartidas de SQL
15
Las Areas de Shared SQL
La shared pool es parte del Sistema Global Area (SGA). La shared pool contiene
el cache del diccionario y el cache de la biblioteca. Las áreas compartidas de
SQL son parte del cache de la biblioteca. El cache de la biblioteca también
contiene metadatos.
La shared pool es automáticamente mantenida por un mecanismo envejecido.
Este mecanismo envejecido usa un algoritmo menos recientemente usado (LRU)
determinar cuál ha sido allí más largo y las edades que él fuera de cuando el
espacio sea requerido.
El administrador de la base de datos (DBA) puede cambiar el diccionario
disponible y SQL compartido que las áreas espacian modificando el parámetro
SHARED_POOL_SIZE de inicialización de EL DBA haría esto como parte de un
esfuerzo global de afinación de la base de datos, lo cual estaría sujeto a las
restricciones diversas discutidas en el curso Oracle8i Performance Tuning.
Los cursores
Dentro del área compartido de SQL, cada declaración de SQL es a la que se
analizó gramaticalmente en su propia parte, conocido como un área de contexto
o cursor.
Cada cursor sostiene la siguiente información:
• La declaración a la que se analizó gramaticalmente (la estática, dinámico, y
el SQL recursivo, y las unidades del programa como los procedimientos y los
triggers de la base de datos)
• El plan de ejecución
• Una lista de objetos para los que se estableció referencias
Si dos usuarios emiten la misma declaración de SQL, entonces usarán el mismo
cursor. La declaración es a la que se reanalizó gramaticalmente si la
representación en la shared pool es inválida. Esto ocurre, por ejemplo, si una
declaración de lenguaje de definición de datos (DDL) tan ALTER TABLE fue
usada en uno de los objetos en la declaración, o si una tabla dependiente es
analizada
Fases del procesamiento de una sentencia
de SQL
16
Oracle: Taller de Afinacion de Sentencias SQL
17
Cada herramienta Oracle ofrece sus propias formas de influenciar el tamaño de
conjunto imponente; En el SQL*PLUS haces eso usando al ARRAYSIZE
sedimentándose:
SQL> SHOW arraysize
Arraysize 15
SQL> SET arraysize 1
Con este escenario, el SQL*PLUS procesará una fila a la vez. El valor
predeterminado es 15.
El cursor compartido: beneficios
Cuando una declaración de SQL es encontrada en el área compartida de SQL,
entonces la fase PARSE es reducida y el cursor existente es usado. Éstas son
las prestaciones principales de cursores participativos:
• Compartir cursores se achica analizar gramaticalmente y ahorra tiempo.
• La memoria dinámicamente se ajusta al SQL siendo ejecutada.
• El uso de memoria puede mejorar dramáticamente, puede emparejar para
herramientas que almacenan SQL dentro de la aplicación.
18
Oracle: Taller de Afinacion de Sentencias SQL
19
Usando Código Compartido Genérico
• Escriba y almacene procedimientos que puede ser compartidos a través de
aplicaciones.
• La base de datos de uso se acciona.
• Los triggers de base de datos.
• Las rutinas de la biblioteca de escritura y los procedimientos en otros
ambientes.
Escribiendo SQL para cursos compartidos
Siguiendo un estándar de codificación:
• Case
• Espacios en blanco
• Comentarios
• Objetos referenciados
• Variables Bind
Escribiendo SQL para Cursores Compartidos
Escribiendo a Formato Standard.
• Desarrolle normas del formato para todas las declaraciones, incluyendo esos
adentro código del PL/SQL.
• Desarrolle reglas para el uso de caja alta y la letra minúscula.
• Desarrolle reglas para el uso de espacio blanco (los espacios, las etiquetas,
los retornos de carro).
• Desarrolle reglas para el uso de comentarios, preferentemente
manteniéndolas apartado de las declaraciones de SQL mismas.
• Use los mismos nombres para referirse a los objetos idénticos de la base de
datos.
20
Oracle: Taller de Afinacion de Sentencias SQL
La Vista V$librarycache.
Esta vista sostiene información acerca de la dirección del cache de la biblioteca.
Los valores para PINHITRATIO y GETHITRATIO cerca de 1 indican un buen
desempeño del cache de la biblioteca. Noto que esta diapositiva no muestra
todas las columnas de la vista V$LIBRARYCACHE.
La vista V$LIBRARYCACHE es usada en la consulta debajo averiguar sobre la
cantidad de esconder en reserva.
SQL> select gethitratio, pinhitratio
2 from v$librarycache
3 where namespace = 'SQL AREA';
GETHITRATIO PINHITRATIO
------------------- ------------------
0. 0.95
V$SQLAREA Columnas
21
El uso compartido del Cursor
La vista V$SQLAREA contiene información acerca de todos los cursores
compartidos en el cache.
VERSIÓN COUNT> 1 Señala que el mismo texto es usado por usuarios
diferentes Sobre la misma tabla.
LOADS > 1 Indica que el curso vuelve a cargar después una
invalidación de este
COMMAND_TYPE 1: CREATE TABLE
2: INSERT
3: SELECT
6: UPDATE
7: DELETE
Nota: Sólo las columnas más importantes de la vista V$SQLAREA están en lista de
arriba.
22
Oracle: Taller de Afinacion de Sentencias SQL
Resumen
Use declaraciones idénticas de SQL rehusar áreas de SQL y así aumentar
desempeño. De una manera realista, esto será más fácil si usas código
compartido como los procedimientos empacados, porque el mismo código será
ejecutado las veces múltiples. Esto que también el maintainability de
incrementos del código y las ayudas limitan que sus esfuerzos de afinación para
uno colocan compartió código en lugar de las declaraciones similares
desparramadas múltiples de SQL.
Fases del procesamiento
Hay cuatro etapas principales en tramitar una declaración de SQL:
• En la etapa PARSE, el Oracle8i Server comprueba la sintaxis de la
declaración, determina el plan de ejecución si la declaración no está ya en el
área compartido de SQL, y verifica la información en el diccionario de datos.
• La etapa BIND es cualquier variable no resuelta se les es asignado un valor.
• Dentro de la etapa EXECUTE , el Oracle8i Server ejecuta la declaración
realizando lecturas y escrituras (excepto por las consultas).
• En la etapa de FETCH (sólo para consultas), las filas son recuperadas
usando un mecanismo de estratagema de conjunto imponente.
Areas compartidas de SQL.
Evitar análisis gramatical cada declaración de SQL emitida para el Oracle8i
Server, desarrolle una codificación estándar para aprovecharse de las áreas
compartidas de SQL:
• Siga normas de codificación para espaciar, superior y las referencias de letra
minúscula, de comentarios, del objeto, etcétera.
• Use código genérico, los procedimientos, los triggers de la base de datos,
etcétera.
• Use los mismos nombres referirse a los objetos idénticos de la base de datos.
Trata de usar variables de vinculación a distinción de los valores literales en sus
declaraciones de SQL, a menos que el desempeño máximo pues una sola
declaración de SQL sea necesario. Hay un trueque entre el SQL compartido
23
utilizador (con variables de vinculación) y el desempeño máximo (usando ad
literam valores, habilitando el Optimizador venidero levantado con un plan óptimo
de ejecución).
Práctica 2
En esta práctica, use las vistas del diccionario de datos para analizar el manejo
del cache:
• Use la vista V$LIBRARYCACHE analizar desempeño del cache de la
biblioteca
• Use la vista V$SQLAREA para ver la información acerca de todos los
cursores compartidos en el cache
Práctica 2 (optativo)
1. Determino que el arraysize se sedimentó en su SQL*PLUS su ambiente.
2. Emita la siguiente declaración de SQL, entonces mire la información
generada por esta declaración en la vista V$SQLAREA.
SQL> select cls_status, description
2 from cls_statuses;
SQL> select sql_text, sorts
2 from v$sqlarea
3 where command_type = 3
4 and lower(sql_text) like '%cls_statuses%';
3. Modifique la consulta en la tabla CLS_STATUS y añada un criterio de tipo,
entonces mire la información generada por esta declaración en la vista
V$SQLAREA.
SQL> select cls_status, description
2 from cls_statuses
3 order by cls_status;
SQL> select sql_text, sorts
2 from v$sqlarea
3 where command_type = 3
4 and lower(sql_text) like '%cls_statuses%';
4. Introduzca un registro nuevo en la tabla CLS_STATUS. Mire la información
generada por la esta declaración en la vista V$SQLAREA. Recorte su
transacción para restaurar la situación original.
SQL> insert into cls_statuses
2 values('HOLD', 'Class on hold');
SQL> select sql_text, sorts
2 from v$sqlarea
3 where command_type in (2,3)
4 and lower(sql_text) like '%cls_statuses%';
SQL> rollback;
5. Use la vista V$LIBRARYCACHE para comprobar la cantidad de cache
reservado.
24
Oracle: Taller de Afinacion de Sentencias SQL
3. Explain y Autotrace
Los Objetivos
Puedes usar herramientas diversas de análisis evaluar el desempeño de
declaraciones de SQL.
Después de completar esta lección, debería :
• Crear la PLAN_TABLE usando el escrito del utlxplan.sql
• El uso del comando EXPLAIN PLAN para mostrar cómo es una declaración
procesada
• Usar el SQL*Plus AUTOTRACE para mostrar el plan de ejecución y
estadísticas de una declaración de sql.
25
La Sintaxis para crear el PLAN_TABLE
La sintaxis entera para la PLAN_TABLE es mostrada debajo:
Create table PLAN_TABLE
(statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizador varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30)); long
Las columnas más importantes estarán discutidas más tarde en esta lección
26
Oracle: Taller de Afinacion de Sentencias SQL
El campo El significado
text Éste es un identificador optativo para
la declaración. deberías introducir un
valor Para identificar cada declaración
a fin de que mas tarde puedas
especificar la declaración que quieres
clarificar. Esto es especialmente
importante cuando compartes el plan
Posponga con otros, o cuándo
guardes planes múltiples de ejecución
en lo mismo
Schema.table Éste es el nombre optativo de la tabla
de salida. El incumplimiento es _
PLAN_TABLE.
statement Éste es el texto de la declaración de
SQL
27
Desplegando el pLan de Ejecución.
La declaración selecta en la diapositiva es diseñada para ostentar los pasos que
serían tomados si la declaración de SQL fuera ejecutada. Las siguientes
columnas de la PLAN_TABLE son usadas:
STATEMENT_ID El valor del parámetro optativo de STATEMENT_ID
especificado en la declaración de EXPLAIN PLAN.
OPERATION El nombre de la operación realizada en este paso; Contiene
un valor en la primera fila generada para cada declaración
OPTIONS Las opciones para la operación (por Ejemplo, esto dirá
"remoto" Si una tabla remota es para la que se estableció
referencias en la Declaración de SQL).
OBJECT_NAME El nombre del objeto.
ID El número de este paso en el plan de ejecución
PARENT_ID Él ID del paso que opera en los resultados de este paso.
POSITION La orden en la cual los pasos con el mismo padre son
tratados.
Nota: Normalmente, metes esta declaración en un escrito de SQL con una variable para
el valor del ID de la declaración. Estas marcas usando lo explican plan mucho más
factible. En ese mismo escrito, también puedes suprimir (o truncar) todas las filas de la
PLAN_TABLE después de que los recuperase.
Alternativamente, el SQL*Plus y AUTOTRACE para eliminar la necesidad a
emitir consultas en contra de la PLAN_TABLE.
Desplegando PLAN_TABLE
SQL> select id
2. lpad( , 2*level) | | operation )
3. ||decode (id,0, cost= ||posit
4. || || options
5. || || objetc_name as Query Plan
6. from plan_table
7. Where Statement_id = demo_01
8. Connect by priorid = parent_idstart with id=0
ID Query plan
----- ----------------------------------------------------------------------
0 SELECT STATEMENT cost =
1 TABLE ACCESS BY INDEX ROWID CLASSES
2 AND-EQUAL
3 INDEX RANGE SCAN STAT_INDEX
4 INDEX RANGE SCAN LOC INDEX
Desplegando el plan de ejecución
Algunos otras columnas útiles (no usadas en el ejemplo) de la PLAN_TABLE
son:
TIMESTAMPLa fecha y el tiempo cuando la declaración expedida.
COST Basado el optimizador en costos la estimación del costo de realizar
la operación Incluyendo el costo de cualquier operación que están
obligadas a completar esta operación (El valor de esta columna no
tiene una unidad de medida particular. Es meramente un valor
ponderado usado para comparar expensas de ejecución planea.)
28
Oracle: Taller de Afinacion de Sentencias SQL
29
entonces puedes resolver introducir un índice. Deberías comprobar el plan de
ejecución otra vez para hacer seguro que el índice está usado.
SQL *Plus AUTOTRACE
El SQL*PLUS AUTOTRACE
En el SQL*PLUS, automáticamente puedes obtener el plan de ejecución y
algunas estadísticas adicionales en la corrida de una orden de SQL usando al
AUTOTRACE. A diferencia del EXPLAIN PLAN, la declaración es de hecho
puesta a funcionar, aun si haces suprimir la salida de declaración; Así puedes
ostentar estadísticas realistas. AUTOTRACE, un rasgo disponible desde la
liberación Oracle Server 7.3, es una herramienta diagnóstica excelente para
afinación de declaraciones de SQL. Porque es puramente declarativo, sea más
fácil usar EXPLAIN PLAN
Opciones del comando:
ON Desahabilita autorastrear declaraciones de SQL
OFF Habilita autorastrear declaraciones de SQL
TRACEONLY Posibilita autorastrear declaraciones de SQL y suprime
salida de declaración
EXPLAIN Despliega los planes de ejecución pero no estadísticas
STATISTICSDespliega estadísticas pero no planes de ejecución
Nota: Si ambas opciones de los comandos EXPLAIN y las STATISTICS son omitidas,
entonces los planes de ejecución y las estadísticas son desplegadas por defecto.
ESTADISTICAS AUTOTRACE.
AUTOTRACE ostenta varias estadísticas, no todos ellos pertinente para el
debate a estas alturas. En la siguiente lección, al discutiendo Indicio de SQL y
TKPROF, este curso entra en más detalle acerca de las estadísticas de
ejecución de declaración de SQL. Los más importantes son lo siguiente:
Db block gets El número de entrada/salidas lógicas actuales traidas.
Consistents gets El número de entrada/salidas lógicas lecturas consistentes
Physical reads El número de bloques leídos de disco
redo size La cantidad de redos generados (para declaraciones DML)
sorts(la memoria) El número de sorteos realizados en memoria.
sorts (disco) El número de sorteos realizados temporalmente en disco.
Resumen
La afinación involucra análisis meticuloso de estadísticas de ejecución de planes
y de ejecución. Varias herramientas están disponibles para ayudar probar y
diagnosticar problemas de desempeño con una declaración de SQL:
• PLAN_TABLE almacena planes de ejecución y puede ser creadas usando el
escrito del utlxplan.sql.
31
• EXPLAIN PLAN determina cómo tramitaría el optimizador una declaración (la
declaración no es ejecutada) y almacena el plan de ejecución en el
PLAN_TABLE.
• La orden DETERMINADA AUTOTRACE en el SQL*PLUS le faculta a mirar el
plan de ejecución y una variedad de estadísticas acerca de la ejecución
cuando quieras que ejecute una declaración de SQL.
Varios otras herramientas pueden usarse para monitorear desempeño,
alertándole para la necesidad para afinar declaraciones de SQL. Algunas de
estas herramientas estarán cubiertas en lecciones futuras.
Practica.
En esta práctica, debes crear una PLAN_TABLE, analizar una declaración de
SQL y formatear los resultados analizados, usando el escrito del rp.sql. También
usar el SQL*PLUS para aplicar el comando AUTOTRACE revisar planes de
ejecución.
Práctica 3
1. Verifique la existencia de una tabla de la _ PLAN_TABLE en su esquema.
Cree esta tabla cuándo Necesitado, usando el escrito del utlxplan.sql.
2. Explique la siguiente orden de SQL:
SQL> select first_name, last_name
2 from employees
3 where emp_id = 6191;
3. Ahora consulte la tabla PLAN_TABLE:
SQL> select * from plan_table;
Use el escript rp.sql para consultar la tabla PLAN_TABLE de una manera mas
sofisticada SQL> @rp
4. Habilite el AUTOTRACE para desplegar planes de ejecución y ejecute el
comando del paso 2 nuevamente.
5. Use el AUTOTRACE para suprimir la salida del comando y mostrar ambos
planes, de ejecución y estadísticas y ejecute el paso 2 nuevamente.
6. Si tienes algún tiempo, entonces introduce tus declaraciones de SQL y
experimenta con EXPLAIN PLAN y AUTOTRACE.
32
Oracle: Taller de Afinacion de Sentencias SQL
Los Objetivos
Puedes usar herramientas diversas de análisis para evaluar el desempeño de
declaraciones de SQL.
Después de completar esta lección, debes:
• Configurar Inicio de SQL para recoger estadísticas
• Establecer parámetros apropiados de inicialización
• Formatear las estadísticas de trace usando la utilidad TKPROF
• Interpretar la salida de comando TKPROF
33
Como usar el SQL Trace
1. Ajustar parámetros de iniciación
2. Conectar el trace
3. Correr la aplicación
4. Formatear el archivo de trace
5. Interpretar la salida.
Inicializando Parámetros
TIME_STATISTICS = { FALSE |TRUE}
MAX_DUMP_FILE_SIZE = {N | 500}
USER_DUMP_DEST = directory_path
• MAX_DUMP_FILE_SIZE es la medida de bloques de
sistema operativo
• Default USER_DUMP_DEST:
Destino donde genera el archivo
La iniciación Parámetros
Varios parámetros de iniciación guardan relación con SQL Trace.
TIMED_STATISTICS
La facilidad de SQL Trace provee una variedad de información acerca de los
procesos, opcionalmente incluyendo a cronometrar información. Si quieres
cronometrar información, entonces debes cambiar de dirección en este
parámetro. Puedes hacer eso para la base de datos entera ajustando el
34
Oracle: Taller de Afinacion de Sentencias SQL
Nota: Los valores subrayados en la diapositiva indican los valores predeterminados para
los parámetros.
MAX_DUMP_FILE_SIZE y USER_DUMP_DEST
Estos dos parámetros controlan el tamaño y el destino del archivo de salida:
MAX_DUMP_FILE_SIZE = n
USER_DUMP_DEST = directory_path
El MAX_DUMP_FILE_SIZE el valor por dafault es 500, y este valor de
parámetro es expresado en bloques de sistema operativo.
MAX_DUMP_FILE_SIZE también puede cambiarse en el nivel de sesión usando
el comando ALTER SESIÓN.
El default de USER_DUMP_DEST varia de acuerdo al sistema operativo;
Normalmente es el destino predeterminado para el sistema se desploma en su
sistema. USER_DUMP_DEST es un parámetro de nivel de sistema que no
puede variarse en el nivel de sesión. Sólo puede variarse dinámicamente por un
administrador de la base de datos usando lo ALTER SESIÓN.
Obtenga Información acerca de Parameter Settings
Puedes desplegar los valores actuales del parámetro en la vista de
V$PARÁMETER:
SQL> select name, value
2 from v$parameter
3 where name like '%dump%';
Nota: Las especificaciones del camino del directorio que aparecen en la columna de
VALUE manejan dependiente de sistema.
35
Prendiendo SQL trace
• Para una instancia, cambiar los parámetros sig.
SQL_TRACE = TRUE
• Para una sesión actual:
SQL> Alter Session Set Sql_Trace =True;
SQL> execute dbs_session.set:sql:trace (true);
• Para una sesión.
SQL>execute dams_system.set_sql_trace_in_session
2 (session_id, serial_id, true);
36
Oracle: Taller de Afinacion de Sentencias SQL
37
explain = user/password Conéctese a la base de datos y use EXPLAIN PLAN.
Print=integer Liste sólo las primeras declaraciones de SQL de
entero.
aggregate = no No agregue declaraciones idénticas de SQL en un
resultado.
Insert=filename Las declaraciones de SQL de la lista y los datos de
adentro INTERCALAN declaraciones.
Sys = no TKPROF no lista declaraciones de SQL dirigidas
como usuario SYS.
Record=filename Registre declaraciones poco recursivas encontradas
en el archivo de trace.
sort=option El set de cero o más de las siguientes opciones de
sorteo:
Las opciones:
prscnt El número de por PARSE fue llamado
prscpu El análisis gramatical de tiempo de procesador
prsela El análisis gramatical de tiempo transcurrido
prsdsk El número de disco lee durante PARSE
prsqry El número de buffers para coherente leído durante PARSE
prscu El número de buffers para corriente leyó durante PARSE
prsmis El número de perdidas en escondite de la biblioteca durante PARSE
execnt El número de EXECUTE fue llamado
execpu El tiempo de procesador pasado ejecutando
exeela El tiempo transcurrido ejecutando
exedsk El número de disco lee durante EXECUTE
exeqry El número de buffers para coherente leído durante EXECUTE
execu El número de buffers para corriente leyó durante EXECUTE
exerow El número de filas procesadas durante EXECUTE
exemis El número de escondite de la biblioteca extrañan durante EXECUTE
fchcnt El número de por la estratagema fue llamado
fchcpu El tiempo de procesador pasado yendo a traer
fchela El tiempo transcurrido yendo a traer
fchdsk El número de disco lee durante la estratagema
fchqry El número de buffers para coherente leído durante la estratagema
fchcu El número de buffers para corriente leyó durante la estratagema
fchrow El número de filas a traer
userid La identificación del usuario que analizó gramaticalmente el cursor
38
Oracle: Taller de Afinacion de Sentencias SQL
39
Nota: El valor PARSE incluye ambos duro y suave analiza gramaticalmente. Uno duro
analiza gramaticalmente manera a la que el núcleo Oracle realmente tiene analiza
gramaticalmente la declaración de SQL (incluyendo optimización); Se guarda
subsiguientemente en library cache. Uno suave analiza gramaticalmente manera que una
declaración de SQL es por la que se envió el análisis gramatical para el núcleo, pero el
núcleo encuentra él en library cache, y sólo las necesidades a verificar cosas les gustan
los derechos de acceso. Duro analiza gramaticalmente puede costar caro, en particular
debido a la optimización; Uno suave analiza gramaticalmente cuesta en su mayor parte
caro en términos de la actividad dlibrary cache.
Salida del comando TKPROF
Siete categorías de estadísticas para trace
Count Numero de veces que l procedimiento fue ejecutado
CPU Numero de segundo procesados
El aps ed TOTAL DE SEGUNDOS PARA EL EXECUTE
Disk Numero de bloques físicamente leídos
Query Numero de lecturas lógicas por lecturas consistentes
Current Number of logical buffers readin current mode
Rows Numero de filas procesadas para el fetoh o execute
La salida del comando TKPROF
Al lado de la columna de LLAMADA, TKPROF despliega las siguientes
estadísticas para cada declaración:
count Numero de veces que una declaración fue analizada gramaticalmente, (Cheque
esto La columna para los valores > 1 antes de interpretar las estadísticas en las
otras columnas A menos que el AGGREGATE = NO opción sea usado, los
agregados TKPROF las ejecuciones idénticas de declaración en una tabla
sumaria.)
CPU Totaliza tiempo de procesador en los segundos para todo PARSE, EXECUTE, o
FETCH
Elapsed Totalice tiempo transcurrido en los segundos para todo PARSE, EXECUTE, o
FETCH
Disk El número total de bloques de datos físicamente leen de los archivos de datos en
disco
Para todo PARSE, EXECUTE, o FETCH
Query Totalice número de buffers recuperados en el modo coherente para todo PARSE,
EXECUTE O las llamadas de estratagema (los Buffers son usualmente
recuperados en el modo coherente para consultas.)
Current Totalice número de buffers recuperados en el modo actual (los Buffers
típicamente son
Recuperado en el modo actual para las declaraciones de DML. Sin embargo, el
encabezado del segmento los bloques son siempre recuperados en el modo
actual.)
rows Totalice número de filas tratadas por la declaración de SQL (Este total no incluye
el número de filas regresadas por las subconsultas: Para las declaraciones del
SELECT el numero de filas regresadas por cada fetch. Para las declaraciones de
UPDATE, DELETE, INSERT el número de filas procesadas aparecen para el
execute
40
Oracle: Taller de Afinacion de Sentencias SQL
41
usó. Los indicios y los modos Optimizador se discuten en más detalle en la
"Influenciando al Optimizador".
Interpretación TKPROF
• Lectura consistencia trap
• Esquema a trap
• Tiempo trap
• Trigger trap
Lectura Consistente Trap
Algunas veces otras transacciones tienen cambios no comprometidos contra una
tabla. Esto aumenta el número de visitas del bloque, porque los bloques
adicionales deben estar construidos y visitados pues deben leer la consistencia.
El esquema Trap
Las estadísticas TKPROF muestran un número alto de visitas del bloque
mientras el plan de ejecución indica un acceso del índice. Especialmente si la
salida muestra un poco cero aprecie para corriente, entonces la tabla debe de
ser a la que se ganó acceso por una tabla llena repase con la vista (compare las
columnas actuales en las dos páginas previas). El índice debe de ser construido
después de que el archivo de trace sea producido, o las estadísticas de la tabla y
de la columna pueden ser recomputadas.
El tiempo Trap
Si una declaración particular de LENGUAJE DE MANIPULACIÓN DE DATOS
muestra a gran altura cronometrando estadísticas, entonces la explicación puede
ser interferencia de otra transacción manteniendo (compartidas) cerraduras
sobre el tapete. Por esto es el tiempo de procesador es un mejor señalizador que
el tiempo transcurrido.
El trigger Trap
Los recursos reportados para una declaración incluyen esos para todo el SQL
emitido mientras la declaración estaba siendo tratada. Por consiguiente, incluyen
cualquier recurso usado dentro de un trigger, junto con los recursos usados por
cualquier otro SQL recursivo (como el SQL usado para la fijación de espacio).
Resumen
En esta lección, tu deberás de haber aprendido como:
• Parámetros de inicialización de SQL trace
− SQL_TRACE, TIMED_STATISTICS
− USER_DUMP_DEST, MAX_DUMP_FILE_SIZE
• Conectar SQL Trace para una sesión
Alter session set sql_trace =tree
Dbms_session.set_sql_trace (
)
Dbms_system.set_sql_trace_in_session(
)
• Formatear archivos con TKPROF
• Interpretar la salida
43
Resumen
Esta lección le presentó para la facilidad de SQL Trace. Usando SQL Trace,
puedes evaluar el desempeño de declaraciones de SQL. Una vez que SQL
Trace es animado, mira planes de ejecución y estadísticas en el SQL que las
declaraciones generaron en un archivo de trace.
• Para usar SQL Trace:
• Identifique los parámetros apropiados de inicialización que quieres usar
• Activar el SQL Trace
• Formatee el ARCHIVO de trace que se generó por TKPROF utilizador
• Interprete la salida de TKPROF
Práctica
En esta práctica, veras y cambiaras los parámetros de inicialización que influyen
en el trace de declaraciones de SQL. Entonces SQL trace para analizar una
declaración de SQL. Los resultados del análisis escritos para un archivo de
trace. Encuentre el archivo de trace y use a TKPROF para formatear las
estadísticas. Interprete los resultados formateados de trace.
1. Compruebe los siguientes parámetros de inicialización:
− TIMED_STATISTICS
− MAX_DUMP_FILE_SIZE
− USER_DUMP_DEST
− SQL_TRACE
Asegúrese que ambos TIMED_STATISTICS y de SQL_TRACE está en TRUE
para su sesión. El SQL de vuelta * Y AUTOTRACE completamente.
2. EXECUTE la siguiente orden de SQL:
SQL> select first_name, last_name
2> from employees
3> where emp_id = 6191;
3. Ahora habilite el trace para su sesión y trate de encontrar su archivo de trace.
Abra el archivo de trace con un editor de texto del sistema operativo e
investigue los contenidos de su archivo de trace.
4. Inicie TKPROF sin argumentos en la línea de comando. TKPROF despliega
un mensaje de uso listando todas las opciones de líneas de comando.
5. Inicie a TKPROF otra vez, esta vez con el nombre de su archivo de trace
como un argumento. También especifique un nombre para el reporte de
salida TKPROF. Compruebe el resultado con editor de sistema operativo otra
vez, y vea cómo es la legibilidad mejorada.
6. Finalmente, inicie TKPROF de tal manera que la ejecución tenga pensado
agregar para el reporte y las declaraciones recursivas de SQL son
suprimidas.
44
Oracle: Taller de Afinacion de Sentencias SQL
Objetivos
Después de completar la lección podrás realizar los siguiente:
• Describir las funciones del Optimizador de Oracle8i
• Distinguir entre optimización basada en reglas(RBO) y costos(COB) .
• Identificar cuando usar RBO y CBO
• Identificar los factores que considera CBO
• Identificar e influenciar el comportamiento de RBO
• Asignar valores al Optimizador para una instancia y/o una sesión
Visión General
• Optimización basada en reglas
• (RBO)
• Optimización basada en costos (CBO)
• Ajustado el Optimizador
• Ordenación del esquema por rango
• Influenciando el RBO
Visión general
Hay caminos de métodos diversos y de acceso que pueden usarse para ejecutar
una declaración de SQL. Es el trabajo de Optimizador escoger cuáles para usar.
• La función RBO se decide basada en un conjunto de reglas.
• La función CBO basada esta elección en las estadísticas que sostiene acerca
de las tablas.
Esta lección da aclaraciones cómo se decide el Optimizador de Oracle entre
estos dos avances.
Para usar optimización basada en costos, deberías coleccionar estadísticas
acerca de las tablas involucradas. Esto está cubierto en una posterior lección. La
optimización basada en costos puede ser influenciada en varias formas
sofisticadas; Esto está también cubierto en una posterior lección.
Aunque se logra todavía usar optimización basada en reglas, no deberías usar
este método. Esta lección sale a la vista qué tan basado en reglas los usos de
optimización un esquema de mayor categoría a producir planes de ejecución.
también verás codificar técnicas que han sido populares en el pasado para
influenciar optimización basada en reglas.
Finalmente, esta lección detalla cuatro avances básicos del optimizador de
Oracle8i, lo cual puede estar lista en el ejemplo y el nivel de sesión.
45
Funciones del Optimizador de Oracle 8i
• Evalúa expresiones y condiciones
• Transforma declaraciones en declaraciones
equivalentes
• Decide como accesar el dato
• Decide como unir tablas
• Decide cual ruta es mas eficiente
46
Oracle: Taller de Afinacion de Sentencias SQL
47
• Cuando las estadísticas están disponibles pues al menos una puso notas al
objeto, la optimización basada en costos es usada;
• Cualquier estadísticas faltantes son estimadas o reemplazadas por valores
de códigos duro, incorporados.
Influenciando el comportamiento Predeterminado
Este comportamiento predeterminado puede ser influenciado por ejemplo,
para obtener a la fuerza optimización basada en reglas bajo todas las
condiciones en tres niveles diferentes:
• El nivel de ejemplo
• El nivel de sesión
• El nivel de declaración
.Nota: Si cualquier tabla para la que se estableció referencias en una consulta tiene un
grado de paralelismo más que 1, CBO siempre será usada a pesar de cualquier indicios
o escenarios. También asegúrate que tiene estadísticas de la tabla, las estadísticas de la
columna, de otra forma recolección, pues una tabla no resultarán en la optimización
basada en costos.
Activando el Optimizador
• A nivel instancia, Actualice el parámetro:
OPTIMIZER_MODE =
{CHOOSE| RUEL|FIRST|_ROWS|ALL_ROWS}
• Para una sesión use el siguiente comando de
SQL;
SQL>alter session set optimizer_moce
{choose| ruel|first|_rows|all_rows}
49
Ordenando el Esquema RBO
La optimización basada en reglas ejerce reglas basadas en la sintaxis de
declaración para establecer el camino de acceso.
El Optimizador determina todos los caminos disponibles de acceso para una
declaración y entonces escoge el camino con el número mínimo de ordenación
por rango del esquema de mayor categoría exhibido arriba.
Este acercamiento siempre asume ese una tabla llena repase con la vista (rango
15) es el peor método de acceso. Éste realmente no podría ser el caso,
especialmente con tablas pequeñas o con consultas que devuelven un
porcentaje grande de las filas en una tabla.
Estos (y más) caminos de acceso están disponibles a la optimización basada en
costos. Sin embargo, el Optimizador ignora las ordenaciones por rango y
determina que el esperado costo pues cada camino posible de acceso, entonces
escoge el que está con el costo estimado menor. Muchas características nuevas
(hash joins, consultas, histogramas, y tablas organizadas en índice) están
disponibles a través de la optimización basada en costos.
Nota: Para más información acerca de las rutas de acceso de RBO, vea a Oracle8i
Afinando y Oracle8i Concepts: "El Optimaizer".
Ejemplo de optimización basada en reglas
SQL> select las_name
2 From employees
3. Where job= INSTRUCTOR
4. And salary between 3000 abd 6000
5. Order by last_name;
RBO tiene las siguientes rutas de acceso:
• Búsqueda en toda la tabla Rank= 15
• ORDER BY sobre columna indexada Rank =14
• Job índice igual(range) scan Rank=9
• Indice desalary por búsqueda definida de rango Rank=10
50
Oracle: Taller de Afinacion de Sentencias SQL
Resumen
Esta lección introdujo la optimización basada en reglas y basada en costos. La
optimización basada en reglas es todavía respaldada para la compatibilidad
retrasada. Has visto cómo usa RBO en un esquema de mayor categoría, y cómo
puede influenciar su comportamiento.
51
La optimización basada en costos fue introducida en Oracle7. El Optimizador usa
estadísticas para calcular el costo de caminos de acceso, teniendo en cuenta el
número del uso de entrada/salidas lógicas, de la CPU, y red tráfico.
También aprendiste cómo puede ser el acercamiento del Optimizador
determinado en el ejemplo y el nivel de sesión, soportando cuatro escenarios
diferentes:
CHOOSE Juzgue El comportamiento: CBO cuando las estadísticas están
disponibles, RBO cuando no.
RULE Obtiene a la fuerza comportamiento de RBO
FIRS ROWS El tiempo de respuesta DEL optimizador para el primer resultado
ALL_ROWS El rendimiento específico global del optimizador
Practica:
En esta práctica, deberás analizar planes de ejecución usando RBO. Después
de cambiar su sesión para usar al CBO, generaras planes nuevos de ejecución
y examinaras los resultados.
Práctica 5 (optativo)
1. Use el ALTER SESSION para obligar su sesión a usar el modo del
Optimizador de REGLA.
Habilite SQL*PLUS AUTOTRACE para desplegar planes de ejecución y analizar
la declaración de SQL enseñado debajo.
SQL> select e.last_name
2 e.first_name
3 r.status
4 from employees e
5 registrations r
6 where e.emp_id = r.stud_id
7 and r.class_id = 55999;
Analice la declaración de SQL demostrada de debajo para ver cuál modo del
Optimizador es
usado.
SQL> select *
2 from cls_statuses
3 where cls_status = 'BOOK';
Use el ALTER SESSION para obligar a su sesión a usar el modo del
Optimizador CHOOSE. recuerde quitar SQL*PLUS Y AUTOTRACE antes de
usar el comando ALTER SESSION.
Habilite SQL*PLUS AUTOTRACE. Reejecute la consulta del paso 2 y examine
los resultados. ¿Los resultados son diferentes? Explique por que.
52
Oracle: Taller de Afinacion de Sentencias SQL
Objetivos
Después de completar esta lección, deberás poder hacer lo siguiente:
• Identifica a Oracle8i ROWIDs
• Identifica sorteos de índice
• Muestra la relación entre índices y las restricciones
• Crea índices manualmente
• Identifica asuntos del índice con llaves foráneas
• Identifica métodos de acceso básicos
Oracle 8i ROWIDs
• ROWIDs indican la dirección de la fila
• ROWIDs extendidos y restringidos están disponibles
• Cada Tabla tienen una pseudocolumna ROWID,
SQL> selecat rowid, rs.*
2 from reg_statuses rs;
ROWID REG DESCRIPTION
-------------------------------- --------------- ---------------------
AAABDlAACAAAFOZAAA CANC Canceled
AAABDlAACAAAFOZAAB HOLD Hold
AAABDlAACAAAFOZAAC PEND Pending
AAABDlAACAAAFOZAAD REGI Registered
AAABDlAACAAAFOZAAE WAIT Waitlisted
Oracle8i ROWIDs
El Oracle usa ROWIDs almacenar direcciones de filas de la tabla, como adentro
índices. El formato extendido ROWID se introdujo con las capacidades nuevas
de partición de discos de Oracle 8.0. Un tipo restringido de datos ROWID está
todavía disponible para la compatibilidad retrasada. El Oracle todavía usa
ROWIDs restringidos internamente, cuándo el formato extendido no son
necesarios.
Cada tabla Oracle tiene un pseudocolumnas denominado ROWID. Los ROWIDs
no se guardan en la base de datos. Sin embargo, tu puede crear que las tablas
que contienen columnas teniendo los datos ROWID mecanografían, aunque
Oracle no garantiza que los valores de tales columnas sean ROWIDs válidos.
El ROWID extendido tiene un formato de cuatro pedazos, usando una técnica
que codifica base-64. En el ejemplo arriba, éstos son los campos y su
significado:
AAAABDL Numero del objeto, Identifica el segmento de la BD
AAC Numero relativo del archivo, único dentro del tablespace
AAAF0Z Numero del bloque, Dentro del datafile
AAA-AAE Numero de registros en el bloque
53
ROWID Manipulación
Tu puede usar el paquete de DBMS_ROWID extraer información de un ROWID
extendido o convertir a un ROWID de formato extendido a restringido el formato
(o viceversa).
Indices Oracle 8i
• Indice Unique y nonunique
• Indices compuestos
• Técnicas de almacenamiento índices:
− B*-tree Descending
− Bitmap Function bases
− Reverse key Domain index,
Indices Oracle8i.
Un índice es un objeto de la base de datos que es lógicamente y físicamente
independiente de los datos de la tabla. El Oracle8i Server puede usar un índice
ganar acceso a los datos requeridos por una declaración de SQL, o usar índices
implementar restricciones de integridad. Tu puede crear y puede dejar caer
índices en cualquier momento. El Oracle8i Server automáticamente mantiene
índices cuando los cambios relatados de datos.
Sorteos de índices
Los índices pueden ser únicos o no únicos. Los únicos garantizan que no existan
dos entradas que tengan el mismo valor. Un índice compuesto (también llamado
uno índice concatenado) es un índice que tu crea en columnas múltiples en una
tabla (hasta 32). Las columnas en un índice compuesto no pueden aparecer en
cualquier orden, y necesita sea adyacente en la tabla.
Las técnicas de Almacenamiento del índice
Para índices estándar, Oracle usa a B*tree que son simétricos para igualar
tiempos de acceso.
Los exponentes Bitmap se discuten en el "Indexes adelantado" lección.
Los índices cruciales inversos ponen al revés los bytes de los valores de la
columna. Tienen prestaciones cuando son usados para los valores de
monotonically-increase que puedan conducir a sesgado los índices en los cuales
los valores mayores son descartados sobre el tiempo.
Los índices basados en funciones están también cubiertos en los lección "Índices
adelantados".
Los índices de dominio son índices específicos en la aplicación. Son creados,
manejados, y ganados acceso as por las rutinas suministrados por un tipo del
índice.
54
Oracle: Taller de Afinacion de Sentencias SQL
Indices B*.Tree
55
No hay entradas del índice para filas que tienen todas las columnas cruciales
conteniendo valores NULOS.
Pues las tablas poco subdivididas, los ROWIDs restringidos se usan para
apuntar hacia las filas de la tabla, porque todas las filas forman parte del mismo
segmento.
56
Oracle: Taller de Afinacion de Sentencias SQL
57
SQL> select * from index_stats;La primera orden puebla las dos vistas que se
puso en duda por las últimas dos órdenes. La primera vista da información
acerca de la selectividad del índice (cardinality de valores cruciales), y la
segunda vista le puede contar la altura sobre la B * - el árbol, el número de
bloques, el número de valores cruciales distintos, y el número de hoja bloqueen
entradas.
Declaración ALTER INDEX
Tu puede usar la declaración ALTER INDEX para cambiar una definición del
índice, o reconstruir un índice existente..
Indices y Restricciones
El servidor Oracle 8i Implícitamente crea o usa Indices
B*_tree cuando tu defines lo sig:
Restricciones de llave primaria
Restricciones Unicas
SQL> CREATE ATABLE REG_STATUSES
{REG_STATUS VARCHAR2(4)
CONSTGRAINT REG_STATUS_pk PRIMARY KEY
,DESCRIPTION VARCHAR2 {40}
};
Los índices y Restricciones
58
Oracle: Taller de Afinacion de Sentencias SQL
59
• Las columnas apuntadas para por la llave foránea están actualizadas en la
tabla del padre
Por esta razón, tu deberás indexar columnas foráneas, aun si no son
normalmente usadas en las condiciones del join y cláusula WHERE.
60
Oracle: Taller de Afinacion de Sentencias SQL
Resumen
Esta lección te introduce al concepto de índices. Un índice es un objeto de la
base de datos que es lógicamente y físicamente independiente de los datos de la
mesa. El Oracle8i Server puede usar un índice ganar acceso a los datos
requeridos por una declaración de SQL, o usar índices implementar restricciones
de integridad.
Hay diferentes sorteos de índices. Para índices estándar, Oracle usa a B*tree
que son simétricos para igualar tiempos de acceso. Tu puedes crear un índice
manualmente usando la sintaxis CREATE INDEX, o automáticamente creando
restricciones únicas o primarias y cruciales en mesas.
Los índices pueden afectar desempeño. Hay métodos diferentes para buscar en
toda la tabla, índice para búsqueda en toda la tabla, y el índice rápido para
búsqueda en toda la tabla. El índice de búsqueda en toda la tabla puede mejorar
el desempeño de muchas declaraciones de SQL.
61
7 Coleccionando Estadísticas
Objetivos
• Usa el comando ANALYZE para proveer el Optimizador basado en costos
Oracle8i de estadísticas.
• Identifica tabla, índice, columna, y estadísticas de grupo. Mira estas
estadísticas en las vistas de diccionario de datos Oracle8i.
• Usa el paquete de DBMS_STATS coleccionar y manejar estadísticas del
Optimizador.
• Identifica cálculos de selectividad de predicado, asumiendo aun
distribución de datos. Identifica las consecuencias de variables
utilizadoras de vinculación para la selectividad de predicado.
• Crea histogramas para columnas con datos sesgados.
• Escoge valores apropiados para:
- Un tamaño de muestra (al usar la opción de ESTÍMATE de lo ANALICE
orden)
- El número de cubos del histograma
El Comando Analyze
El comando ANALYZE
Tu puedes coleccionar estadísticas en un objeto con lo ANALYZEN . Aunque el
Optimizador no es sensitivo para los cambios menores en el volumen o la
selectividad, tu puedes querer coleccionar estadísticas nuevas periódicamente
adelante frecuentemente modificó tablas para asegurar que el Optimizador usa
información reciente, exacta.
Usando el ANALYZE para coleccionar estadísticas nuevas sobreescribe
cualquier estadísticas existentes en el diccionario de datos y purga cualquier
planes relatados de ejecución de la piscina compartida.
El paquete de DBMS_DDL contiene un procedimiento llamado
ANALYZE_OBJETO que permite un índice, tabla, o grupo ser analizado. El
paquete de DBMS_DDL contiene un procedimiento llamado
62
Oracle: Taller de Afinacion de Sentencias SQL
63
Marca de Agua Alta
Cada tabla mantiene una señal del nivel del agua alta en el bloque de inicio del
segmento. La señal del nivel del agua alta indica el último escollo que sirvió
alguna vez para la tabla. Cuando el servidor Oracle realiza una repaso en toda la
tabla, lee cuidadosamente todos los bloques a la señal del nivel del agua alta.
Noto que la señal del nivel del agua alta no es vuelta a arrancar cuando las filas
son suprimidas de la tabla; La señal del nivel del agua alta termina al usar la
orden TRÚNCATE.
Tu también puede usar el procedimiento de DBMS_SPACE.UNUSED_SPACE
para encontrar la señal del nivel del agua alta y el número de bloques por encima
de la señal del nivel del agua alta, si analizar una tabla es imposible o
indeseable.
Vistas del diccionario de datos ALL_TABLE y DBA_TABLE.
Las estadísticas de la tabla son almacenadas en el diccionario de datos. Pueden
ser exhibidas consultando las tablas ALL_TABLE y DBA_TABLE.
Name Null? Type
---------------- - -------- ---------------
TABLE_NAME NOT NULL VARCHAR2(30)
TABLESPACE_NAME VARCHAR2(30)
NUM_ROWS NUMBER
BLOCKS NUMBER
EMPTY_BLOCKS NUMBER
AVG_SPACE NUMBER
CHAIN_CNT NUMBER
AVG_ROW_LEN NUMBER
SAMPLE_SIZE NUMBER
LAST_ANALYZED DATE
...Ejemplo:
SQL> analyze table employees
2 estimate statistics for table; SQL> select num_rows,blocks,empty_blocks
2 ,avg_space,avg_row_len
3 ,sample_size
4 from user_tables
5 where table_name = 'EMPLOYEES';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN SAMPLE_SIZE
5132 434 5 225 48 1064
Estadísticas de Índice
• Nivel de índice (siempre exacto)
• Numero de bloque hojas
• Numero de llaves distintas
• Porcentaje de numero bloques hojas por llave
• Porcentaje de numero bloques de datos por llave
• Numero de entradas de índice
• Factor clustering
• Ultima fecha de ANALYZE y tamaño del ejemplo
Estadísticas de Índice.
64
Oracle: Taller de Afinacion de Sentencias SQL
Estadísticas de Columna
• Numero de valores distintos
• Valor mas bajo
• Valor mas alto
• Ultima fecha de ANALYZE y tamaño del
ejemplo
• Vistas del diccionario de datos:
USER_TAB_COL:STATISTICS,
ALL_TAB_COL_STATISTICS
Estadísticas de la columna:
Éstas son las estadísticas de la columna coleccionadas por el comando
ANALYZE:
El número de valores distintos
El valor mínimo
El valor más alto
El último ANALYZE y tamaño
Ambos el valor bajo y el más alto son almacenados en formato CRUDO (binario);
Las vistas del diccionario de datos USER/ALL_TAB_COL_STATISTICS
Name Null? Type
TABLE_NAME NOT NULL VARCHAR2(30)
COLUMN_NAME NOT NULL VARCHAR2(30)
NUM_DISTINCT NUMBER
LOW_VALUE RAW(32)
HIGH_VALUE RAW(32)
DENSITY NUMBER
NUM_NULLS NUMBER
NUM_BUCKETS NUMBER
66
Oracle: Taller de Afinacion de Sentencias SQL
LAST_ANALYZED DATE
SAMPLE_SIZE NUMBER
GLOBAL_STATS VARCHAR2(3)
USER_STATS VARCHAR2(3)
AVG_COL_LEN NUMBER
Nota: Para la compatibilidad retrasada con Oracle7, las vistas de diccionario de datos
del USER/ALL TAB_COLUMN también muestran valores de estadística de la columna.
También, la columna NUM_BUCKET sale a la vista que las estadísticas regulares de la
columna son tratadas como un histograma con un cubo. Los histogramas están discutidos
más tarde en esta lección.
El ejemplo
SQL> select column_name, num_distinct
2 , low_value, high_value
3 , num_nulls, num_buckets
4 from user_tab_col_statistics
5 where table_name = 'EMPLOYEES';
NUM NUM NUM
COLUMN_NAME DISTINCT LOW_VALUE HIGH_VALUE NULLS BUCKETS
EMP_ID 15132 C2191A C403013E05 0 1
MGR_ID 1167 C21361 C403013D07 0 1
LAST_NAME 4383 4162626F7474 5A696D6D6572 0 1
FIRST_NAME 445 416B73686169 5A6875736869 107 1
HIREDATE 535 77980217010101 77C6050B010101 0 1
JOB 24 4141 54454348 36 1
SALARY 496 C208 C30A62 0 1
Estadísticas de Cluster
• Porcentaje de longitud de llave cluster
encadenada
• Vistas del diccionario de datos :
USER_CLUSTERS,ALL_CLUSTERS
Estadísticas de cluster.
La única estadística que es específica para clusters es el largo común de la
cadena de la llave de grupo. Por supuesto, cualquier tabla que es parte de un
grupo tiene sus propias estadísticas regulares del table/index/column.
Para acceder a una file en una tabla cluster, el Oracle8i Server lee todos los
bloques conteniendo filas con ese valor. Si estas filas ocupan, entonces el
múltiplo se bloquea, ganar acceso a una sola fila podría requerir más lean que
ganando acceso a la misma fila en una tabla no apelotonada.
Las vistas del diccionario de datos USER_CLUSTERS Y ALL_CLUSTERS :
Éstas son las definiciones pertinentes de la columna de diccionario de datos para
estadísticas de grupo:
67
Name Null? Type
CLUSTER_NAME NOT NULL VARCHAR2(30)
AVG_BLOCKS_PER_KEY NUMBER
...
El paquete DBMS_STATS
El paquete DBMS_STATS
El paquete DBMS_STATS.
Tu puedes usar el paquete DBMS_STATS para generar y manejar estadísticas
para la optimización basada en costos. Las estadísticas pueden radicar en el
diccionario de datos o en una tabla creada en el esquema del usuario. Sólo las
estadísticas son almacenadas en el impacto del Optimizador basado en costos.
Los procedimientos en el paquete pueden estar divididos en tres funciones
principales:
• Asignar o obtener estadísticas individuales
• Transferir estadísticas entre el diccionario de datos y las tablas del usuario
• Recoger ciertas clases de estadísticas del Optimizador
DBMS_STATS:Generando Estadísticas
Dbms_stats, GATHER_TABLE_STATS
{SST --schema
´CLASSES --table
´NULL --partition
´20 --sample size(%)
´FALSE --block sample?
´FOR ALL COLUMNS --column spec
´4 --degree off //
´DEFAULT --granularity
´TRUE --cascade to indexes
);
68
Oracle: Taller de Afinacion de Sentencias SQL
Procedimientos DBMS_STATS
Use los siguientes procedimientos recoger estadísticas en índices, tablas,
columnas, y particiones:
Procedimiento Descripción
GATHER_ INDEX_STATS Colecciona estadísticas de índices
GATHER_TABLE_STATS Colecciona estadísticas de tablas, columnas e
índices
GATHER_SCHEMA_STATS Colecciona estadísticas de todos los objetos
en el esquema
GATHER_DATABASE_STATS Colecciona estadísticas de todos los objetos
de la BD
DBMS_STATS no recoge estadísticas de grupo, pero tu lo puede usar para
recoger estadísticas en las tablas individuales en el grupo. Otras opciones para
recoger estadísticas con DBMS_STATS incluyen lo siguiente:
• Colecciona estadísticas ya sea en serie o en el paralelo. . Las estadísticas del
índice están sólo reunidas en serie.
• El cómputo o las estimaciones de estadísticas; Usa ejemplo de bloques o de
registros para estimar estadísticas.
• Especifique las columnas para las cuales las estadísticas son necesarias con
GATHER_TABLE_STATS.
• Use la opción de CASCADE para coleccionar estadísticas del índice cuando
generen estadísticas de tablas.
• Sostenga estadísticas en tablas de estadísticas para experimentar con
diferentes sets de estadísticas.
70
Oracle: Taller de Afinacion de Sentencias SQL
71
Predicando la Selectividad
El esperado porcentaje de filas (la selectividad) depende del tipo de operación
realizada en la cláusula WHERE. . El acercamiento basado en costos es más
probable para escoger un camino de acceso del índice para una consulta con
buena selectividad. . El Oracle8i Optimizador usa las siguientes reglas cuando
calcula selectividad.
La igualdad en condiciones
La llave única o primaria = constante
Éste es un predicado de la sola fila, devolviendo un máximo de la fila; ; Tiene
selectividad máxima.
El índice Nounica = constante
La consulta puede devolver más que una fila, así es que el Optimizador usa el
número de valores cruciales distintos en la columna. . La selectividad es 1
dividida por el número de valores distintos.
Rangos definidos e ilimitados
Los rangos definidos e ilimitados necesitan estadísticas para calcular
selectividad, así CBO y RBO producen resultados diferentes. . El RBO debe
confiar en la sintaxis y su esquema de mayor categoría; ; El CBO usa la
siguiente fórmula:
72
Oracle: Taller de Afinacion de Sentencias SQL
El desempeño
Si el desempeño es un asunto, entonces considere usar SQL dinámico basado
en declaraciones con valores literales en lugar de las variables de vinculación. .
Esto quiere decir que cada declaración será optimizada separadamente (dando
desempeño óptimo). . Sin embargo, hay una desventaja grande: : Porque las
declaraciones de SQL más dinámicas son diferentes al uno al otro, tu tendrá
menos beneficio de SQL compartido.
Tu puede enviar a SQL dinámico (esto es, las declaraciones de SQL que se
forjan durante la corrida) al Oracle8i Server usando el paquete de DBMS_SQL, o
usando la declaración EXECUTE INMEDIATE.
Histograma
Los Histogramas
El Optimizador debe estimar el número de filas tratadas por una consulta dada. .
Esto es logrado en parte, estimando las selectividad de predicados de la
consulta. . La exactitud de estas estimaciones depende del conocimiento de
Optimizador de la distribución de datos. . Sin histogramas, una distribución
pareja está asumida.
Los sorteos de Histogramas
La partición balanceada en anchura de histogramas el dominio de atributo en los
rangos iguales de anchura, llamados cubos, y la cuenta el número de filas, el
valor de cada columna hace que caiga dentro de cada cubo. Si varias filas
contienen el mismo valor, todos ellos son puestas en el mismo cubo,
aumentando la altura de ese cubo.
En histogramas de alturas equilibradas, cada cubo tiene (casi) el número del
mismo de filas. . Si varias filas contienen el mismo valor, pueden ser metidas en
el mismo cubo o la colcha a través de varios cubos, como el histograma
balancee las alturas de los cubos. . Algunos cubos informan acerca de único o
algunos valores, porque hay muchas filas con esos valores. Algunos cubos
informan acerca de muchos valores, porque hay pocas filas con esos valores.
73
Los histogramas de alturas equilibradas son más adecuados para estimaciones
de selectividad de cómputo y son usados por el Oracle8i Server.
Histogramas Y Selectividad
Valores populares y no populares (NP)
DENSITY estadística de columna
74
Oracle: Taller de Afinacion de Sentencias SQL
75
Cuando Usar Histogramas
• Use histogramas para una columna cuando los datos
estén altamente segados
• Evite usar histogramas cuando:
− La columna no es usada en una cláusula WHERE
− La columna es única y usado solo con predicados
de igualdad
− Todos los predicados sobre la columna usa variable
tipo brind
− El dato de la columna es distribuido en forma
uniforme
Cuando usar Histogramas
Los histogramas cuestan caro para almacenar; Por consiguiente, úselos sólo
cuando sustancialmente mejoren desempeño. . Los histogramas deberán ser
usados cuando los datos tenga un grado de alto de desalineamiento, con
algunos valores aconteciendo mucho más a menudo que otros.
• Los histogramas no deberán ser usados cuando:
• La columna no es usada en la cláusula WHERE de consultas
• La columna es única y es usada sólo con consultas de igualdad
• Todos los predicados en el uso de la columna convalidan variables
• Los datos de la columna son uniformemente distribuidos
Eligiendo un tamaño de muestra
• Si el dato es distribuido en uniforme de, 5% de las filas
puede ser suficiente.
• Elige un ejemplo en el que el numero de valores distintos
es mas que 10% de le numero de filas.
• Cuando use histogramas el numero de filas ejemplificadas
debe ser mínimo 100 veces del numero de buckets.
76
Oracle: Taller de Afinacion de Sentencias SQL
77
Tu tiene 75 cubos, incluyendo un cubo especial de cero a almacenar el valor
mínimo (50008) de CLASE_ID. El último cubo tiene 155801 como el valor del
punto final, lo cual es el valor máximo de CLASE_ID. Este histograma no tiene
valores populares, porque la CLASE_ID es la llave primaria de la tabla de
CLASSES.
Nota: Si un histograma tiene valores populares, entonces aparecen como "las aberturas"
en el punto final de numero de columna. Los cubos múltiples con el mismo valor del
punto final se guardan en el diccionario de datos como una sola fila, para preservar
espacio.
Resumen
Esta lección le presentó como usar la tabla de estadísticas con el Optimizador
basado en costos. Para Usar el comando ANALYZE o el paquete
DBMS_STATS, tu puede coleccionar estadísticas en sus tablas que son usadas
por el Optimizador basado en costos en el que determinar rutas óptimas de
ejecución para las declaraciones de SQL de las tablas analizadas.
La selectividad, el esperado porcentaje de filas devueltas, depende del tipo de
operación realizada en la cláusula WHERE. . El acercamiento basado en costos
es más probable para escoger un camino de acceso del índice para una consulta
con buena selectividad. . La selectividad es influenciada por distribución de
datos. . Cuando las variables de vinculación sean usadas en una declaración de
SQL, el Optimizador debe usar una selectividad predeterminada incorporada.
Estos valores incorporados no pueden ser influenciados.
El Oracle puede usar un histograma decidirse de todos modos usar el índice. .
Un histograma almacena información acerca de la frecuencia de valores diversos
de la columna. . Sin histogramas, una distribución pareja está asumida. Cree
histogramas para columnas con datos sesgados.
Práctica
En esta práctica, tu debes generar estadísticas de la tabla REGISTRATIONS .
Porque la columna de STATUS de la tabla de REGISTRATIONS es buen
candidato para un histograma, tu crea un histograma para esa columna. Calcula
la selectividad de un cierto predicado en la columna, antes y después de crear el
histograma. Entonces tu consulta el diccionario de datos para el último
ANALYZE, la fecha y tamaño. Finalmente, suprime las estadísticas en la tabla de
REGISTRATIONS del diccionario de datos.
Práctica 7
1.Apaga el SQL*Plus Autotrace.
Compute estadísticas para la tabla de REGISTRATIONS y ve las estadísticas
de la tabla y de la s columnas con apropiadas declaraciones de select.
2.¿Por qué es buen candidato la columna de STATUS de la tabla de
INSCRIPCIONES para crear un histograma?
Recupere los (distintos) valores de STATUS y su cardinalidad.
78
Oracle: Taller de Afinacion de Sentencias SQL
79
8 Influenciando al Optimizador
Objetivos
Después de completar esta lección, tu deberás poder:
• Influenciar el comportamiento del Optimizador Oracle8i en los siguientes
niveles:
- El nivel de ejemplo, ajustando parámetros de inicialización
- El nivel de sesión, usando lo ALTER orden de SESIÓN
- El nivel de declaración, usando hints
• Especifique las rutas de acceso para los hints
• Especifique hints adelante y adentro vistas
80
Oracle: Taller de Afinacion de Sentencias SQL
Parámetros Adicionales
• OPTIMIZER_FEATURES_ENABLE
− Defaults para 8.0.0
− Poner para la versión actual las ultimas
características de optimizador.
• OPTIMIZER_INDEX_COST_ADJ
Algunos Parámetros Adicionales
Tu puede usar OPTIMIZADOR_FEATURES_ENABLE para cambiar un set de
parámetros de inicialización que controlan el comportamiento de optimizador. El
valor predeterminado es 8.0.0; Otros valores son, por ejemplo, 8.0.3, 8.0.4, 8.1.3,
y 8.1.5. Tu puede usar este parámetro para prevenir el comportamiento
inesperado del optimizador al emigrar para una versión más alta.
Tu puede usar OPTIMIZADOR_INDEX_COST_ADJ para afinar el
comportamiento del optimizador para la selección del camino de acceso para ser
que se indexa amistosamente. Este parámetro le faculta a ajustar el costeo de
caminos de acceso del índice en el optimizador basado en costos y por
consiguiente hacer el optimizador propenso seleccionando un camino de acceso
del índice sobre una búsqueda en toda la tabla .
El incumplimiento para este parámetro es 100 por ciento, lo cual hace al
optimizador estimar caminos de acceso del índice en el costo regular. Cualquier
otro valor hará al optimizador estimar el camino de acceso en el porcentaje del
costo regular. Por ejemplo, colocando eso para 50 por ciento hará el índice
ganar acceso para que el camino parezca tan caro como normal.
El rango de valores legal para este parámetro es 1 a 10,000 por ciento. Tu puede
usar este parámetro para afinar el desempeño de un sistema donde se ve que el
optimizador hace una elección también pocos o demasiadas rutas de acceso
para los índices.
Sintaxis del hint del Optimizador
81
Por ejemplo, los siguientes hints meten a la fuerza las tablas la cláusula FROM
para ser adjuntó dejado bien:
select /*+ORDERED */ ...
select /*+ ORDERED */ ...El siguiente intento es tratado como un
comentario normal por el espacio que interviene
select /* +ORDERED */ ...El Oracle8i Server ignora hints especificados
incorrectamente. Sin embargo, desee cuenta de lo siguiente:
• Tu nunca obtendrás un mensaje de error.
• Otros (correctamente) hints especificados dentro del mismo comentario son
considerados.
• Las combinaciones de hints conflictivos están también ignoradas por el
Oracle8i Server.
82
Oracle: Taller de Afinacion de Sentencias SQL
Recomendaciones de Hints
• Use hints como ultimo recurso, porque implica una
carga alta de mantenimiento.
• Desee cuenta del impacto de desempeño ofhard-
coded hints cuando sea menos validos
Recomendaciones de hints
Use hints como un último remedio al afinar declaraciones de SQL. Sea
consciente que el optimizador no puede cambiar planes de ejecución, aun
cuando mejores alternativas pueden disponibles.
Los hints pueden ponerse menos válidos (o aun el inválido) cuando la
construcción de la base de datos o los contenidos cambien.
Nota: Tenga cuidado que todos los hints, excepto el hint de RULE, forza la optimización
basada en costos independientemente de su modo del optimizador acometiendo contra la
sesión o el nivel de instancia.
83
Las Categorías de Hints
• Los hints para modo de optimización
• Los hints para métodos de rutas de acceso
• Los hints para Ejecución en paralelo
• Los hints para Join Ordenados y Operaciones
Hints Descripción
FULL(t) Realiza el acceso a toda la tabla
ROWID(t) Accesa la tabla por medio de ROWID
INDEX(t[idx]...) Repasa con un índice en el orden ascendente
INDEX_ASC(t[idx]...) Repasa con un índice en el orden ascendente
INDEX_ASC(t[idx]...) Repasa con un índice en el orden descendente
AND_EQUAL Mancomuna índices de la sola columna
INDEX_FFS(t[idx]...) Rendimiento búsqueda de la tabla por índice
NO_INDEX(t[idx]...) Prohibe usar un set de índices
Nota: El NO_INDEX hint es útil si tu usa optimización distribuida de consulta. Tiene
aplicación funciones basadas B*TREE , bitmap, cluster e índices de dominio. Si este hint
no especifica cualquier nombre de índice , entonces el optimizador no considerará un
repaso sobre un indice y/o de la tabla.
84
Oracle: Taller de Afinacion de Sentencias SQL
Hints y Vistas
• No usar hints en vistas
• Técnicas de optimización en vistas
− Transformación de declaración
− Acceso a los resultados de una vista como una
tabla
• Hints y vistas fusionadas
• Hints y vistas no fusionadas
Hints y Vistas
Tu no deberás usar hints interiores o en vistas. Esto es porque las vistas pueden
estar definidas en un contexto y pueden ser usado en otro; Tales hints pueden
resultar en planes inesperados. En particular, los hints dentro de vistas o en
vistas son manipulados diferentes, o la vista no es fusionable en la consulta del
más alto nivel.
85
Optimización de la vista
Para optimizar una declaración que accese a una vista, el optimizador tiene dos
alternativas. Normalmente la declaración es transformada en una declaración
equivalente que accesa la tabla que es base de la vista. El optimizador puede
usar una de estas técnicas transformar la declaración:
• Anexar la consulta de la vista en el bloque de consulta que establece
referencias para la declaración de acceso.
• Empuje el predicado del bloque de consulta que establece referencias para
dentro de la vista
Cuando estas transformaciones son imposibles, la consulta de la vista es
ejecutada y el resultado acceso es a como si fuera una tabla. Esto aparece como
un paso de la VISTA en los planes de ejecución.
Fusión de vistas
El optimizador puede anexar una vista en un bloque de consulta previendo la
definición de la vista no debe contener lo siguiente:
• Operadores (UNION, UNION ALL, INTERSECT, MINUS)
• Clausula A CONNECT BY
• La seudocolumna ROWNUM
• Funciones de grupo (AVG, COUNT, MAX, MIN, SUM) en la lista del select
Los hints y Vistas Fusionables
El acercamiento de optimización y los hints pueden ocurrir en una consulta del
más alto nivel o dentro de vistas:
• Si hay un hint en la consulta del más alto nivel, el hint es usado a pesar de
cualquier otro que ser encuentre dentro de las vistas.
• Si no hay optimizador-modo del más alto nivel , entonces los hints de modo
en vistas para las que se estableció referencias son usado mientras todos
los hints de modo en las vistas sean coherentes.
• Si dos o más hints de modo en las vistas para las que se estableció
referencias están en conflicto, entonces todos los hints de modo en las vistas
son descartados y el modo de sesión es usado, ya sea el default o
especificado por usuario.
El método de acceso y los hints del join en vistas para las que se estableció
referencias son ignorados a menos que la vista contenga una sola tabla (o las
referencias otra vista con una sola tabla). Para tales vistas una sola tabla, un hint
de método de acceso o un hint del join en la vista aplica para la tabla dentro de
la vista.
El método de acceso y los hints del join también pueden aparecer en una
definición de la vista:
• Si la vista es una subconsulta (esto es, si aparece en la cláusula FROM de
una declaración SELECT), entonces todo método de acceso e hints del join
dentro de la vista son preservados cuando la vista es anexada con la
consulta del más alto nivel.
86
Oracle: Taller de Afinacion de Sentencias SQL
• Para vistas que no son subconsultas, de métodos de acceso y los hints del
join en la vista son preservados sólo si la consulta del más alto nivel no pone
notas a otras tablas u otras vistas (esto es, si la cláusula FROM de la
declaración SELECT contiene sólo la vista).
Los hints y Vistas no fusionables
Con vistas poco fusionables, los hints de modo de optimización dentro de la vista
están ignorados. La consulta del más alto nivel decide el modo de optimización.
Desde que las vistas poco fusionables son optimized separadamente de la
consulta del más alto nivel, el método de acceso y los hints del join dentro de la
vista están siempre conservados. Por la misma razón, los hints de métodos de
acceso en la vista en la consulta del más alto nivel están ignorados.
Sin embargo, los hints del join en la vista en la consulta del más alto nivel son
preservados porque en este caso, una vista poco fusionable es similar a una
tabla.
Resumen
Esta lección le presentó escenarios adicionales del optimizador y los hints.
Tu puede ajustar el modo del optimizador para usar ya sea el método basado en
costos o el método basado en reglas. Los valores respaldados de modo del
optimizador son COSE, RULE, FIRST_ROWS, ALL_ROWS
87
Usando hints, tu puede influenciar al CBO en la declaración ecuánime. Use hints
como un último remedio al afinar declaraciones de SQL. Hay varias categorías
de hint, uno del cual son hints para los métodos de ruta de acceso.
Sea precavido al usar hints con vistas. Los hints dentro de vistas o en vistas son
manipulados en forma diferente esto depende que la vista sea o no fusionable
en la consulta del más alto nivel.
Pracatica 8
En esta práctica, investiga comportamiento de RBO para una consulta en la tabla
de CATEGORIES que es una tabla pequeña con un índice. Esto está
consumado por estadísticas de la tabla que suprime y coloca el modo del
CHOOSE del optimizador. Entonces usa un hint para forzar un repaso completo
de la tabla. Compare los resultados y decida el mejor acercamiento para esta
consulta.
1 Suprima todas las estadísticas para la tabla de CATEGORIES.
2 Despliega los contenidos de la tabla de CATEGORIES. Note que es una
tabla pequeña. Hay un índice sobre la columna CAT_ID, para soportar la
restricción de llave primaria.
3 Altera la sesión y ajusta el modo CHOOSE del optimizador.
4 Analiza la declaración del select siguiente:
SQL> select *
2 from categories
3 where cat_id > 30;
5 ¿Qué método de optimización es usado?
6 Incluye un hint para un repaso de la tabla con la declaración del select
usado en el paso 4.
7 Ve los resultados del EXPLAIN_PLAN. ¿Qué método de optimización es
usado? ¿Con la tabla de CATEGORIES, cuál acercamiento es más
eficiente?
88
Oracle: Taller de Afinacion de Sentencias SQL
9 Sorteando y Uniendo
(Sort and Join)Los
objEtivos
Después de completar esta lección, tu deberás poder:
• Optimizar el desempeño, usando Top-N SQL
• Describir las técnicas usadas para ejecutar declaraciones de join
• Explicar la optimización realizada en joins
• Encuentra el plan óptimo de ejecución para una join
Las joins deben de ser la causa más frecuente de problemas de desempeño.
SQL Top-N
SQL> select *
2 from (select emp_id
3 , last_name
4 , first _name
89
5 , salary
6 from employees
7 ORDER By sañaru desc)
8 where ROWNUM<=5;
Top-N SQL
La idea detrás de la característica SQL del Top-N es que tu no necesita
clasificar un set lleno , por ejemplo, tu está sólo interesado en los cuatro valores
más altos (o mínimos).
Si un set es demasiado grande para ser clasificado en la memoria, entonces el
desempeño lo es significativamente y especialmente degradando. Esto se debe
a la I/O desde el almacenamiento temporal de resultados inmediatos sobre el
disco de resultados intermedios en disco.
Si tu sólo quiere saber los cuatro valores más altos, entonces tu sólo necesita un
conjunto imponente con cuatro ranuras para repasar el set y guardar los cuatro
valores más altos en que forman en orden.
La cláusula WHERE de la declaración de arriba es anexada en la vista de línea
para prevenir la tabla llena de EMPLOYEES de ser clasificada por SALARY.
Esto aparece en el plan de ejecución como sigue:
Execution Plan
SELECT STATEMENT Optimizador=CHOOSE
COUNT (STOPKEY)
VIEW
SORT (ORDER BY STOPKEY)
TABLE ACCESS (FULL) OF 'EMPLOYEES'
Terminología de JOIN
• Declaración de JOIN
• Predicado De Join y nonjoin predícate
• Predicado Single-row
SQL> select cls.start_date,,cls.instr_id
2 from classes cls, courses crs
3 where cls. crs_id = crs.crs_id
4 and cls.status =CONF
5 and crs.shart_name = SQLTUN80 ;
Terminología Join
Una declaración join es una declaración select con más de una tabla en la
cláusula FROM.
Sin embargo, el optimizador usa las técnicas normalmente asociadas con joins al
ejecutar otros sorteos de declaraciones donde más que una tabla es para la que
se estableció referencias, como una subconsulta.
Éste es un ejemplo de una declaración de join:
SQL> select cls.start_date, cls.instr_id
2 from classes cls, courses crs
3 where cls.crs_id = crs.crs_id -- join predicate
90
Oracle: Taller de Afinacion de Sentencias SQL
Operaciones de Join
• Una operación de join combina dos fuentes como
salidas y regresa solo una como resultado.
• Los tipos de operaciones de join incluyen las
siguientes:
− Join Nested loops
− Join Sort/merge
− Join Hash
− Join Cluster
Operaciones de Joins.
Una operación de join combina la salida de dos fuentes de la fila y devuelve una
fuente resultante de la fila. Las fuentes de la fila se introdujeron
Tipos de operaciones de join
El Oracle8i Server respalda cuatro sorteos diferentes de operación del join:
• Nested loops join
• Sort/merge join
91
• Hash Join
• Cluster Join
92
Oracle: Taller de Afinacion de Sentencias SQL
Join Sort/Merge
Un join sort/merge es ejecutado como sigue:
• Las filas de cada fila fuente son sorteadas en las
columnas del predicado
• Las dos fuentes de la fila son asociadas y
regresa el resultado de la fila fuente
Nota:Sort/merge es posible solo para equijoins
Sort/Merge Joins
En el tipo las operaciones, las dos fuentes de la fila son clasificadas en los
valores de las columnas usadas en el predicado del join. Si una fuente de la fila
ya ha sido clasificada en una operación previa, entonces la operación de
clasificación por fusión se salta el tipo en esa fuente de la fila.
La clasificación podría hacer esta técnica del join cara, especialmente si la
clasificación no puede ser realizada en la memoria.
Lo anexión que las combinaciones de operación las dos fuentes clasificadas de
la fila para recuperar cada par de filas que contienen valores que hace juego
para las columnas usadas en el predicado del join.
El plan básico de Ejecución
MERGE (JOIN)
SORT (JOIN)
TABLE ACCESS (
) OF tableA
SORT (JOIN)
TABLE ACCESS (
) OF tableB
93
Plan De Join Sort/Merge
Joins Hash
Un join has join es ejecutado como sigue:
• Ambas tablas son divididas en tantas particiones
como se requiera, usando un barrido de toda la
tabla
• Para cada par de partición, una tabla de hash se
construye en memoria sobre la partición mas
pequeña
• La otra partición se usa para explorar la tabla hash
94
Oracle: Taller de Afinacion de Sentencias SQL
Hash Joins
El Oracle8i Server considera que hash join sólo cuando tu usa el optimizador
basado en costos. Los hash joins, como los sort/merge, pueden ser realizadas
sólo para equijoins. Éstos son los pasos realizados para una join hash:
• El servidor Oracle realiza un repaso total en ambas tablas y hendiduras, cada
uno en muchas particiones según lo solicitado, basadas en la memoria
disponible.
• El servidor Oracle basa una tabla de direcciones calculadas en la partición
menor y usa la otra partición explorar la tabla de direcciones calculadas.
Todos los pares de partición que no caben dentro de memoria están posados
encima de disco.
El número de particiones en las cuales las tablas están partidas depende de la
cantidad de memoria disponible.
El plan básico de Ejecución
HASH JOIN
TABLE ACCESS (..) OF tableA
TABLE ACCESS (..) OF tableB
Consideraciones del desempeño.
Por regla general, las joins hash funcionan mejor que las joins sort/merge. En
algunos casos, una join sort/merge puede funcionar mejor que un nested loops
join; Es aun más probable que una join hash lo hará.
95
Cluster Joins
• Prerequisitos de Join Cluster.
− Las tablas deben ser parte del mismo grupo
− Equijoin es realizado sobre la llave cluster
• Las filas con el mismo valor de la llave de clusterse
guardan en el mismo bloque
• Join cluster son similares a joins nested loops
Cluster Join
Un join Cluster ser realizada si las tablas a unir son parte del mismo grupo, el
predicado del join indica a un equijoin, y el join se realiza con la llave de grupo.
En un grupo, las filas de ambas tablas con el mismo valor de la llave de grupo se
guardan en el mismo bloque, normalmente resultantes en menos bloque lee.
El plan básico de Ejecución
NESTED LOOPS
TABLE ACCESS (FULL) OF our_outer_table
TABLE ACCESS (CLUSTER) OF our_inner_table
96
Oracle: Taller de Afinacion de Sentencias SQL
Join Outer
• Predicados de Join con signo (+)
• Predicados Nonjoincon signo (+)
• Predicados sin signo (+) puede deshabitar la
funcionalidad de un join outer
SQL> select crs. Description,cls,start_date
2. from classes cls, courses crs
3. where cls.crs_id(+) = crs.crs_id
4. and cls.inst_id =crs.dev_id
5. and cls.satus(+) = BOOK
6. and cls.type = N/EC;
Outer Joins
Una join Outer es una join donde los predicados del join tienen un signo de (+ ) ,
Significa que el join devuelve una fila aun la tabla con este predicado especial
(la tabla outer join no tiene una fila que satisface la condición del join.
Ejemplo:
Select crs.description, cls.start_date
From classes cls, courses crs
Wherecls.crs_id(+) = crs.crs_id -- join predicate with (+)
and cls.instr_id = crs.dev_id -- join predicate without (+)
and cls.status(+) = 'BOOK' -- non-join predicate with (+)
and cls.type = 'N/EC' -- non-join predicate without (+)Note que
cualquier predicados sin un signo de (+ ) en la tabla que es exterior unida desactivarán
la funcionabilidad exterior del join.
Ejecución de JoinsOuter
•Indices pueden ser usados por predicados de
join ouer
• Predicados de Nonjoin en la tabla outer join
puede usar índices, si un índice no es usado
para el predicado del join
SQL>select crs.description, cls. Start_date
2 from courses crs, clases cls
3 Where crs.crs_id = cls.crs_id(+)
4 and cls.clas_id(+) =56744;
Ejemplo de Outer Join
1. SQL> select crs.description, cls.start_date
1. from courses crs, classes cls where crs.crs_id = cls.crs_id(+);
97
El optimizador puede usar un índice en la columna cls.crs id.
2. SQL> select crs.description, cls.start_date
2 from courses crs, classes cls
3 Where crs.crs_id = cls.crs_id(+)
4 And cls.class_id(+) = 56744;
El optimizador puede usar un índice en la columna cls.class id (un sola predicado
de la fila). COURSES es la tabla controlante.
3. SQL> select crs.description, cls.start_date
2 from courses crs, classes cls
3 where crs.crs_id = cls.crs_id(+)
4 and cls.class_id = 56744;
Esta declaración es una join exterior discapacitada; a ambos el índice en
cls.class id y crs.crs id. Tu puedes remover lo (+) en el predicado del join, porque
no tiene función.
El Optimizador y Joins
El optimizador decide lo siguiente:
1. El orden en el cual unirá las tablas
2. Que operación de unión aplicara para cada
join
3. La ruta de acceso para cada fila fuente
El Optimizador y Joins
El oiptimizador Oracle8i de optimizadores toman parte en tres fases. Primero, el
optimizador genera una lista de todo lo que el join posible orden. Entonces, para
cada orden posible del join, la mejor operación del join es seleccionada.
Finalmente, el Oracle8i optimizador determina el mejor camino de acceso para
cada fuente de la fila del plan de ejecución.
Regla 2:
Para joins outer, la tabla con el operador (+) debe
venir después de la otra tabla en el predicado del
join.
Reglas de Orden de join
• Un predicado de single-row forza su fuente de la fila a ser colocado primero
en el orden del join.
• Para las declaraciones del outer join, la tabla con el operador de outer join
debe venir antes de (en la orden del join) la otra tabla en el predicado del join.
98
Oracle: Taller de Afinacion de Sentencias SQL
99
1. Trata de minimizar operaciones de nested loops en las cuales la tabla inner es
accesada por medio de un barrido completo.
2. Si hay una corbata, entonces trata de minimizar operaciones del sort/merge.
3. Si hay todavía una liga, entonces escoja una tabla controlante con el camino
de registro del órgano mejor de acceso.
4. Si hay todavía una liga, entonces escoja una tabla controlante que aparece
más tarde en la cláusula FROM(La regla izquierdo para derecho).
Optimizacion de join cbo join
• Un set de planes posibles de ejecución es generado,
limitado por dos parámetros :
- OPTIMIZER_SEARCH_LIMIT
- OPTIMIZER_MAX_PERMUTATIONS
• El optimizador estima el costo de cada plan y elige el
de menor costo
100
Oracle: Taller de Afinacion de Sentencias SQL
Joins de Estrella.
Un tipo de diseño warehouse se centra en lo que es conocido como un esquema
de estrella, el cuál es caracterizado por uno o mas grandes tablas de hecho que
contiene la información primaria en el warehouse y un número de dimensión muy
pequeña de la tabla (o lookup pospone), cada uno del cual contiene información
acerca de las entradas para un atributo particular en la tabla de hecho.
Una star join es una join entre una tabla de hecho y un número de lookupde
tablas. Cada tabla del lookup es unida a la tabla de hecho por una la llave
primaria para join de la llave foránea, pero las tablas del lookup no son unidas a
cada quien. El hecho que la tabla normalmente tenga un índice concatenado en
las columnas cruciales para facilitar este tipo de join.
Una star join es ejecutado usando las operaciones normales del join, pero
usando una orden del join que no es propia de los predicados del join: Las tablas
más pequeñas de dimensión son unidas primero (guste un producto cartesiano).
La fuente resultante de la fila sirve entonces para un acceso concatenado del
índice en la tabla de hecho usando un nested loops join.
101
El ejemplo del star join
SQL> select sum(c.days)
2 from cls_statuses s
3 , class_types t
4 , locations l
5 , classes c
6 where c.status = s.cls_status
7 and .type = t.type
8 and c.loc_id = l.loc_id
9 and s.description = 'Class rescheduled or consolidated'
10 and t.description = 'Scheduled Ed Center Class'
11 and l.city = 'Redwood Shores';
En este ejemplo, debes construir un índice concatenado sobre las columnas
STATUS, TYPE y LOC_ID de la tabla de CLASES para posibilitar la optimización
de consulta de estrella.
Nota: La optimización de la consulta de estrella es considerada cuándo usa el
optimizador basado en costos (CBO). Las joins de estrella normalmente funcionan mejor
que el join normal que corresponde a multitabla, porque el optimizador pueda iniciar con
una tabla de dimensión pequeña como la tabla controlante, solamente debe unir esa
tabla con la tabla de hecho. Esto produce un resultado intermedio grande que puede ser
unido con todo el remanente de dimensión de las tablas. La ventaja de una star join es
que la tabla del hecho es la última tabla en la orden del join.
Hints para Orden de Join
SQL> select /*+ORDERED */
2 from T1, T2,
3 where
102
Oracle: Taller de Afinacion de Sentencias SQL
LEADING
El hint LEADING causa el optimizador que la tabla especificada ser utilizado
como la primera tabla en la orden del join. La diferencia con el hint ORDERED es
que LEADING sólo determina la tabla controlante.
START
El hint START forza a un plan de join star ser usado si es posible. Un plan de
star join tiene la tabla de más grande en la consulta de último en la orden del join
y con un nested loops join sobre un índice concatenado.
El hint star aplica cuando hay al menos tres tablas, el índice concatenado de la
tabla grande tiene al menos tres columnas, y no hay conflicto de acceso o join
con hints. El optimizador también considera permutaciones diferentes de las
tablas pequeñas.
Hints para Operaciones de Join
SQL> select /*+USE_NL(T2) */
2 from T1, T2,
3 where
SQL> select /*+USE_MERGE (T2) */
2 from T1, T2,
3 where
SQL> select /*+USE_HASH (T2) */
2 from T1, T2,
3 where
103
El hint de USE_MERGE causa que cada tabla especificada para ser unida con
otra fuente de la fila en la orden del join con un sort-merge join.
SQL> select /*+ USE_MERGE(TAB2) */ ... 2 from TAB1, TAB2 3 where ...
El hint de USE_HASH causa que cada tabla especificada para ser unida con
otra fuente de la fila en la orden del join con un hash join
SQL> select /*+ USE_HASH(TAB2) */ ... 2 from TAB1, TAB2 3 where ...
Usando los hints USE_NL, USE_MERGE, y USE_HASH.
El servidor Oracle8i Server usa estos tres hints de operación del join cuando
tabla para la que se estableció referencias (o alias) se ve forzada a una tabla
inner de un join, y estos son ignorados si la tabla para la que se estableció
referencias (o alias) es la tabla exterior. Por esto es que estos hints están a
menudo combinados con el hint ORDENADO.
Si tu tiene la idea que el optimizador ignora los hints USO_NL, USE_MERGE, o
USE_HASH probablemente encontraras un mejor plan para una orden diferente
del join.
Para eliminar esta posibilidad, tu puede añadir el hint ORDERED y puede
cambiar la orden de las tablas en su cláusula FROM, para forzar una cierta
orden del join.
Otros hints para Join
SQL> select /*+STAR_TRANSFORMATION) */
2 from T1, T2,
3 where
104
Oracle: Taller de Afinacion de Sentencias SQL
Subsconsultas y Joins
• Subconsultas, com ojoins, son declaraciones que
referencian a múltiples tablas
• Tipos de subconsultas:
− No correlacionada
− Correlacionada
− NOTINN(anti-joins)
− EXISTS semijoins)
Subconsultas No correlacionadas
Una subconsulta no correlacionada no contiene referencias para la consulta
exterior (main) y pueden ser ejecutadas independientemente.
Por ejemplo:
SQL> select cls.*
2 from classes cls
3 where cls.crs_id in (select crs.crs_id
4 from courses crs
5 where crs.dev_id = 10666);
Esta declaración es ejecutada como una nested loops join con una subconsulta
de la tabla exterior. Recupera todas las clases programadas pues los cursos
desarrollaron por empleado 10666. Sin cualquier índices que podrían mejorar
desempeño, ésta es la estructura de plan de ejecución:
Execution Plan
0 SELECT STATEMENT
1 0 NESTED LOOPS
2 1 TABLE ACCESS (FULL) OF 'COURSES'
3 1 TABLE ACCESS (FULL) OF 'CLASSES'
Subconsultas correlacionados
Este ejemplo de una subconsulta correlacionada, encuentra al empleado más
nuevo en cada equipo:
SQL> select e1.*
2 From employees e1
3 where e1.hiredate = (select max(e2.hiredate)
4 from employees e2
5 where e2.mgr_id = e1.mgr_id);Las subconsultas
correlacionadas normalmente tienen el siguiente plan de ejecución:
FILTER
TABLE ACCESS (..) OF EMPLOYEES -- E1
TABLE ACCESS (BY ROWID) OF EMPLOYEES -- E2
INDEX (RANGE SCAN) OF FK_EMP_MGR (NON-UNIQUE)
La operación del FILTER en este caso puede ser considerado como una
operación nested loops con el acceso para E1 como mientras tabla exterior y el
acceso para E2 como tabla inner.
105
Anti-Joins
Una antijoin es una declaración de select con una subconsulta con un NOT IN.
Por ejemplo:
SQL> select crs.*
2 from courses crs
3 where crs.dev_id = 79126
4 and crs.crs_id NOT IN (select cls.crs_id
5 from lasses cls);Una antijoin devuelve filas del
lado izquierdo del predicado para el cual no hay filas correspondientes sobre el
lado derecho del predicado.
El optimizador usa un algoritmo nestded loops para subconsultas de NOT IN por
defecto, a menos que el parámetro de inicialización ALWAYS_ANTI_JOIN que
esté colocado para un MERGE o HASH y las diversas condiciones requeridas
son por las que se responsabiliza que permite la transformación del NOT IN de la
subconsulta en un sort/merge o hash antijoin. Tu puedes colocar a un
MERGE_AJ o HASH_AJ en la subconsulta del NOT IN para especificar cuál
algoritmo el optimizador deberá usar.
Semijoins
Una semijoin devuelve las filas que hacen juego con una subconsulta EXISTS.
Por ejemplo:
SQL> select crs.*
2 from courses crs
3 where crs.dev_id = 79126
4 and crs.crs_id NOT IN (select cls.crs_id
5 from classes cls);
El optimizador usa un algoritmo de nested loops para las subconsultas EXISTS
por defecto, a menos que el parámetro de inicialización ALWAYS_SEMI_JOIN
que esté colocado para MERGE O y diversas condiciones requeridas son por los
que se responsabiliza. Tu puedes colocar a un MERGE_AJ o HASH_AJ en la
subconsulta del EXISTS para especificar cuál algoritmo el optimizador deberá
usar.
106
Oracle: Taller de Afinacion de Sentencias SQL
HASH_JOIN_ENABLE
Este parámetro especifica si el optimizador deberá considerar usar un hash join
como un método de join. (Cuando se pone en FALSE, esta apagado; Esto es,
no está disponible como un método del join que el optimizador puede considerar.
Sin embargo, está todavía disponible en la nivel declaración-usando un cada si
el parámetro HASH_JOIN_ENABLE es determinado para FALSE.)
HASH_AREA_SIZE
Este parámetro especifica la cantidad máxima de memoria, en bytes, para ser
usados por hash joins.
HASH_MULTIBLOCK_IO_COUNT
Este parámetro especifica cuántos bloques secuenciales son leídos o escritos en
un I/O.
Parámetros de SORT
Varios parámetros de tipo influencian cómo realiza el Oracle8i Server una
operación de tipo. El desempeño de tipo, especialmente cuando ocupándose de
cantidades grandes de datos, varía mucho basado en los valores diferentes de
estos parámetros. El desempeño de tipo directamente influencia desempeño del
join del sort/merge.
Prospectos de Filas
• Las filas que son recuperadas pero no usadas
• Identificar el prospecto para comparar el numero de
filas de los siguientes:
− La operación de join
− Las filas fuentes de entrada
El prospecto de Filas
Compara el número de filas de las dos fuentes de la fila de entrada con el
número de filas de la operación del join. Si ambos introducen filas fuentes tienen
más filas que la operación del join, tu has identificado un prospecto de filas.
EJEMPLOS:
Rows Operation
100 NESTED LOOPS
45 TA45BLE ACCESS (
) OF our_outer_table
4530 TABLE ACCESS (
) OF our_inner_table
En este ejemplo, aproximadamente 98 % de las filas recuperadas (4,430 fuera
de 4,530 filas de la tabla inner) son arrojados fuera, Tan debería haber espacio
para mejora de desempeño.
107
Rows Operation
100 MERGE (JOIN
23 SORT (JOIN)
23 TABLE ACCESS (
) OF table_A
150 SORT (JOIN)
150 TABLE ACCESS (
) OF table_B
En este ejemplo, sólo una fracción pequeña de las filas recuperadas son a las
que se arrojó fuera, así es que tu no puede esperar mejoras significantes de
desempeño para reducir prospectos.
108
Oracle: Taller de Afinacion de Sentencias SQL
Minimizando el Procesamiento
• Cambiando joins nested loops en joins sort/merge
puedes hacer lo siguiente:
− Remover acceso de índice
− Agregar sort overhead
• Teóricamente, joins hash son la operación de join
mas eficiente.
• Join Cluster necesitan menos I/O que el que necesita
el join nested loops
Minimizando el procesamiento.
Cambiando los joins nested loops en joins sort/merge pueden remover el acceso
al índice pero podrían agregar un sorteo significante.
Las joins de hash requieren menos procesamiento que la misma operación del
sort/merge; Los joins de hash son teóricamente el algoritmo más rápido para
unir tablas. Sin embargo, necesitan asignar una buena afinación.
Las joins de cluster necesitan menos I/O que los nested loops, porque las filas
hijo que forman parte de fila padre son guardadas conjuntamente en el mismo
bloque lógico del cluster.
Resumen
Esta lección te presentó el Top-N SQL, clasificación de desempeño, con sorteo
y cómo optimizar declaraciones de joins.
Hay varias operaciones diferentes del join que Oracle8i soporta:
• Nested loops joins
• Sort/merge join
• Hash join
• Cluster join
El optimizador de Oracle8i optimiza joins de tres fases. Primero, el optimizador
genera una lista de todo los joins posible de orden. Entonces, para cada orden
posible del join, la mejor operación del join es seleccionada. Finalmente, el
optimizador de Oracle8i determina el mejor camino de acceso para cada fuente
de la fila del plan de ejecución. RBO difiere de CBO. Especificar un hint fuerza al
CBO a ser usado.
El prospecto de filas ocurre cuando ambos introducen fuentes de fila que tienen
más filas que el resultado de la operación del join. Minimizando prospecto de
filas y mejorar desempeño.
109
10. Plan de Estabilidad del Optimizador
Objetivos
Después de completar esta lección, tu podrás hacer lo siguiente:
• Identificar el propósito y los beneficios de plan estabilidad
• Crear outlines almacenados
• Usar outlines almacenados
• Mantener outlines almacenados
110
Oracle: Taller de Afinacion de Sentencias SQL
Plan Equivalencia
• El texto de declaración SQL debe equivaler
• Los planes deben mantenerse a través de:
− Nuevas versiones de Oracle
− Nuevas estadísticas sobre objetos
− Initialization parameter changes
− Reorganización de base de datos
− Cambios en el esquema
• Plan equivalencia puede controlar planes de
ejecución para aplicaciones de terceros
Equivalencia de declaraciones de SQL
El plan de estabilidad confía en texto exacto de consultas, cuando determinas
que consulta tiene un outline almacenado. Esto es el mismo criterio usado para
determinar si un plan de ejecución en la shared pool puede ser rehusado.
Los outlines almacenados confían parcialmente en hints que el optimizador suele
lograr planes estables de ejecución. Por consiguiente, el grado para el cual los
restos de plan equivalente depende de las capacidades de los hints que uso el
plan. Los pasos de ejecución incluidos en un outline almacenado incluyen
métodos de acceso de la fila, join order, métodos de join se unen a los accesos
distribuidos, y anexándose view/subquery . El acceso distribuido no incluye el
plan de ejecución en el nodo remoto.
El plan Estabilidad
Estos planes son mantenidos a través de muchos tipos de cambios de la base
de datos y de instancias. Por consiguiente, si tu desarrollas aplicaciones para la
distribución masiva, tu puedes usar outlines almacenados para asegurar que
todos sus clientes gane acceso a los mismos planes de ejecución. Por ejemplo,
si el esquema se cambia añadiendo un índice, entonces los planes de ejecución
no cambian. Tu debes generar outlines almacenados nuevos, o debes
deshabilitar la estabilidad de plan, para beneficiarse del índice nuevo.
111
Creando Outlines de almacenados
Tu puede crear outlines para una sesión, o tu los puede crear para las
declaraciones específicas de SQL. Los outlines pueden derivar su entrada de
ambos de RBO y CBO. Sin embargo, el optimizador de Oracle8i sólo puede
usar outlines al usar al CBO, porque los outlines confían en hints.
Si tu omite un nombre de categoría cuando creas outlines , entonces serán
metidos en la categoría por DEFAULT.
Parametro CREATE_STORED_OUTLINES
El servidor Oracle crea outlines almacenados, automáticamente cuando tu ajusta
este parámetro para TRUE o para un nombre de categoría. Cuándo el parámetro
es determinado para TRUE, la categoría por default es usada. Cuando el
parámetro es activado, el servidor Oracle crea outlines para todas las
declaraciones ejecutadas de SQL. Tu puede desactivar esto ajustando el
parámetro para FALSE. Cuando tu usas este parámetro, el servidor Oracle
genera los nombres para cada outline almacenado.
Comando CREATE OUTLINE
Tu también puede crear outlines almacenados para las declaraciones
específicas usando el comando CREATE OUTLINE.
Una ventaja de usar esta orden es que tu puede nombrar los outlines
almacenados. En el ejemplo, el comando CREATE OUTLINE asigna el nombre
co_cl_join para guardar el outline.
112
Oracle: Taller de Afinacion de Sentencias SQL
113
La ejecución Lógica de Plan
Para determinar el plan de ejecución de una declaración de SQL, Oracle8i usa la
siguiente lógica:
• La declaración es comparada con las declaraciones de la shared spool para
pareo del texto y la categoría del outline.
• Si ninguna declaración igual es encontrada, entonces el diccionario de datos
es puesto en duda para un outline que hace juego.
• Si un outline que hace juego es encontrado, entonces Oracle8i integra el
outline en la declaración y crea el plan de ejecución.
• Si ningún outline es encontrado, entonces la declaración es ejecutada usando
métodos normales.
Si un outline especifica el uso de un objeto que no puede ser usado, entonces la
declaración simplemente no usará el hint. Por ejemplo, pone notas a un índice
que ya no existe. Para verificar que un outline almacenado es comenzado a
usarse, el plan de ejecución para una declaración debe ser comparado cuando
este ejecutándose con y sin USE_STORED_OUTLINES..
114
Oracle: Taller de Afinacion de Sentencias SQL
115
Para usar outlines almacenados la opción USED_STORED_OUTLINES debe
ser puesta en TRUE o un nombre de categoría. Los procedimientos en el
paquete OUTLN_PKG para el manejo de outlines almacenados y sus categorías.
Hay vistas de diccionario de datos que almacenan información en los outlines.
Practica
En esta práctica, tu deberás crear, usar, y remover outlines almacenados.
Necesitaras alterar su sesión en orden para el outline a ser utilizado. Use las
vistas del diccionarios de datos USER_OUTLINES y USER_OUTLINE_HINTS
para ver el estado de su outline.
Práctica 10
1. El SQL de vuelta * Y AUTOTRACE completamente.
Asegúrese que la columna MGR_ID de la tabla de EMPLEADOS no esta
indexada, entonces cree un outline almacenado para la siguiente declaración
de SQL.
SQL> select e.first_name, e.last_name
2 from employees e
3 where e.mgr_id = 76505;Compruebe la vista del diccionario de datos
USER_OUTLINES para encontrar el nombre del outline y de su categoría
para el outline que creaste.; También, consulte la columna USED para ver
que el outline no está usado todavía.
3. Compruebe la vista del diccionario de datos USER_OUTLINE_HINTS para
ver cuáles hints son almacenados con su outline.
4. Use el comando ALTER SESSION para habilitar la sesión usando outlines
almacenados.
5. Ejecute la declaración de SQL del paso 1; cree un índice para la columna
MGR_ID de los tabla EMPLOYEES, ejecute la declaración de SQL otra vez
para ver si el plan de ejecución ha cambiado.
6. Compruebe la vista de diccionario de datos USER_OUTLINES otra vez para
ver si el outline ha sido usado.
7. Borre el outline, y ejecute la declaración de SQL otra vez, para ver que el
índice ahora será usado.
116
Oracle: Taller de Afinacion de Sentencias SQL
Objetivos
Al cabo de completar esta lección, tu deberás estar capacitado para:
• Identificar el propósito y las ventajas de las vistas materializadas
• Crear vistas materializada
• Habilitar versiones reescritas de consulta
• Crea dimensiones
• Identificar los beneficios de tablas temporales
Vistas Materializadas
Una vista materializada:
• Es una instanciacion de una declaración de SQL
• Tienen su propio segmento de datos y oferta:
- Opciones de manejo de espacio
- El uso de sus propios índices
• Util para:
- Costos y complejos joins
- Resumen y datos agregados
Materializando Vistas
Una vista materializada almacena ambos tanto la definición de una vista y las
filas, resultando de la ejecución de la vista. Como una vista, usa una consulta
como la base, pero la consulta es ejecutada en el tiempo que la vista es creada,
y los resultados son almacenados en una tabla. Tu puedes definir la tabla con los
mismos parámetros de almacenamiento como cualquier otra tabla y la puedes
meter en el tablespace de su elección. También puedes indexar la tabla
materializada de la vista como otras tablas para mejorar el desempeño de
consultas ejecutadas en contra de ellas.
Cuándo una consulta puede satisfacerse con datos de una vista materializada, el
servidor de Oracle8i transforma la consulta para usar la vista en lugar de las
tablas bases. Usando una vista materializada, operaciones caras como joins y
agregaciones no necesitan ser reejecutadas
117
Creando Vistas Materializadas
SQL>CREATE MATERIALIZED VIEW cls_summ AS
Sellect cl.clas_id, co.short_name
2. , cl.star_date, 1:city
3. , cl.star_count(r.stud_id) as tot_reg
4. from classes cl
5. , courses co
6. , locations 1
7. , registrations r
8. where cl.loc_id =1.loc_id
9. and cl.class_id =r.class_id
10. group by cl.class_id, co.short_name
11. , cl.star_date, 1.city;
Creando Vistas Materializadas
Si una consulta involucra resúmenes grandes o múltiples joins, o ambos. Y son
probablemente para ser usados múltiples veces , puede ser más eficiente crear
una vista materializada para los resultados de consulta. Esto requiere una sola
ejecución de la consulta y el espacio de almacenamiento para preservar los
resultados.
Si las consultas son probablemente rehusadas con el paso del tiempo, entonces
puedes necesitar un mecanismo para actualizar la vista materializada como el
cambio de la tablas bases. El desempeño y los gastos de almacenaje de
manutención que la vista materializada debe ser comparada con los costos de
reejecutar la consulta original cuandoquiera que es necesario.
El proceso de modificar una consulta a usar la vista en vez de la tabla base es
llamado una versión reescrita de consulta.
118
Oracle: Taller de Afinacion de Sentencias SQL
119
Vistas Materializadas: Actualización Manual
• Especificar vistas materializadas
DBMS_MVIEW.REFRESH
( SF_CLASSES , PARALLELISM =>10);
• Vistas materializadas basadas en una o mas
tablas
DBMS_MVIEW.REFRESH DEPENDENT
(CLASSES );
• Todas las vistas materializadas a actualizar
DBMS_MVIEW.REFRESH ALL_MVIEWS;
Actualización Manual
La siguiente es una lista de posibles escenarios de actualizaciones para vistas
materializadas:
• Actualice vistas materializadas específicas usando el procedimiento
REFRESH
• Actualice todas las vistas materializadas que dependen de un set dado de
tablas base usando el procedimiento REFRESH_DEPENDENT.
• Actualice todas las vistas materializadas que no hayan sido desde que la
última carga, para una o más tablas detalle usando el procedimiento
REFRESH_ALL_VIES.
• Los procedimientos en el paquete usan un número de parámetros para
especificar lo siguiente:
• Actualizar método
• Proceder si un error es encontrado
• Si para usar una sola transacción (coherente refresque)
• El segmento de rollback para usar
Necesitas colas de trabajo del servidor para correr la actualización de trabajo.
Por consiguiente los parámetros apropiados de inicialización,
JOB_QUEUE_PROCESES y JOB_QUEUE_INTERVAL, deben ser determinados
al habilitar la cola de trabajo para actualizar procesos.
Consultas Reescritas
• Para usar vistas materializadas en vez de tablas
base, la consulta debe ser reescrita.
• Las consultas reescritas son transparentes a las
aplicaciones.
• Las consultas reescritas no requieren especiales
privilegios sobre las vistas materializadas
• Una vista materializada puede ser habilitada o
deshabilitada para consultas reescritas.
Consultas Reescritas
Porque ganar acceso a una vista materializada puede ser significativamente más
rápido que ganar acceso a las tablas base subyacentes, el optimizador reescribe
una consulta para ganar acceso a la vista cuando la consulta la permite. La
120
Oracle: Taller de Afinacion de Sentencias SQL
121
Creando Vistas Materializadas: Opciones de Sintaxis
La sintaxis CREATE MATERIALIZED VIEW es similar al comando CREATE
SNAPSHOT , cuál reemplaza. Hay algunas opciones adicionales:
• La opción BUILD IMMEDIATE causan que la vista materializada a ser
pobladas cuando el comando CREATE es ejecutado. Éste es el
comportamiento predeterminado. Tu puedes escoger la opción BUILD
DEFERRED, la cual crea la estructura pero no puebla ella hasta que la
primera actualización ocurra.
• En lugar de la opción de BUILD, también puedes especificar ON PREBUIL
TABLE cuándo tu quieras una tabla sumaria existente para ser la fuente de
una vista materializada.
• La cláusula ENABLE/DISABLE QUERY REWRITE determina si las versiones
reescritas de consulta son automáticamente habilitadas para la vista
materializada.
Nota: Las opciones predeterminadas en la sintaxis son subrayadas.
122
Oracle: Taller de Afinacion de Sentencias SQL
Nota: No hay privilegios del objeto asociados con versiones reescritas de consulta. Los
usuarios con acceso a las tablas base implícitamente benefician a consultas reescritas.
Tu puede usar el hint REWRITE para restringir los puntos de vista
materializados que se consideran para versiones reescritas de consulta. El hint
NOREWRITE está disponible para suprimir consultas reescritas.
123
El ejemplo de consulta reescrita(Continuación)
El optimizador puede usar la vista materializada creada recientemente para
satisfacer la consulta.
Nota: Esta consulta exactamente no hace juego con la definición materializada de la
vista. Tu le tendras que agregar un predicado de nonjoin en la línea 8 y una cláusula
HAVING en la última línea. El predicado nonjoin es asociado dentro del la consulta
reescrita en contra de la vista materializada y la cláusula HAVING es traducida a un
segundo componente de la cláusula WHERE.
Dimensiones y Jerarquías
124
Oracle: Taller de Afinacion de Sentencias SQL
Dimensiones y Jerarquías.
Las dimensiones describen a las entidades comerciales como productos,
departamentos, y tiempo en una jerárquica, clasificada en categorías. Una
dimensión puede constar de uno o más jerarquías. En el ejemplo demostrado, la
dimensión de tiempo consta de tres jerarquías.
Cada jerarquía comprende niveles múltiples. Cada valor en un nivel inferior en la
jerarquía es el hijo de uno de un solo padre en el siguiente nivel más alto. Una
jerarquía consta de relaciones 1 a n relaciones entre los niveles, con el nivel
del padre representa un nivel de agregación del nivel del hijo. En el ejemplo, la
jerarquía del CALENDAR_ROLLUP consta de la fecha de venta, mes, cuarto, y
el año.
Un nivel en la jerarquía tiene un nivel llave que puede identificar uno o más
atributos dimensionales. En el ejemplo, el mes es un nivel donde el MONTH
crucial nivelado identifica el atributo MONTH_NAME.
Puedes usar llaves niveladas y estas relacionar nombres de forma
intercambiable en una consulta.
Dimensiones y Jerarquías
Tabla TIME dimensión TIME_DIM
Dimensiones y Jerarquías
Las dimensiones pueden basarse en columnas en una sola tabla, como se
muestra en este primer ejemplo.
125
Cuando creas dimensiones, debes definir y nombrar niveles de jerarquía
basados en el nombre de las columnas de tabla TIME.
En este caso, la dimensión TIME_DIM tiene 4 niveles:
El nivel más alto en la jerarquía consiste en la columna YEAR.
El siguiente nivel es derivado de la columna QUARTER.
El tercer nivel tiene la columna de MONTH como la llave y MONTH_NAME como
un atributo. Note que para cada valor de MONTH mapea un solo valor
MONTH_NAME y viceversa.
El nivel mas bajo se basa en la columna SDATE.
126
Oracle: Taller de Afinacion de Sentencias SQL
127
LEVEL qtr IS time.quarter
LEVEL yr IS time.year
HIERARCHY cal
dt CHILD OF
Mon CHILD OD
Qtr CHILD OF yr )
HIERARCHY week
(dt CHILD OF
Wk CHILD OF yr);
Tablas Temporales
• Tablas temporales retiene datos durante de una
transacción o sesión
• Las definiciones persisten en el diccionario de
datos
• Los datos son visibles solo para la sesión
• Tablas temporales:
- Usan espacio en memoria
- Asignan extents temporales, si es necesario
Tablas Temporales
El Oracle8i Server faculta a crear tablas temporales. Las tablas temporales
pueden mejorar desempeño significativamente para soportar datos temporales
para el aprovechamiento dentro de una transacción o la sesión.
Una tabla temporal tiene las siguientes propiedades:
• Los datos temporales de la tabla son sólo visibles dentro de su alcance
definido; El alcance puede estar definido para una sesión o una transacción.
• La definición de una tabla temporal global es visible para todas las sesiones.
En el contraste, la definición de una tabla temporal local no persiste al final de
la sesión que la crea.
Nota: El Oracle8i Server actualmente no soporta tablas temporales locales.
- Los datos temporales de la tabla son almacenados dentro espacio usado por
la sesión. Si el espacio de tipo no es suficiente para acomodar los datos,
entonces el espacio es ubicado en el tablespace temporal del usuario.
- Los índices en tablas temporales tienen el mismo alcance y la duración como
la tabla de la que ellos son propios.
- Los triggers y las vistas pueden estar definidos en tablas temporales. Sin
embargo, una vista no puede estar definida asociándose una temporal y una
tabla permanente.
- Los comandos CRETE GLOBAL TEMPORARY TABLE AS SELECT usarse
para crear una tabla temporal e insertar datos dentro de unos datos de la
tabla temporal y del inserto en ella.
Las definiciones de tablas temporales pueden ser exportadas e importadas
128
Oracle: Taller de Afinacion de Sentencias SQL
Resumen
Esta lección presentó las versiones reescritas de vistas materializadas, de
consulta, las dimensiones y las jerarquías, y las tablas temporales:
• Una vista materializada almacena ambos la definición de una vista y las filas
resultando de la ejecución de la vista. Como una vista, usa una consulta
como la base, pero la consulta es ejecutada en el tiempo que la vista es
creada, y los resultados son almacenados en una tabla.
129
• Ya que ganar acceso a una vista materializada puede ser significativamente
más rápido el acceso a las tablas base subyacentes, el optimizador reescribe
una consulta para ganar acceso a la vista cuando la consulta la permite. La
actividad de consulta reescrita es transparente para las aplicaciones.
• Las dimensiones son estructuras de diccionario de datos que definen
jerarquías basadas en columnas de las tablas existentes de la base de datos.
Las dimensiones describen a las entidades comerciales como productos,
departamentos, y tiempo en una jerárquia, clasificada en categorías. Una
dimensión puede constar de uno o más jerarquías. Cada jerarquía
comprende niveles múltiples.
• El servidor de Oracle8i habilita a crear tablas temporales. Las tablas
temporales pueden mejorar el desempeño significativamente para datos
temporales y aprovecharlo dentro de su transacción o sesión.
130
Oracle: Taller de Afinacion de Sentencias SQL
Soluciones
Capitulo 2.
1.
show arraysize
2.
column sql_text format a50
select cls_status, description
from cls_statuses
/
select sql_text, sorts
from v$sqlarea
where command_type = 3
and lower(sql_text) like '%cls_statuses%'
/
3.
select cls_status, description
from cls_statuses
order by cls_status
/
select sql_text, sorts
from v$sqlarea
where command_type = 3
and lower(sql_text) like '%cls_statuses%'
/
4.
insert into cls_statuses
values('HOLD', 'Class on hold')
/
select sql_text, sorts
from v$sqlarea
where command_type in (2, 3)
and lower(sql_text) like '%cls_statuses%'
/
rollback
/
5.
select gethitratio, pinhitratio
from v$librarycache
where namespace = 'SQL AREA'
131
Capitulo 3.
1.
describe plan_table
132
Oracle: Taller de Afinacion de Sentencias SQL
Capitulo 4
1.
column name format a30
column value format a30
select name, value
from v$parameter
where name in
('timed_statistics', 'max_dump_file_size',
'user_dump_dest', 'sql_trace')
/
alter session set timed_statistics = true
/
alter session set sql_trace = true
/
2.
select first_name, last_name
from employees
where emp_id = 6191
133
/
3.
alter session set sql_trace = false
/
alter session set timed_statistics = false
/
Capitulo 5.
1.
alter session set optimizer_mode = RULE
/
2.
set autotrace traceonly explain
select e.last_name
, e.first_name
, r.status
from employees e
, registrations r
where e.emp_id = r.stud_id
and r.class_id = 55999
/
3.
select *
from cls_statuses
where cls_status = 'BOOK'
/
4.
alter session set optimizer_mode = CHOOSE
/
5.
select e.last_name
, e.first_name
, r.status
from employees e
, registrations r
where e.emp_id = r.stud_id
and r.class_id = 55999
/
134
Oracle: Taller de Afinacion de Sentencias SQL
Capitulo 7.
1.
col low_value format a15
col high_value format a15
analyze table registrations
compute statistics
/
select num_rows, blocks, empty_blocks
, avg_space, avg_row_len
from user_tables
where table_name = 'REGISTRATIONS'
/
select column_name, num_distinct
, low_value, high_value
, num_nulls
from user_tab_col_statistics
where table_name = 'REGISTRATIONS'
/
2.
select count(*), status
from registrations
group by status
/
3.
analyze table registrations compute statistics
for columns status size 20
/
select endpoint_number, endpoint_value
from user_histograms
where table_name = 'REGISTRATIONS'
and column_name = 'STATUS'
/
4.
select * from registrations
where status = 'CANC'
/
5.
select table_name, sample_size, last_analyzed
from user_tables
/
6.
analyze table registrations delete statistics
/
select table_name, sample_size, last_analyzed
from user_tables
/
135
Capitulo 8.
1.
analyze table categories delete statistics
/
2.
select *
from categories
/
3.
alter session set optimizer_mode = CHOOSE
/
4.
set autotrace traceonly explain
select *
from categories
where cat_id > 30
/
6.
select /*+ FULL(c) */
*
from categories c
where cat_id > 30
/
136