Académique Documents
Professionnel Documents
Culture Documents
Impartido por: Luis Figueroa Santa Cruz de la Sierra, Bolivia Setiembre 1999
ndice
NDICE .............................................................................................................................................................. 2 ORACLE, ARQUITECTURA INTERNA Y EXTERNA ..............................................................................4 CONCEPTOS GENERALES .................................................................................................................................4 BASES DE DATOS .............................................................................................................................................5 TABLESPACES ..................................................................................................................................................6 ARCHIVOS O DATA FILES .................................................................................................................................6 INSTANCIAS ..................................................................................................................................................... 7 ESTRUCTURAS INTERNAS DE LA BASE DE DATOS ............................................................................................ 7 ORACLE, ARQUITECTURA INTERNA Y EXTERNA ............................................................................ 14 SECUENCIAS .................................................................................................................................................. 14 PROCEDIMIENTOS .......................................................................................................................................... 14 FUNCIONES .................................................................................................................................................... 14 PAQUETES ALMACENADOS ............................................................................................................................ 15 TRIGGERS ...................................................................................................................................................... 15 DATABASE LINKS ........................................................................................................................................... 16 SINNIMOS .................................................................................................................................................... 16 PRIVILEGIOS Y ROLES .................................................................................................................................... 17 SEGMENTS, EXTENTS Y BLOCKS ..................................................................................................................... 18 ROLLBACK SEGMENTS ................................................................................................................................... 19 ORACLE, ARQUITECTURA INTERNA Y EXTERNA ............................................................................ 20 ESTRUCTURAS INTERNAS DE MEMORIA ......................................................................................................... 20 ESTRUCTURAS EXTERNAS ............................................................................................................................. 26 CONSIDERACIONES DE HARDWARE Y CONFIGURACIN............................................................. 28 VISIN GENERAL DE LA ARQUITECTURA ....................................................................................................... 28 SERVIDORES INDEPENDIENTES (STAND-ALONE HOSTS) ................................................................................ 29 SERVIDORES INDPENDIENTES CON ARREGLOS DE DISCOS ............................................................................ 30 SERVIDOR INDEPENDIENTE CON ESPEJEO DE DISCOS VIA SISTEMA OPERATIVO .............................................. 32 SERVIDORES INDEPENDIENTES CON MLTIPLES BASES DE DATOS .................................................................. 32 SERVIDORES ENLAZADOS EN RED .................................................................................................................. 33 PLANEAMIENTO LGICO DE LA BASE DE DATOS ........................................................................... 36 OPTIMAL FLEXIBLE ARQUITECTURE (OFA) .................................................................................................. 36 PLANEAMIENTO FSICO DE LA BASE DE DATOS .............................................................................. 40 DISTRIBUCIN DE LOS ARCHIVOS DE LA BASE DE DATOS ............................................................................... 40 CONTENCIN DE I/O ENTRE LOS DATAFILES .................................................................................................. 40 CUELLOS DE BOTELLA DE I/O ENTRE TODOS LOS ARCHIVOS DE LA BASE DE DATOS....................................... 41 I/O CONCURRENTE ENTRE LOS PROCESOS DE BACKGROUND .......................................................................... 42 UTILIZACIN DEL ESPACIO DENTRO DE LA BASE DE DATOS............................................................................ 46 OPERACIONES RUTINARIAS DE MANEJO FSICO DE ARCHIVOS DE ORACLE ..................................................... 53 LABORATORIO, INSTANCIAS Y TABLESPACES................................................................................. 55 LABORATORIO, ERRORES, CAMBIAR TAMAO DE DATAFILES, MOVER DATAFILES, SCRIPT GENRICOS. .................................................................................................................................. 61 PROVOCAR UN ERROR IRRECUPERABLE.... ..................................................................................................... 61 MOVER DATAFILES, CAMBIO DE TAMAO Y AGREGAR DATAFILES................................................................. 61 VARIOS SCRIPTS ............................................................................................................................................. 62
AFINAMIENTO DEL SQL............................................................................................................................ 64 AFINANDO SINTAXIS ...................................................................................................................................... 65 EXPLAIN PLAN .......................................................................................................................................... 72 OPTIMIZADORES DE ORACLE ......................................................................................................................... 73 AFINAMIENTO DE LA UTILIZACIN DE MEMORIA......................................................................... 77 CMO DETERMINAR CUANDO RECONSTRUIR NDICES? ................................................................................. 82 UTILIZACIN DE UTLBSTAT Y UTLESTAT ............................................................................................... 83 SQL TRACE FACILITY .................................................................................................................................... 83 LABORATORIO, TUNING SQL .................................................................................................................. 87 LABORATORIO, TKPROF Y OTROS SCRIPTS...................................................................................... 90 SEGURIDAD Y AUDITORA ....................................................................................................................... 92 CAPACIDADES DE SEGURIDAD ....................................................................................................................... 92 IMPLEMENTANDO LA SEGURIDAD .................................................................................................................. 93 AUDITANDO ................................................................................................................................................. 100 RESPALDO Y RECUPERACIN .............................................................................................................. 102 RESPALDOS LGICOS ................................................................................................................................... 102 RESPALDOS FSICOS ..................................................................................................................................... 103 IMPLEMENTACIN........................................................................................................................................ 104 OFFLINE BACKUPS ....................................................................................................................................... 107 BLOQUEOS .................................................................................................................................................. 110 DEADLOCKS ................................................................................................................................................ 111 LABORATORIO, AUDITORIA, RESPALDO Y RECUPERACION ..................................................... 114 AUDITORA Y SEGURIDAD ............................................................................................................................ 114 RESPALDO Y RECUPERACIN ....................................................................................................................... 115 BIBLIOGRAFA ........................................................................................................................................... 116
El modelo relacional empleado por Oracle, est bastante probado y su definicin terica tiene ms de 20 aos de haber sido propuesta. Sin embargo no fue sino hasta bien entrados los aos 80 que fue posible dar soporte real a toda la teora relacional, gracias al abaratamiento de los discos duros y la memoria, ya que el modelo relacional requiere mayores cantidades de estos recursos que los modelos anteriores de bases de datos como el jerrquico y de redes.
Para aclarar trminos que emplearemos en el resto del curso veamos el siguiente esquema: Por ejemplo veamos una tabla tpica de departamentos en una empresa: Nombres de las columnas
Columnas de datos Para accesar a estos datos, se utiliza un lenguaje de consultas denominado SQL, el cual es un estndar utilizado por la mayora de manejadores de bases de datos a nivel mundial, sin embargo, Oracle a este SQL bsico le ha agregado una gran variedad de funcionalidad adicional lo cual lo hace el manejador de base de datos ms popular hoy da. El manejador de la base de datos utiliza estadsticas, ndices y ayudas provistas por el programador para extraer la informacin solicitada por un usuario, a este proceso se le denomina Optimizador y ser visto durante el transcurso del curso. Lo importante a tener en cuenta es que siempre que se hace una consulta hay un proceso intermedio que se encarga de determinar donde, cmo y qu datos traer de la base de datos.
Bases de Datos
Una base de datos es un conjunto de datos. Oracle provee la habilidad de almacenar y accesar los datos de una manera consistente con el modelo relacional. Debido a que Oracle es referido como una base de datos relacional, cuando digamos base de datos nos referiremos no slo a los datos fsicos sino tambin a la combinacin de datos, memoria y procesos que explicaremos a continuacin. Los datos en una base de datos estn almacenados en tablas, las tablas relacionales estn definidas por sus columnas las cuales tienen un nombre. Los datos se almacenan en filas dentro de la tabla. Las tablas pueden relacionarse unas con otras y la base de datos puede ser usada para obligar a cumplir con estas relaciones. Internamente, Oracle almacena los datos en archivos, existen estructuras de la base de datos que proveen un mapeo lgico entre los datos y estos archivos, permitiendo que diferentes tipos de datos puedan ser almacenados en forma separada. Estas divisiones lgicas se llaman tablespaces.
Tablespaces
Un tablespace es una divisin lgica de la base de datos, cada base de datos tiene al menos un tablespace llamado SYSTEM, otros tablespaces pueden ser usados para agrupar usuarios o aplicaciones por facilidad de administracin asi como por beneficios de rendimiento que explicaremos luego. Un tablespace SOLO puede pertenecer a una base de datos.
Tablespaces
Datafiles
Instancias
Para accesar los datos en la base de datos, Oracle utiliza un conjunto de procesos concurrentes que son compartidos por todos los usuarios. Adems existen estructuras de memoria que son utilizadas para almacenar los datos de las consultas ms recientes. Estas reas de memoria ayudan a mejorar el rendimiento de la base de datos decrementando la cantidad de I/O realizado contra los datafiles. Una instancia de base de datos es un conjunto de estructuras de memoria y procesos concurrentes que accesa un conjunto de archivos de base de datos. Los parmetros que determinana el tamao y composicin de una instancia son almacenados en un archivo llamado init.ora. Este archivo es ledo durante el arranque de la base de datos y puede ser modificado or el DBA. Cualquier modificacin hecha a este archivo hasta la prxima vez que se arranque la base de datos. El archivo init.ora normalmente se llama init+nombre de la instancia.ora, asi por ejemplo si la base de datos se llama DESA, entonces el archivo de configuracin se llamar initDESA.ora. Un segundo archivo de configuracion, config.ora, es usado para almacenar caracteristicas que NO cambian despues de creada la base de datos, tales como el tamao del bloque. Al igual que el init.ora, siguiendo el ejemplo el config.ora se llamar configDESA.ora. Para que la configuracion del config.ora sea utilizada, en el init.ora debe haber un parametro que se llama IFILE el cual debe tener el nombre y ruta del config.ora. En resumen de un mismo servidor podra haber ms de una instancia de Oracle, pero slo una copia del software de base de datos. Aunque lo ms comun es que haya una instancia por servidor y dependiendo del tamao de la empresa varios servidores cada uno con una instancia de Oracle, corriendo cada uno distintos conjuntos de datos, por ejemplo un servidor con el sistema de Recursos Humanos y otro con el sistema de Administracin Financiera.
Ademas de estos tipos de datos, en Oracle8 se pueden definir tipos de datos creados por el usuario segn se requiera, aunque siempre basados en los explicados anteriormente que son los bsicos.
Restricciones o Constraints
Una tabla puede tener constraints sobre ella, cuando un constraint es aplicado a una tabla, cada fila de la tabla debe satisfacer las condiciones especificadas en la definicin del constraint. En el siguiente create table, se crea una tabla empleados con varios constraints: Create table employee (empno number(10) primary key, name varchar2(40) not null, deptno number(2) default 10, salary number(7,2) check salary < 1000000, birth_date date, soc_sec_num char(9) unique foreign key(deptno) references dept.deptno) tablespace users; Primero, notemas que a la tabla se le da el nombre de EMPLOYEE, cada columna tiene un nombre (empno, name, etc), cada columna tiene un tipo de datos y una longitud. La llave primaria de la tabla es un constraint que se utiliza para identificar en forma nica cada fila, en el ejemplo definimos el empno como su llave primaria. Por otro lado vemos el constraint NOT NULL aplicado al nombre, esto significa que la base de datos validar que no sea posible meter un empleado con nombre nulo. Otro constraint interesante es el unique, el cual hace que el campo soc_sec_num sea unico dentro de la tabla, esto lo implemente la base de datos creando un ndice nico. Por ltimo tenemos el constraint foreign key, este se utiliza para que la base de datos valide la integridad referencial automticamente, esto es que el usuario no pueda crear un empleado en un departamento inexistente!. En la vida real muchas veces se requiere por ejemplo conocer todos los empleados de un departamento, es por esto que casi siempre que un campo se utiliza para hacer referencia tambin se crea un ndice por este campo para mejorar el rendimiento de consultas tpicas; en el caso de nuestro ejemplo deberamos crear un indice por deptno en la tabla EMPLOYEE.
Se puede utilizar los tipos de datos definidos por el usuario para estandarizar el uso de datos dentro de nuestras aplicaciones. Por ejemplo se puede utilizar el tyipo name_ty en lugar de otros tipos de datos: Create table employee (empno number(10) primary key name name_ty, deptno number(2) default 10, salary number(7,2) check salary < 1000000, birth_date date, soc_sec_num char(9) unique foreign key(deptno) references dept.deptno) tablespace users;
Particiones
A partir de Oracle8 se pueden especificar rangos que la base de datos utiliza para partir una tabla muy grande en tablas ms pequeas. Estas tablas ms pequeas, llamadas particiones, son ms fciles de manejar que tablas muy grandes. Por ejemplo, podemos utilizar el truncate sobre una particion sin truncar los datos de otras particiones. Las particiones tambien mejoran el rendimiento de una aplicacin. Debido a que el optimizador conoce los rangos de valores usados para crear la particin, es capaz de dirijir las consultas para utilizar slo ciertas particiones durante el acceso a las tablas. Como se leen menos datos durante el procesamiento de la consulta, el rendimiento de la consulta mejora. Tambin se pueden particionar ndices igual que las tablas. Si los rangos de valores de las particiones del indice son los mismos de la tabla particionada se llama un local index; si las particiones del ndice son diferentes a las de la tabla se llama un global index.
Un ejemplo de tabla particionada sera: create table employee( empno number(10) primary key, name varchar2(40), deptno number(2), salary number(7,2), birth_date date, soc_sec_num varchar2(9), constraint fk_deptno foreign key(deptno) references dept(deptno)) partition by range(deptno) ( partition part1 values less than (11), tablespace part1_ts, partition part2 values less than (21), tablespace part2_ts, partition part3 values less than (31), tablespace part3_ts, partition part4 values less than (MAXVALUE), tablespace part4_ts);
Usuarios
Una cuenta de usuario no es una estructura fsica en la base de datos, pero tiene una gran importancia en sus relaciones con los objetos en la base de datos, los dueos de los objetos son usuarios. Asi por ejemplo el usuario SYS posee el diccionario de datos, donde se almacena informacin sobre el resto de estructuras de la base de datos. Cuando se crean los objetos de una aplicacin, se crean bajo una cuenta de usuario, adems a cada cuenta de usuario se le puede especificar el tablespace por defecto que debe utilizar.
Esquemas
Un conjunto de objetos propiedad de una cuenta de usuario se llama esquema. Se pueden crear cuentas de usuarios que no tengan la capacidad de conectarse a la base de datos. Tales cuentas de usuario proveen un esquema para contener un conjunto de objetos separado de los esquemas de usuarios. Por ejemplo si tenemos un Sistema de Inventarios y creamos un usuario INV para almacenar sus objetos, INV sera un esquema, el cual no debe ser accesado directamente por INV excepto en la creacin; en produccin slo debe ser accesado por usuarios con permisos para hacerlo.
ndices
En una base de datos relacional, la localizacin fsica de una fila es IRRELEVANTE, a menos por supuesto que la base de datos necesite encontrarla. Para que sea posible encontrar los datos, cada fila en la tabla tiene un pseudocolumna llamada RowID. Este RowID le indica a la base de datos exactamente donde se encuentra la fila (por archivo, bloque dentro del archivo y fila dentro del bloque). Un ndice es una estructura utilizada por el servidor para encontrar una fila rpidamente dentro de una tabla. Existen tres tipos de ndices: ndices de cluster, ndices de tablas y ndices bitmap. Un ndice contiene una lista de entradas, cada entrada consiste de un valor llave y un RowId. El valor llave es el valor de una columna en una fila o la combinacin de varias. Las entradas en los ndices de cluster y tablas son almacenados utilizando estructuras B*tree garantizando una ruta de acceso corta al valor llave. El I/O requerido para encontrar una llave es mnimo y una vez encontrado el RowID es utilizado para accesar directamente la fila. Los ndices se utilizan para mejorar el rendimiento y para asegurar la unicidad de una columna. Oracle automticamente crea un ndice cuando se especifican las clasulas UNIQUE o PRIMARY KEY en un create table. Adems se pueden crear ndices adicionales utilizando el comando create index. A partir de la versin 7.3 de Oracle se pueden crear ndices bitmap, los cuales son muy tiles cuando los datos en alguna columna no son muy selectivos, o sea que la columna tiene pocos valores distintos. Los ndices bitmap incrementan la velocidad de bsqueda cuando se requiere buscar datos por esas columnas. Los ndices bitmap son ms efectivos cuando los datos almacenados en estas columnas son bastante estticos, por ejemplo el tipo de sexo. Un ejemplo de cmo crear un ndice bitmap sera: create bitmap index IND_BITMAP_STAT_COD_EMPLOYEE on EMPLOYEE(state_code); Grficamente un ndice bitmap se puede expresar como: FL: <1 1 1 1 1 0 0 0 0 0 > CA: <0 0 0 0 0 1 1 1 1 1> cada nmero representa una fila en la tabla EMPLOYEE. Debido a que hay 10 filas consideradas hay 10 valores bitmap mostrados. El optimizador de Oracle puede dinmicamente convertir las entradas de un ndice bitmap a valores de RowID durante el procesamiento de la consulta, esta capacidad de conversin le permite al optimizador utilizar indices normales en conjunto con los bitmap. Cuando se crean indices bitmap, Oracle comprime los bitmaps almacenados, como resultado el espacio requerido para un ndice de este tipo puede ser de slo 5 o 10% del espacio requerido por ndice normal.
Vistas
Una vista se parece a una tabla porque tiene columnas y es consultada de la misma forma que una tabla. Conceptualmente, una vista puede ser vista como una mscara que se sobrepone a una o ms tablas, tales que las columnas de la vista estn basadas en un o ms tablas subyacentes. La definicin de una vista (la cual incluye la consulta en la que est basada, el formato de las columnas y los privilegios respectivos) est almacenada en el diccionario de datos. Cuando una vista es consultada, se consultan las tablas en las que est basada y retorna los valores en el formato y orden especificados en la definicin de la vista. Debido a que no hay datos fsicos asociados con ellas, las vistas NO pueden ser indexadas. Las vistas son frecuentemente utilizadas para forzar la seguridad a nivel de filas sobre los datos, por ejemplo se puede crear una vista para que cada empleado SOLO pueda ver los datos de la tabla EMPLOYEE propios. Por ejemplo, supongamos la siguiente tabla USUARIOS_X_DEPTNO y la tabla EMPLOYEE: create table usuarios_x_deptno( empno number(10), username varchar2(10)); ahora podramos crear una vista V_EMPLOYEE: create or replace view v_employee as select * from employee e where empno in (select empno from usuarios_x_deptno where username = USER); Este esquema puede ser manipulado de acuerdo a las necesidas propias de cada institucin o empresa y aplicacin.
Procedimientos
Un procedimiento es un bloque PL/SQL que es almacenada en el diccionario de datos y es llamado por las aplicaciones segn se requiera. Los procedimientos permiten almacenar la lgica de las aplicaciones ms utilizada dentro de la base de datos. Cuando el procedimiento es ejecutado, sus sentencias son ejecutadas como una unidad. Los procedimientos no retornan un valor al programa que los llam. Los procedimientos almacenados pueden servir para reforzar la seguridad de los datos. Para lograr esto, no de grants directos de acceso a tablas a los usuarios dentro de una aplicacin. En lugar de esto, deles permiso de ejecutar procedimientos aque accesen las tablas. Cuando el procedimiento es ejecutado, se ejecuta con los privilegios del dueo del procedimiento. De esta manera los usuario sern incapaces de accesar las tablas excepto va el procedimiento.
Funciones
Las funciones as como los procedimientos son bloques de cdigo que es almacenado en la base de datos. Diferente a los procedimientos, las funciones retornan un valor al programa que las llama. Incluso pueden ser utilizadas dentro de sentencias SQL al igual que las funciones provistas por el SQL de Oracle. Por ejemplo, Oracle provee una funcin llamada substr que extrae hileras de otras hileras. Si creamos una funcion que se llama mi_substr que hace algo diferente, podramos utilizarla en un select de esta forma:
Select mi_substr(text) from dual; Slo se puede utilizar una funcin dentro una sentencia SQL si la funcin no modifica ninguna fila de la base de datos.
Paquetes Almacenados
Los paquetes son utilizados para conjuntar procedimientos y funciones en grupos lgicos. Son muy tiles ya que facilitan la administracin al conjuntar gran cantidad de procedimientos y funciones. Tienen un efecto secundario que debemos considerar, el cual es que como son almacenados en el diccionario de datos, es probable que entre ms lgica pongamos en la Base de Datos, haya que agrandar el tablespace SYSTEM. Por otra parte, los paquetes tienen la ventaja de ser compilados, por lo que su ejecucin es mucho ms rpida, adems por estar en la base de datos permanecen en memoria mientras sta no sea utilizada para otros efectos, con lo que un segundo y posteriores usuarios que hagan uso de un paquete lograrn ejecuciones mucho ms rpidas.
Triggers
Los triggers son procedimientos que son ejecutados cuando sucede un evento especificado contra una tabla de la base datos. Se pueden utilizar para aumentar la integridad referencial, reforzar la seguridad o mejorar las opciones de auditora. Existen dos tipos de triggers: Statement triggers: Row triggers Se disparan una vez por cada sentencia. Se disparan una vez por cada fila afectada en la sentencia.
Para cada uno de estos tipos se puede crear un trigger AFTER y uno BEFORE para cada evento disparador que son tres: INSERT, UPDATE y DELETE.
Database links
Las bases de datos Oracle tienen la capacidad de referenciar datos que se encuentran fuera de la base de datos local. Cuando se referencian tales datos, se debe calificar el objeto remoto en forma completa. Las ligas de base de datos pueden ser pblicas (disponibles para todas las cuentas de la base) o privadas (solo para el usuario que la cre). Cuando se crea una liga de base de datos se debe indicar el usuario y el password a la que se desea conectar as como el nombre del servicio (SQL*Net tnsnames.ora) asociado a la base de datos remota. Si no se indica el usuario y el password, Oracle intentar conectarse con el usuario y password locales, los cuales de no existir en la base de datos remota producir un error. Por ejemplo: Create public database link mi_liga Connect to HR identified by ab1yu Using DBONE;
Sinnimos
Para identificar completamente un objeto de base de datos en una base de datos distribuda, se debe especificar el servidor, la instancia, el dueo y el nombre del objeto. Dependiendo de la localizacin del objeto entre uno y cuatro de estos parametros son requeridos. Para aislar este proceso del usuario y proveer un acceso transparente al usuario sin importar dnde se encuentren los datos se utilizan los sinnimos. Existen sinonimos pblicos (vistos por todos los usuarios) y sinnimos privados (vistos slo por el dueo del sinnimo). Por ejemplo supongamos que la tabla EMPLOYEE est bajo el usuario HR, si no existieran los sinnimos un usuario cualquiera tendria que digitar: select * from HR.EMPLOYEE; En cambio si creamos un sinnimo como: create public synonym employee for hr.employee; el usuario no tendra que importarle quien sea el dueo del objeto y digitara: select * from EMPLOYEE; ahora bien, la utilidad de los sinnimos va ms all; cuando tenemos ambientes realmente grandes en el que tenemos varios servidores, utilizamos los sinnimos para aislar al usuario de esta complejidad utilizando sinnimos y ligas de base de datos: create public synonym EMPLOYEE for hr.employee@mi_liga;
Privilegios y roles
Para accesar los objetos posedos por otra cuenta de usuario, se debe haber dado previamente el privilegio de accesar ese objeto. Los permisos ms comunes son insert, update, delete los cuales se otorgan sobre tablas a un usuario o rol. Tambin existe el privilegio execute para paquetes, funciones y procedimientos almacenados. Para utilizar los ndices y triggers no se dan privilegios ya que son subyacentes a las tablas mismas. Ahora bien, en una empresa o institucin existe la rotacin de personal, algo inevitable tanto como la vida y la muerte, por lo tanto si construimos un esquema de privilegios slo sobre usuarios, cuando alguno de stos abandone la empresa o cambie de puesto, la seguridad tendr que recrearse o corremos el riesgo de dejar portillos abiertos al fraude. Por esta razn existen los roles (puestos) estos nos ayudan a agrupar y definir nuestra seguridad de acuerdo a un organigrama oficial de la empresa y luego asignamos o revocamos estos roles a los usuarios segn sea necesario. Ahora veamos un caso, de un departamento tpico de contabilidad: create role r_contador_general; create role r_auxiliar_contable; create role r_secretaria_conta; digamos que tenemos las tablas: cg_maestro_cuentas, cg_movimientos, cg_resumenes podemos definir el siguiente esquema de seguridad: grant select, insert, update, delete on cg_maestro_cuentas to r_contador_general; grant select, update on cg_maestro_cuentas to r_auxiliar_contable; grant select on cg_maestro_cuentas to r_secretaria_conta; ... ahora supongamos que existen los usuarios: juan, pedro, javier, jose y maria: grant r_contador_general to juan; grant r_auxiliar_contable to pedro, javier, jose; grant r_secretaria_conta to maria; supongamos que jose renuncia y contratan a carlos para sustituirlo, la actualizacin ser muy simple: revoke r_auxiliar_contable from jose; grant r_auxiliar_contable to carlos;
Rollback segments
Para mantener la consistencia de lectura entre mltiples usuarios en la base de datos y para tener la capacidad de deshacer transacciones, Oracle debe tener un mecanismo para recontruir una imagen antes de de los datos que an no se han grabado. Oracle usa los rollback segments para cumplir con este propsito. Los segmentos de rollback crecern tanto como las transacciones que soportan. Una transaccin cualquiera en el sistema toma un segmento de rollback cuando empieza y ese ser el que utilize durante la vida de la transaccin. En un ambiente de produccin debe haber en promedio un segmento de rollback por cada cinco usuarios de modo que no haya mayores problemas con su manejo.
Dictionary Cache
Dictionary Cache
La informacin acerca de los objetos almacenados en la base de datos es almacenada en las tablas del diccionario de datos. Esta informacin incluye las cuentas de usuario, nombres de los datafiles, nombres de los segmentos, localizaciones de los extents, descripciones de las tablas y priviliegios de acceso. Cuando esta informacin es necesitada por la base de datos, por ejemplo para chequear los permisos de un usuario para accesar un tabla, las tablas del diccionario son ledas y los datos son almacenados en la SGA en el dictionary cache. Este cache tambin es manejado con el algoritmo LRU explicado anteriormente. El tamao de este cache es manejado internamente por la base de datos, es parte del shared SQL pool cuyo tamao se define con el parmetro SHARED_POOL_SIZE del archivo init.ora.
Context Areas
Dentro del area compartida de SQL, existen reas pblicas y privadas. Cada sentencia SQL emitida por un usuario requiere un rea privada de SQL, la cual existe hasta que el cursor asociado sea cerrado.
Background Process
Las relaciones entre las estructuras fsicas y las estructuras de memoria es mantenida y reforzada por los procesos concurrentes o de background. Estos varan en nmero dependiendo de la configuracin de la base de datos. Estos procesos son manejados por la base de datos y requieren muy como trabajo administrativo. En la figura anterior se muestra una configuracin tpica de Oracle con sus procesos concurrentes y estructuras fsicas y de memoria.
SMON
Cuando la base de datos arranca, el SMON (system monitor) realica la recuperacin de la base de datos si es necesario (utilizando los redo log files). Tambin limpia la base de datos, eliminando objetos transacciones que no sean necesitados por el sistema. El SMON tiene un propsito adicional, conjuntar los extents libres que estn contiguos para crear extents ms grandes. La fragmentacin del espacio libre ser vista con ms profundidad ms adelante, auqne los DBA deben realizar manualmente esta compactacin del espacio libre para algunos tablespaces ya que el SMON solo compacta el espacio libre de los tablespaces que tengan un pctincrease distinto de cero.
PMON
El PMON limpia los procesos fallidos. Libera recursos que fueron utilizados por el usuario, es responsalbe de liberar los bloqueos y hacerlos disponibles para otros usuarios. As como el SMON, el PMON se levanta peridicamente para chequear si se le necesita.
DBWR
El DBWR (database writer) es responsable de manejar el contenido del buffer de datos o data block buffer cache y el cach del diccionario. Lee los bloques de datos desde los datafiles y los almacena en la SGA. Tambin realiza escrituras en lotes de los bloques cambiados. Optimizar las actividades del DBWR (eficiencia de lectura desde los datafiles y eficiencia de lectura desde memria) constituye mucho de los efuerzos de optimizacin realizados por los DBA. Aunque existe slo un SMON y un PMON por cada instancia de base de datos, es posible tener mltiples procesos DBWR corriendo al mismo tiempo dependiendo de la plataforma y sistema operativo. Utilizar mltiples DBWR ayuda a minimizar la contencin dentro del DBWR durante consultas muy grandes que involucran varios datafiles. El nmero de DBWR es configurado con el parmetro DBWR_IO_SLAVES en el init.ora.
LGWR
El LGWR (log writer) maneja la escritura del contenido del redo log buffer hacia los redo log files que estn en lnea. Las entradas de este buffer siempre contienen el estado ms actualizado de la base de datos, debido a que el DBWR puede esperar antes de escribir los bloques cambiados a los datafiles. Los online redo log files, son escritos en forma secuencial. Si los redo log files estn espejeados el LGWR escribe simultaneamente a todas las copias.
ARCH
El LGWR escribe a los redo log files en lnea en una manera cclica, despues de llenar el primer log file, empieza a escribir en el segundo hasta que se llene y entonces empieza a escribir en el tercero. Una vez que el litmo redo log file es llenado, el LGWR sobreescribe los contenidos del primer redo log file. Cuando Oracle se corre en el modo ARCHIVELOG, la base de datos realiza una copia de cada redo log file antes de sobrescribilo. Estos redo log files archivados se escriben casi siempre a disco aunque tambien pueden ser escritos a cinta. La funcin de archivo es realizada por el proceso ARCH. Las bases de datos podran encontrar problemas de contencin durante transacciones muy pesadas, debido a que el LGWR estar tratando de escribir a un redo log file mientras el ARCH est tratando de leer otro. Pueden suceder bloqueos de la base si el disco donde se estn archivando los redo log files se llena. En este punto el ARCH se congela, lo cual previene que el LGWR pueda escribir, lo cual impide cualquier otra transaccin hasta que se libere espacio.
RECO
El proceso RECO es usado para resolver fallos en bases de datos distribuidas. El RECO intenta accesar las bases de datos involucradas en transacciones que estn en duda y resuelve las transacciones. Este proceso es slo creado si la Opcin Distribuida es soportada en la plataforma y el parmetro DISTRIBUITED_TRANSACTIONS est configurado a un valor mayor a cero en el init.ora.
SNPn
Las actualizaciones de snapshots y calendarizacion de la cola de trabajos interna confa en un proceso de background para su ejecucin. El nombre de este proceso empieza con las letras SNP y termina con un nmero o letra. El nmero de procesos SNP creados para una instancia es configurado con el parmetro JOB_QUEUE_PROCESS en el init.ora en Oracle 8 y en Oracle 7 con el parmetro SNAPSHOT_REFRESH_PROCESSES.
Estructuras Externas
Los datafiles descritos en las primeras lecciones, proveen el almacenamiento fsico para los datos de la base de datos. Aunque podemos decir que son internos y externo a la vez, internos poque estn relacionados directamente con la base de datos y externos porque son archivos fsicos.
Redo Logs
Oracle mantiene bitcoras de todas las transacciones realizadas contra la base de datos. Estas transacciones son grabadas en archivos llamados online redo log files. Estas bitcoras son usadas para recuperar las transacciones de la base de datos en el orden apropiado en el evento de una cada. Los redo log files, tambin le permite a Oracle optimizar la escritura a disco. Cuando ocurre una transaccin, es almacenada en el redo log buffer, mietrnas los bloques de datos afectados no son escritos inmediatamente a disco. Esto le permite a la base de datos realizar escrituras por lotes a los discos. Cada base de datos Oracle tiene dos o mas online redo log files. Oracle escribe a los online redo log files de manera cclica, despues de llenar el primer log file, empieza a escribir en el segundo hasta que se llene y entonces empieza a escribir en el tercero. Cuando todos estn llenos retorna al primer log file y empieza a sobreescribirlo. Si la base de datos est corriendo en modo ARCHIVELOG, entones la base de datos realiza copias de los online redo log files antes de sobreescribirlos. Estos log files archivados pueden ser utilizados luego para recuperar la base de datos. Los redo log files pueden ser espejeados parra una mayo seguridad en caso de falla mltiple de discos.
Control Files
La arquitectura total de una base de datos es mantenida por sus control files, los cuales almacenan informacin acerca de todos los archivos dentro de una base de datos. Son utilizados paa mantener las estructuras internas consistentes y guiar las operaciones de recuperacin. Debido a que los control files son CRTICOS para la base de datos, se almacenan mtiples copias en lnea. Estos archivos son almacenados tpicamente en discos SEPARADOS para minimizar el pontencial dao debido a fallas en los discos. La base de datos creara y mantendr la cantidad de control files especificado al momento de la creacin de la base de datos.
Database
Database Files
Las caractersitcas de la instancia, como el tamao de la SGA y el nmero de procesos de background, son especificados en el arranque a travs de los parmetros del archivo init.ora Este es ledo unicamente durante el arranque, cualquier cambio posterior tendr efecto hasta el siguiente arranque.
La configuracin conceptual ms simple es un servidor que accesa una base de datos en un servidor con slo un disco. En esta configuracin, todos los archivos son almacenados en el nico disco que posee, y slo hay una SGA y un conjunto de procesos de background. Esta arquitectura representa la mnima configuracin, todas las dems configuraciones son modificaciones de estas estructuras bsicas. Los archivos almacenados en disco incluyen los datafiles y el archivo de configuracin init.ora. Existen dos puntos principales de interface en la base de datos: Entre los datafiles y los procesos de background. Entre los procesos de background y la SGA Los esfuerzos de optimizacin constituyen mayoritariamente en mejorar estos puntos de interface. Si el rea de memoria dedicada a la base de datos es lo suficientemente grande, entonces se realizarn menos lecturas repetitivas contra los datafiles. Debido a que estos archivos estn almacenados en un solo disco en esta configuracin, se debera tratar de minimizar la cantida de accesos a los datafiles.
Unidades de Disco Database Disco 1 Database Files Disco 2 Database Files Disco 3 Database Files
Si se dispone de mltiples discos, entonces los datafiles pueden ser separados en discos separados. Esto se hace para mejorar el rendimiento, reduciendo la cantidad de contencin de I/O entre los datafiles. Durante la operacin de la base de datos, es comn que se requiera informacin de varios archivos para satisfacer una consulta. Si los archivos no estn distribudos en varios discos, entonces el sistema necesitar leer mltiples archivos en el mismo disco concurrentemente.
control_files
Si se desea agregar otro control file para mayor seguridad siga el siguiente procedimiento: Baje la base de datos. Copie uno de los control files actuales a una nueva localizacion en disco. Edite el config.ora agregando el nuevo control file. Arranque de nuevo la base de datos.
Arreglo de discos 1
Arreglo de discos 2
Muchos sistemas operativos posibilitan mantener copias duplicadas y sincronizadas de archivos a travs de lo que se llama disk shadowing conocido comunmente como mirroring. Existe dos beneficios al hacer este proceso. Primero, el conjunto adicional sirve como respaldo en caso de una falla de disco. En la mayora de los sistemas operativos, una falla de disco causa que los discos correspondientes del espejo tomen el lugar de los discos que han fallado. El segundo beneficio es la mejora en rendimiento, esto porque la mayora de los sistemas operativos que soportan esta arquitectura, pueden direccionar el I/O para usar indistintamente cualquier disco, incluso los del espejo. Esto reduce la carga por I/O en el conjunto de discos principal. El tipo de espejo mostrado en la ilustracion se conoce como RAID-1. Dependiendo del sistema operativo, existen otras opciones como RAID-3 o RAID-5.
SQL*Net V2 / Net8
TNS
Como se muestra en la figura, los drivers de Net8 confan en el protocolo de red local para lograr la conectividad entre dos servidores. Las opciones de configuracin en un ambiente en red son: Redes de bases de datos, utilizados para consultas remotas. Bases de datos distribuidas, utilizadas para transacciones remotas. Bases de datos paralelas, en la cual mltiples instancias accesan la misma base de datos. Bases de datos cliente/servidor.
Para que Net8 puede recibir y procesa las comunicacioness, el servidor debe estar corriendo un proceso llamado el listener. El proceso listener debe estar corriendo en cda servidor involucrado en la comunicacin entre bases de datos. Por ejemplo con Net8 o SQL*Net podemos realizar consultas remotas utilizando database links, esta especifica el servidor, la base de datos y el usuario a utilizar en una consulta remota. Veamos como se crea una database link: create public database link MG_HR connect to HR identified by HR using MG; Ahora bien para realizar una consulta remota utilizando la liga de base de datos: select * from empleados@MG_HR where cod_depto = 10; El concepto anterior puede ser expandido utilizando el Advanced Replication Option de Oracle para realizar actualizaciones e inserciones en forma remota, haciendo uso como en el ejemplo anterior de ligas de bases de datos. En este caso, las transacciones distribuidas son controladas por Oracle a traves del TwoPhase Commit o commit en dos fases. Si existiera un error en la red o falla un servidor, puede suceder que los datos no estn sincronizados; para esto existe un proceso background que resuelve estos problemas tan pronto como los recursos estn nuevamente disponibles. El nmero mximo de transacciones distribuidas para una base de datos se configura con el parmetro DISTRIBUITED_TRANSACTIONES, si est en cero, no se permitirn transacciones distribuidas y el proceso de recuperacin en background no ser arrancado. Cuando se dispone de multiples procesadores Oracle nos da las opciones Parallel Query y Parallel Load, en la primera una consulta puede ser realizada por multiples procesadores coordinadamente, esto mejora el rendimiento y tiempo de respuesta de las transacciones. La arquitectura Parallel Query de Oracle le permite a la base de datos paralelizar operaciones. Las operaciones que pueden tomar ventaja de esta opcin son: create table as select, create index, recorridos completos de tablas, bsquedas en ndices, ordenamientos, inserciones, actualizaciones, borrados y la mayoria de las consultas. Para configurar un servidor paralelo se parametrizan los PARALLEL_MAX_SERVERS y PARALLEL_MN_SERVERS en el init.ora valores de
En el caso de que se desee utilizar la arquitectura cliente servidor, es necesario instalar el Net8 o SQL*Net en cada PC para que puedan comunicarse:
Sistema Operativo NIC Software de Comunicaciones SQL*Net o Net8 Programas de Aplicacin Ethernet
Sistema Operativo Software de Comunicaciones Oracle Software Oracle Database SQL*Net / Net8
En este caso la carga de CPU es distribuida entre el servidor y el cliente, aunque un inconveniente muy fuerte de esta arquitectura es la gran utilizacin de red que realiza transportando datos entre el sevidor y el cliente, problema que se agudiza an ms cuando tenemos enlaces remotos de muy poco ancho de banda.
Los segmentos de datos son las reas fsicas en las cuales los datos asociados con las tablas son almacenados. Estos segmentos tienden a ser accesados muy a menudo en un ambiente en produccin. Un tablespace DATA tpico contiene todas las tablas asociadas con una aplicacin. Los altos volmenes de trfico contra estas tablas la hacen un candidato ideal para ser aisladas en un tablespace propio. Si se separan las tablas de aplicacin en su propio tablespace, significa que puede ser separado fsicamente de otros datafiles en la base de datos. Esta separacin de datafiles a traves de las unidades de discos puede mejorar el rendimiento (a travs de una menor contencin de I/O) y un manejo ms sencillo de la base de datos. Los segmentos en un tablespace DATA, tienden a fragmentarse con el transcurso del tiempo, con lo que como veremos ms adelante, al estar separado, es mucho ms fcil su desfragmentacin futura.
Otros tablespaces
Tambin puede ser necesario crear otros tablespaces como USERS, para que los usuarios creen sus objetos, aunque esto no es muy comn. Adems puede ser recomendable crear un tablespace DATA_2 e INDEXES_2, para almacenar en estos datos e ndices de poca utilizacin o muy estticos como catlogos, etc., esto aumenta el rendimiento de las aplicaciones y facilita la administracin de la base de datos. A veces puede ser necesario tambien crear un tablespace de rollback, sobretodo cuando se est en procesos de migracin, durante los cuales se hacen importaciones masivas de datos, que pueden resultar en que los segmentos de rollback definidos no sean suficientes. Para esto podemos crear un tablespace RBS_2 y antes de empezar a hacer la carga de datos ejecutamos: set transaction use rollback segment segment_name; Pueden existir dependiendo de la empresa o institucin otros tablespaces que deben ser separados como para contener los snapshots, particiones (Oracle8) o algn tablespace temporal utilizado en cargas o migraciones. Podemos decir que la configuracin lgica de la base de datos es algo de sentido comn que podemos resumir como: Tipos de segmentos que son usados en una misma manera deben almacenarse juntos. El sistema debe disearse para un uso estandarizado. reas separadas deben existir por excepciones. La contencin entre tablespaces debe debe ser minimizado. El diccionario de datos debe ser aislado.
Distribucin de los archivos de la base de datos Contencin de I/O entre los datafiles
Cuando diseamos una base de datos tal y como vimos en la clase anterior, tendremos una coleccin de tablespaces, cada una de las cuales necesitar por lo menos un datafile, se puede monitorear el I/O entre datafiles despus de que la base de datos ha sido creada, pero a menos que tengamos a mano una base de datos con cargas o sistemas similares, el DBA deber estimar la carga de I/O para cada datafile. Empiece estiamando el I/O relatvio de los datafiles. Asigne al tablespace ms activo un peso de 100, luego estime el I/O de los dems datafiles de manera relativa a este tablespace. Asigne al tablespace SYSTEM un peso de 35 y a los tablespaces de ndices un tercio del peso del tablespace asociado. Por otro lado con respecto al tablespace TOOLS, en ambientes de produccin su utilizacin es muy bajo, por lo que su peso relativo debe ser menor a 5. El tablespace RBS depende del tipo de base de datos, si se realizan muchas transacciones puede llegar a pesar hasta 75, aunque en la mayora de los casos su peso va de 10 a 40. El TEMP, en un ambiente en produccin slo se utiliza en operaciones de sort grandes, por lo que su valor depende de cmo estn implementados nuestros sistemas y puede fluctuar entre 0 y 75. Veamos un ejemplo: Tablespace DATA RBS SYSTEM INDEXES TEMP DATA_2 INDEXES_2 TOOLS
% del Total 45 18 16 15 2 2 1 1
Notese que el 94% del I/O se concentra en los cuatro tablespaces iniciales, tericamente deberamos tener cinco discos para una ptima implementacin fsica de la base de datos, dejando cuatro discos slo para los primeros cuatro tablespaces, uno para cada uno. Ahora bien como veremos ms adelante y como sucede en la vida diaria, los recursos son escasos la mayora de las veces, por lo que este caso terico no es muy comn y al final terminaremos teniendo menos discos de los que tericamente quisiramos. Incluso, en teora podriamos desear tener una controladora de disco para cada disco, optimizando mucho ms el modelo y evitando algn cuello de botello en la tarjeta controladora.
Control Files
Con respecto a estos diremos que el I/O relacionado con ellos es prcticamente nulo y de lo nico que tenemos que preocuparnos como explicamos en la clase anterior es de tener varias copias en distintos discos para prevenir su prdida en caso de fallo de discos.
Oracle Software
El I/O contra el software de Oracle no queda registrada y por lo tanto no hay una manera directa de conocer el impacto del I/O respectivo. Lo ms aconsejable es instalar el software de Oracle en un disco donde no haya datafiles, aunque en caso de que sea necesario, debemos colocar en dicho disco los datafiles que sean accesados en menor grado.
escrituras de otros archivos en el mismo disco, an si estas ocurren en momentos distintos a las lecturas o escrituras secuenciales. Existen tres procesos background de la base de datos que accesan activamente los archivos en disco: el Database Writer (DBWR), el Log Writer (LGWR) y el Archiver (ARCH) si se utiliza la opcin ARCHIVELOG. El DBWR, escribe y lee los archivos en forma aleatoria, el LGWR escribe secuencialmente y el ARCH lee y escribe secuencialmente. Eliminando las posibilidades de contencin entre estos tres procesos efectivamente elimina la contencin a nivel de la base de datos. Notese que el LGWR y el ARCH, SIEMPRE escriben a un solo archivo a la vez, mientras que el DBWR, escribe a varios archivos a la vez por lo que puede causar contencin a si mismo!. Para evitar esto en algunas plataformas como UNIX, se pueden definir varios DBWR con el parmetro DBWR_IO_SLAVES, Oracle recomienda configurar este parmetro igual al nmero de disco o hasta un mximo de dos por disco. En todo caso, no importa que hagamos, la recuperabilidad de la base de datos siempre debe ser el primer objetivo en cuenta. Una vez que estemos seguros de que podemos recuperar bajo cualquier circunstancia la base de datos, debemos preocuparnos del rendimiento, o sea no sacrifiquemos seguridad por desempeo nunca.
A continuacin listo un ejemplo de una corrida de este script en el servidor de produccin de la Mutual Guapay: Database File IO Weights ordered by Drive DRIVE FILE_NAME TOTAL_IO WEIGHT ----- ---------------------------------------- ---------- ------/i/b2 /i/b2000/dbs/data/ccd01.dbf 1647150 100.00 ***** ------sum 100.00 /d/b2 /d/b2000/dbs/instancia/temp/temp01.dbf ***** sum /g/b2 /g/b2000/dbs/data/bcgd01.dbf ***** sum /e/b2 /e/b2000/dbs/instancia/roll/roll01.dbf ***** sum /h/b2 /h/b2000/dbs/ind/bcgi01.dbf ***** sum /f/b2 /f/b2000/dbs/data/pad01.dbf /f/b2000/dbs/ind/cci01.dbf ***** sum etc... 190448 11.56 ------11.56 6.05 ------6.05 1.45 ------1.45 1.04 ------1.04 .90 .64 ------1.54
99726
23932
17127
14860 10558
Databases
Tablespaces
Datafiles
Users
Esquemas
Segmentos
Extents
igual a cero los nuevos extents creados sern exactamente del tamao especificado en el NEXT, pero si el PCTINCREASE es de X porcentaje diferente de cero, cada nuevo extent tendr un tamao igual a la suma del tamao del extent anterior ms un incremento del porcentaje especificado, de este modo los nuevos extents sern ms grandes conforme la tabla sea ms grande. El valor MAXEXTENTS permite acotar la cantidad de extents que conformarn un segmento, esta directiva es muy prctia para poder controlor el sobre-crecimiento de los objetos antes de que lleguen al mximo permitido por la base de datos o para detectar crecimientos desproporcionados y no tomados en cuenta en la fase de diseo. MINEXTENTS se complementa con el INITIAL, especificando la cantidad de extents que sern alojados adems del INITIAL cuando el objeto sea creado, los nuevos extents sern creados respetando lo indicado en el NEXT y en el PCTINCREASE. De donde toma Oracle los extents libres para asignarlos a las nuevas tablas y a las tablas que estn creciendo? Cuando un tablespace es creado, el espacio no usado por las tablas se considera espacio libre y se administrar como un extent libre, enteramente disponible para la atencin de solicitudes de nuevo espacio. Adems cuando un usuario borra un segmento, Oracle desalojar los extents componentes del segmento y los declarar extents libres. Luego del borrado, Oracle no recombina extents contiguos an cuando pertenecieron a un mismo objeto y ahora se encuentren marcados como libres, Oracle los recombinar solo si su unin crea un extents suficientemente grande para suplir una solicitud de alojamiento y esa es la nica forma de lograr un extent del tamao deseado. Obsrvese que esta poltica de administracin de espacio induce a la existencia de fragmentacin de objetos y fragmentacin de espacio libre. En versiones recientes, si al storage del tablespace se le indica un pctincrease mayor a cero, Oracle se encarga de conjuntar los extents libres que estn contiguos. Tambin podemos utilizar el siguiente comando: alter tablespace DATA coalesce; De que manera utiliza el RDBMS las directivas de la clsula storage? Cuando el objeto es creado por el usuario, Oracle crea el segmento respectivo en el diccionario de datos. La indicacin de los valores en INITIAL y MINEXTENTS implicar una importante demanda de espacio fsico contiguo en los extents libres dentro del tablespace. En primera instancia el RDBMS buscar en el espacio libre (fragmentado o no fragmantado) un extent del tamao especificado en el INITIAL de NO hallarlo combinar los extents libres contiguos en procura de crear un solo extent del tamao solicitado, de no poder construir un extent como el deseado reportar un error de creacin del objeto. Si la accin es exitosa observar el valor del MINEXTENT y continuar buscando tanto extents libres del tamao calculado (por NEXT y PCTINCREASE) hasta que se logre suplir la cantidad de extents solicitada. Los extents creados por causa del INITAL y el MINEXTENT no tiene por que ser mutuamente contiguos. Cuando la situacin es que la tabla est creciendo, el RDBMS calcular el PCTINCREASE en base al ltimo extent creado para la tabla y lo adicionar al NEXT,
luego determinar la existencia de un extents suficientemente grande para alojar el espacio demandado. En todos los casos de bqueda y creacin de extents si no se encuentra un espacio libre del tamao apropiado se reportar un error de creacin del segmento. Qu implicaciones en el rendimiento tiene la clusula storage? Cuando el crecimiento de los segmentos es manejado de modo dinmico por el RDBMS existe un alto consumo de recursos de procesamiento e I/O, de hecho, la asignacin de nuevos extents es facilmente percibida como un pico de degradacin en los tiempos de respuesta para todos los usuarios en el momento de la ampliacin. Una reiterada sucesin de este evento mostrar un sistema degradado desde la perspectiva del usuario final. La clusula storage debe ser ideada de modo que se minimize la presencia de dicho evento. Adems, el ordenamiento de los registros dentro de bloques contiguos beneficiar el full scan en tablas y range index en ndices. Cul es el precio que se paga con el uso de la clusula storage? Evidentemente no es lgico asignar todo el espacio disponible en un tablespace para que sea usado por un solo segmento. Se debe pensar que si el espacio libre alojado por los extents de una tabla es muy grande, transcurrir mucho tiempo durante el cual dicho espacio libre ser inutilizado. Adems si los extents solicitados para asignar son muy grandes existe menos probabilidad de localizar grande extensiones de bloques contiguos libres. Si por otro lado los extents son muy pequeos, el procesamiento dinmico de solicitudes de extensines ser ms frecuente, y como ya se dijo antes, repercutir negativamente en el desempeo del sistema. Es posible modificar la clusula storage en un momento posterior a la creacin de la tabla? Si es posible, para ello se utiliza la sentencia ALTER TABLE. Los valores que no pueden ser modificados son, evidentemente, el INITIAL y el MINEXTENTS. La modificacin de estos valores se aplicar para las futuras extensiones, NO para los datos ya registrados en la tabla. Existen reglas generales para la aplicacin de la clusula? Realmente no existen reglas generales, sin embargo es importante el conocimiento de las caractersticas del objetos (finalidad, actualizacin, inclusin, borrados, etc) antes de su creacin en la base de datos. Debido a que algunas condiciones supuestas en la etapa de diseo pueden ser refutadas en el mbito prctico, es importante evaluar peridicamente el complimiento de las premisas que soportanron la especificacin de la directivas de la clusula para los objetos de actividad intensiva, una vez iniciada la puesta en produccin de los sistemas.
En general se debe asignar un espacio considerable en trminos de INITAL y MINEXTENS para aquellas tablas que tienen un crecimiento acelerado, considerando un periodo de 4 meses aproximadamente. Para las tablas estticas es til estimar su tamao aproximado y reservar desde el inicio exactamente todo el espacio requerido. Con la especificacin del PCTINCREASE es posible la gestin de grandes extents a futuro, sin embargo como ya se mencion esto disminuye la probabilidad de xito al encontrar extents suficientemente grandes. Cmo se puede saber el tamao del ltimo extent asignado a un objeto? Las vistas USER_TABLES, USER_SEGMENTS y USER_EXTENTS informan sobre los valores de la clusula vigente para el objeto, la cantidad de extents y el tamao de los extents asignados. Cmo se puede estimar el tamao de una tabla o ndice? La siguientes frmulas puede resultar til para una estimacin aproximada: Para una tabla: x rows * (5 bytes + y columns * (1 byte + z)) # de bloques = -------------------------------------------------------------------------(blocksize bytes - 90 bytes) * (1 - PCTFREE/100) Tamao = # de bloques * 4096 Para un ndice:
x rows * (11 bytes + y + z) # de bloques = ------------------------------------------------------------------------------(blocksize bytes - 90 bytes) * (0.75 - PCTFREE/200) Tamao = # de bloques * 4096 donde: x= Cantidad de filas en la tabla. y=Cantidad de columnas en la tabla o en el ndice. z=El largo promedio de todas las columnas de la tabla o ndice (en bytes). blocksize=tamao de los bloques de datos = 4096. PCTFREE = Valor definido para la tabla o ndice (Ver adelante en este texto). Para qu sirven las directivas PCTFREE y PCTUSED? La anterior temtica explica la forma en Oracle administra el crecimiento los objetos frente a la demanda de espacio libre dentro de un tablespace. Adems de ello Oracle incorpora algoritmos relacionados con el manejo del espacio libre en la extensin de los bloques dentro de cada extent. Dos parmetros de manejo de espacio, el PCTFREE y el PCTUSED, permiten al diseador controlar el uso de espacio disponible para inserciones y actualizaciones de filas en los bloques de datos. Ambos parmetros pueden ser especificados durante la ejecucin de instrucciones de creacin o alteracin de objetos. El
parmetro PCTFREE es usado para indicar el porcentaje de espacio libre, dentro de un bloque, que ser reservado para actualizaciones de las filas almacenadas en dicho bloque. El PCTUSED es el parmetro que define la forma de administrar el resto del espacio libre, indicando el porcentaje mnimo de espacio del bloque que se tender a mantener lleno siempre para cada bloque, visto de otra manera el PCTUSED indicar cuando un bloque es removido o incluido en la lista de bloques libres, estar en esta lista significa estar disponible para aceptar nuevas filas. Cmo son usados los parmetros PCTFREE y PCTUSED? Cuando el objeto es creado o modificado se definen estos parmetros, el PCTFREE es una cantidad de espacio reservado que define una frontera dentro del bloque, nuevas filas sern insertadas en el bloques hasta alcanzar esta frontera, momento en el cual el bloque se consider lleno. Este espacio reservado se usar solamente para actualizaciones de las filas que se encuentran almacenadas en el bloque. PCTFREE=20 por ejemplo, indicar que en cada bloque perteneciente al objeto se reservar un 20 % del espacio para futuras actualizaciones. Antes de que la frontera del PCTFREE sea alcanzada, el espacio libre disponible puede ser usado tanto por la inclusin de nuevas filas como por la actualizacin de las filas ya existentes. Luego de que un bloque llegue a estar lleno, segn lo indicado por el PCTFREE, el bloque no ser considerado (ser excluido de la free-list) para nuevas inserciones de filas hasta que el porcentaje de espacio usado llegue a reducirse hasta un valor menor que el PCTUSED. Cuando este valor sea alcanzado el bloque ser nuevamente considerado en el proceso de inclusin de filas, para ello el bloque se agregar a la free-list del objeto
Header Espacio libre Espacio usado
El bloque se considerar nuevamente para insercin de filas hasta que el porcentaje de uso sea menor que un 40%, vlor del pctused.
Qu sucede si el espacio para actualizaciones dentro de un bloque no es suficiente para acomodar la modificacin? El conocido y molesto efecto de encadenamiento es manifestado en esta situacin. Por ejemplo el encadenamiento entre bloques es comn cuando se manejan campos LONG. Si el largo de fila incluyendo la modificacin puede ser suficientemente pequeo como para guardarse en algn otro bloque, la fila es migrada en su totalidad al nuevo bloque,
sin embargo en el bloque anterior se mantendr un puntero a la nueva ubicacin. El encadenamiento y migracin de filas tiene un efecto negativo desde la perspectiva de I/O. Cmo se seleccionan los valores apropiados de PCTFREE y PCTUSED? El desempeo de algunas operaciones de base de datos puede verse mejorado mediante el uso adecuado de los parmetros en mencin. Es importante estar familiarizado con las aplicaciones, en particular es necesario saber cuales operaciones de base datos son realizadas con ms frecuencia en los objetos. Un bajo valor de PCTFREE puede mejorar el desempeo de full scans, ya que existir un promedio mayor de filas por bloque, y ser posible leer todas las filas leyendo menos bloques. Un valor bajo de PCTFREE debe ser usado en tablas query-por excelencia que carecen de la necesidad de actualizacin de sus filas. Un valor alto de PCTFREE disminuye la probabilidad de encadenamiento cuando la filas sean expandidas. Existe el riesgo de desperdicio de espacio libre. Recurdese que el PCTUSED sugiere la inclusin y eliminacin de los bloques en las listas de libres, as un valor bajo de PCTUSED har que los bloques sean retornados a las lista de libres con ms espacio disponible, ello disminuye tambin la probabilidad de encadenamiento. Un valor alto de PCTUSED reduce la cantidad de espacio libre para los bloques en la lista, ya que los bloques son retornados a la lista con poco espacio disponible. Un alto valor de PCTUSED almacena los datos de un modo ms eficiente desde la perspectiva de espacio, pero incrementa la probabilidad de encadenamiento (si no se usa un valor apropiado de PCTFREE) e incrementa el overhead de administracin de las listas de libres. Cuando un bloque es retornado a la lista de libres se ubicar al inicio de la lista, por ello un valor adecuado de PCTUSED permitir garantizar que el espacio liberado por DELETEs . Generalmente los ndices no son modificados por ello es recomandable el uso de un bajo PCTFREE.
Operaciones rutinarias de manejo fsico de archivos de Oracle Cmo cambiar el tamao de los datafiles
En Oracle 7.2 o superiores, los datafiles existentes pueden ser redimensionados, ya sea para hacerlos ms grandes o ms pequeos, si errneamente se asign demasiado espacio para un datafile. alter tablespace DATA datafile /f/oracle/data/data01.dbf resize 200M; Tambin tenemos a partir de esta versin opciones a la hora de crear un datafile para manejar un crecimiento dinmico: create tablespace DATA datafile /f/oracle/data/data01.dbf size 200M autoextend on next 10M maxsize 250M;
5. Ejecutar en Unix, vi createXXXX.sql, adecelo al nombre XXXX que usted haya elegido:
spool createdbTEST set echo on connect INTERNAL/manager startup nomount pfile=$ORACLE_HOME/dbs/initTEST.ora CREATE DATABASE TEST LOGFILE '$ORACLE_HOME/dbs/redoTEST01.log' SIZE 1024K, '$ORACLE_HOME/dbs/redoTEST02.log' SIZE 1024K MAXLOGFILES 32 MAXLOGMEMBERS 2 MAXLOGHISTORY 1 DATAFILE '$ORACLE_HOME/dbs/systemTEST01.dbf' SIZE 50M MAXDATAFILES 254 MAXINSTANCES 1 CHARACTER SET WE8ISO8859P1 NATIONAL CHARACTER SET WE8ISO8859P1; ALTER DATABASE DATAFILE '$ORACLE_HOME/dbs/systemTEST01.dbf' AUTOEXTEND ON; CREATE ROLLBACK SEGMENT SYSROL TABLESPACE "SYSTEM" STORAGE (INITIAL 100K NEXT 100K); ALTER ROLLBACK SEGMENT "SYSROL" ONLINE; CREATE TABLESPACE RBS DATAFILE '$ORACLE_HOME/dbs/rbsTEST01.dbf' SIZE 12M DEFAULT STORAGE ( INITIAL 1024K NEXT 1024K MINEXTENTS 2 MAXEXTENTS 121 PCTINCREASE 0); ALTER DATABASE DATAFILE '$ORACLE_HOME/dbs/rbsTEST01.dbf' AUTOEXTEND ON;
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 1 MAXEXTENTS 300 PCTINCREASE 1); CREATE TABLESPACE USERS DATAFILE '$ORACLE_HOME/dbs/usersTEST01.dbf' SIZE 3M DEFAULT STORAGE ( INITIAL 50K NEXT 50K MINEXTENTS PCTINCREASE 1);
MAXEXTENTS
121
ALTER DATABASE DATAFILE '$ORACLE_HOME/dbs/usersTEST01.dbf' AUTOEXTEND ON; CREATE TABLESPACE TEMP DATAFILE '$ORACLE_HOME/dbs/tempTEST01.dbf' SIZE 20M DEFAULT STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 1 MAXEXTENTS 121 PCTINCREASE 0) TEMPORARY; ALTER DATABASE DATAFILE '$ORACLE_HOME/dbs/tempTEST01.dbf' AUTOEXTEND ON; CREATE TABLESPACE INDX DATAFILE '$ORACLE_HOME/dbs/indxTEST01.dbf' SIZE 10M DEFAULT STORAGE ( INITIAL 50K NEXT 50K MINEXTENTS PCTINCREASE 1);
MAXEXTENTS
121
ALTER DATABASE DATAFILE '$ORACLE_HOME/dbs/indxTEST01.dbf' AUTOEXTEND ON; CREATE TABLESPACE OEM_REPOSITORY DATAFILE '$ORACLE_HOME/dbs/oemrepTEST01.dbf' SIZE 5M AUTOEXTEND ON NEXT 25M MAXSIZE 80M MINIMUM EXTENT 128K DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0); CREATE PUBLIC ROLLBACK SEGMENT RB0 TABLESPACE RBS STORAGE (INITIAL 100K NEXT 250K); CREATE PUBLIC ROLLBACK SEGMENT RB1 TABLESPACE RBS STORAGE (INITIAL 100K NEXT 250K); ALTER ROLLBACK SEGMENT "RB0" ONLINE; ALTER ROLLBACK SEGMENT "RB1" ONLINE; alter user sys temporary tablespace TEMP; alter user system temporary tablespace TEMP; @$ORACLE_HOME/rdbms/admin/catalog.sql; @$ORACLE_HOME/rdbms/admin/catexp7.sql @$ORACLE_HOME/rdbms/admin/catproc.sql @$ORACLE_HOME/rdbms/admin/caths.sql connect system/manager @$ORACLE_HOME/sqlplus/admin/pupbld.sql
# # $Header: init.ora 05-jun-97.14:56:46 hpiao Exp $ # # Copyright (c) 1991, 1997 by Oracle Corporation # NAME # init.ora # FUNCTION # NOTES # MODIFIED # hpiao 06/05/97 - fix for 803 # glavash 05/12/97 - add oracle_trace_enable comment # hpiao 04/22/97 - remove ifile=, events=, etc. # alingelb 09/19/94 - remove vms-specific stuff # dpawson 07/07/93 - add more comments regarded archive start # maporter 10/29/92 - Add vms_sga_use_gblpagfile=TRUE # jloaiza 03/07/92 - change ALPHA to BETA # danderso 02/26/92 - change db_block_cache_protect to _db_block_cache_p # ghallmar 02/03/92 - db_directory -> db_domain # maporter 01/12/92 - merge changes from branch 1.8.308.1 # maporter 12/21/91 - bug 76493: Add control_files parameter # wbridge 12/03/91 - use of %c in archive format is discouraged # ghallmar 12/02/91 - add global_names=true, db_directory=us.acme.com # thayes 11/27/91 - Change default for cache_clone # jloaiza 08/13/91 merge changes from branch 1.7.100.1 # jloaiza 07/31/91 add debug stuff # rlim 04/29/91 removal of char_is_varchar2 # Bridge 03/12/91 - log_allocation no longer exists # Wijaya 02/05/91 - remove obsolete parameters # ############################################################################## # Example INIT.ORA file # # This file is provided by Oracle Corporation to help you customize # your RDBMS installation for your site. Important system parameters # are discussed, and example settings given. # # Some parameter settings are generic to any size installation. # For parameters that require different values in different size # installations, three scenarios have been provided: SMALL, MEDIUM # and LARGE. Any parameter that needs to be tuned according to # installation size will have three settings, each one commented # according to installation size. # # Use the following table to approximate the SGA size needed for the # three scenarious provided in this file: #
# -------Installation/Database Size-----# SMALL MEDIUM LARGE # Block 2K 4500K 6800K 17000K # Size 4K 5500K 8800K 21000K # # To set up a database that multiple instances will be using, place # all instance-specific parameters in one file, and then have all # of these files point to a master file using the IFILE command. # This way, when you change a public # parameter, it will automatically change on all instances. This is # necessary, since all instances must run with the same value for many # parameters. For example, if you choose to use private rollback segments, # these must be specified in different files, but since all gc_* # parameters must be the same on all instances, they should be in one file. # # INSTRUCTIONS: Edit this file and the other INIT files it calls for # your site, either by using the values provided here or by providing # your own. Then place an IFILE= line into each instance-specific # INIT file that points at this file. ############################################################################### # replace DEFAULT with your database name db_name=XXXX db_files = 80 # db_files = 400 # db_files = 1000 db_file_multiblock_read_count = 8 # db_file_multiblock_read_count = 16 # db_file_multiblock_read_count = 32 db_block_buffers = 100 # db_block_buffers = 550 # db_block_buffers = 3200 shared_pool_size = 3500000 # shared_pool_size = 5000000 # shared_pool_size = 9000000 log_checkpoint_interval = 10000 processes = 50 # processes = 100 # processes = 200 parallel_max_servers = 5 # parallel_max_servers = 4 x (number of CPUs) # parallel_max_servers = 4 x (number of CPUs) log_buffer = 8192 # log_buffer = 32768 # log_buffer = 163840 sequence_cache_entries = 10 # sequence_cache_entries = 30 # sequence_cache_entries = 100 sequence_cache_hash_buckets = 10 # sequence_cache_hash_buckets = 23 # sequence_cache_hash_buckets = 89 # audit_trail = true # timed_statistics = true max_dump_file_size = 10240 # if you want auditing # if you want timed statistics # limit trace file size to 5 Meg each # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE # SMALL # MEDIUM # LARGE
# Uncommenting the line below will cause automatic archiving if archiving has # been enabled using ALTER DATABASE ARCHIVELOG.
# log_archive_start = true # log_archive_dest = disk$rdbms:[oracle.archive] # log_archive_format = "T%TS%S.ARC" # If using private rollback segments, place lines of the following # form in each of your instance-specific init.ora files: # rollback_segments = (name1, name2) # # # # # # If using public rollback segments, define how many rollback segments each instance will pick up, using the formula # of rollback segments = transactions / transactions_per_rollback_segment In this example each instance will grab 40/10 = 4: transactions = 40 transactions_per_rollback_segment = 10
# Global Naming -- enforce that a dblink has same name as the db it connects to global_names = TRUE # # # # # Edit and uncomment the following line to provide the suffix that will be appended to the db_name parameter (separated with a dot) and stored as the global database name when a database is created. If your site uses Internet Domain names for e-mail, then the part of your e-mail address after the '@' is a good candidate for this parameter value. # global database name is db_name.db_domain
# db_domain = us.acme.com
# FOR DEVELOPMENT ONLY, DEFAULT TO SINGLE-PROCESS # single_process = TRUE # FOR DEVELOPMENT ONLY, ALWAYS TRY TO USE SYSTEM BACKING STORE # vms_sga_use_gblpagfil = TRUE # FOR BETA RELEASE ONLY. Enable debugging modes. Note that these can # adversely affect performance. On some non-VMS ports the db_block_cache_* # debugging modes have a severe effect on performance. #_db_block_cache_protect = #event = "10210 trace name #event = "10211 trace name #event = "10235 trace name #event = "10049 trace name true context context context context forever, forever, forever, forever, level level level level 2" 2" 1" 2" # memory protect buffers # data block checking # index block checking # memory heap checking # memory protect cursors
# define parallel server (multi-instance) parameters #ifile = ora_system:initps.ora # define two control files by default control_files = (control # # # # # #
XXXX1,
control
XXXX2)
Uncomment the following line if you wish to enable the Oracle Trace product to trace server activity. This enables scheduling of server collections from the Oracle Enterprise Manager Console. Also, if the oracle_trace_collection_name parameter is non-null, every session will write to the named collection, as well as enabling you to schedule future collections from the console.
# oracle_trace_enable = TRUE
export ORACLE_SID 8. Ejecutar svrmgrl connect internal @createXXXX.sql 9. Si no hubo problemas, pruebe dentro del svrmgrl shutdown startup 10. Salga del svrmgrl, en Unix ejecute, ls -la *xxxx* , observe todos los distintos archivos que fueron creados, tales como datafiles, control files y redo logs. 11. En Unix ejecute, ps -ef | grep ora, observe los "background process" que estn corriendo.
tamao
de
datafiles,
mover
1. Conectarse a Unix con el usuario Oracle y sin password. 2. Ejecutar: mv systemXXXX01.dbf XXXXsystem01.dbf 3. Ejecutar en el svrmgrl Connect internal Startup Ver los errores que aparecen...... Shutdown abort exit 4. Ejecutar: mv XXXXsystem01.dbf systemXXXX01.dbf
8. Ahora bien, si en el disco actual no hubiera ms espacio disponible, entonces tendramos que agregar un datafile ms a este tablespace: alter tablespace USERS add datafile '$ORACLE_HOME/dbs/new_disc/users02.dbf' size 1M;
Varios scripts
9. svrmgrl y connect internal show parameters observe la cantidad de parmetros posibles que maneja la base de datos, dele una mirada y trate de imaginarse para que sirve cada uno..... select tablespace_name, segment_name, status from dba_rollback_segs; select tablespace_name from dba_tablespaces; select tablespace_name, sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; select tablespace_name, file_name, bytes/1024/1024 from dba_data_files; select username from dba_users; select username, default_tablespace, temporary_tablespace, profile from dba_users; select * from dba_profiles; de los anteriores scripts, observe cada resultado, piense en la utilidad que podran tener eventualmente..... 10. En Unix ejecute: sqlplus system/odin 11. Ahora cree los siguientes usuarios: Create user RH Identified by RH Default tablespace users Temporary tablespace temp Quota unlimited on users; Create user fernando Identified by fernando Default tablespace users Temporary tablespace temp Quota unlimited on users; Create user pedro Identified by pedro Default tablespace users Temporary tablespace temp Quota unlimited on users;
9. En unix ejecute: sqlplus prueba/prueba 10. Ahora creemos una tabla de ejemplo: Create table emp( Deptno number(5), Empno number(5), Name varchar2(30), Salary number(11,2), Mgr_no number(5), Birth_date date); Alter table emp Add constraint pk_emp Primary key(empno); Utilizando la sentencia insert de SQL, metale algunos datos de prueba a esta tabla. 11. Ahora conectese en sqlplus como system/odin: Create role gerente; Create role empleado; Grant gerente to fernando; Grant empleado to pedro; 12. Ahora conectese en sqlplus como usuario RH/RH: Grant select, insert, update, delete on emp to gerente; Grant select on emp to empleado; 13. Ahora conectese como fernando/fernando en sqlplus y trate de consultar, borrar o insertar datos nuevos en la tabla RH.emp 14. Luego conectese como pedro/pedro en sqlplus y trate de consultar, borrar o insertar datos en la tabla RH.emp
permite luego de ejecutar una consulta ver si se utiliza o no algn ndice y en que forma est siendo utilizado. Para poder utilizar esta facilidad debemos ejecutar primero un script que se llama UTLXPLAN.sql, el cual normalemente se encuentra en el directorio $ORACLE_HOME/rdbms/admin. Por ejemplo el query: Select * from employee Where city > 'Y%'; producira el siguiente resultado: ------------------------------SELECT STATEMENT TABLE ACCESS BY ROWID EMPLOYEE INDEX RANGE SCAN CITY_ST_ZIP_NDX Para leer el plan, lea el orden de las operaciones desde adentro hacia fuera de la jerarqua. En el caso de ejemplo nos dice que hace un "range scan" del ndice, lo cual una bqueda dentro de un rango de valores, lo cual es mejor que leer toda la tabla. Cuando se evalan los resultados del plan, deberamos asegurarnos que los ndices ms selectivos (o sea los ms cercanos a valores nicos) sean utilizados por el query. Si se utiliza un ndice no muy selectivo, estaramos forzando a la base de datos a realizar lecturas innecesarias para resolver la consulta. Si la aplicacin est orientada a trabajos en lotes (data-warehouse), debemos enfocarnos a mejorar el tiempo total para completar la transaccion. Mejorar el rendimiento total de una transaccin requiere realizar "full table scans" en vez de ndices. Dado que los full table scan pueden utilizar el Parallel Query Option, podramos involucrar mayores recursos computacionales en la ejecucin de la consulta, mejorando con esto el rendimiento.
Afinando sintaxis
SQL es un lenguaje declarativo, de modo que los queries pueden ser escritos de muchas maneras. Aunque se pueden obtener resultados idnticos a partir de un nmero variado de queries, el tiempo de ejecucin de cada uno puede variar dramticamente. Para ilustrar este concepto, digamos que tenemos una pequea tabla de empleados con slo 15 filas y un ndice por sexo y fecha de contratacin. Si ejecutamos el siguiente query: Select emp_name From emp Where Sex = 'F' and hiredate between sysdate -90 and sysdate; Debido a que la tabla tiene slo 15 filas, la ms eficiente manera de realizar esta consulta sera realizando un full-table scan. Sin embargo, Oracle lo realizara (talvez) recorriendo
los ndices, aunque hubiera sido ms rpido el full-table scan. Esto causa I/O adicional para leer el rbol del ndice y luego accesar las filas de la tabla. Aunque este ejemplo es muy simplista, sirve para ilustrar el concepto de que el tiempo de ejecucin del SQL es muy dependiente de la estructura del query y de los ndices.
Consideraciones de costo
El primer paso para afinar el Oracle SQL es comparar el costo relativo de cada acceso SQL. Costo 1 2 3 4 5 6 7 8 9 10 11 Tipo de Operacin Una fila por Row ID Una fila por join de cluster Una fila por hash cluster con llave primaria o ndice nico. Una fila por llave primaria o ndice nico Join de cluster Llave de hash cluster Llave de cluster indexada ndice de mltiples columnas ndice una sla columna Bsqueda con lmites en columnas indexadas Bsqueda sin lmites en columnas no indexadas
Como vemos la forma ms rapida de recuperar una fila es conociendo su RowID. Algunas aplicaciones han cado en el error de utilizar bsquedas internas utilizando el RowId, pero NO EXISTE NINGUNA garanta de que una fila est siempre en el mismo RowID, ya que como recordarn una fila puede ser migrada en cualquier momento por falta de espacio, con lo que el uso de RowID se inutiliza. Por otro lado el mayor costo es un full-table scan. Para tablas pequeas es lo ms deseable, pero puede causar verdaderos dolores de cabeza cuando un full-table scan se realiza sobre una tabla grande. Por lo tanto evitar los full-table scan es la primera consideracin a la hora de realizar afinamiento. Sin embargo, debe considerarse otra situacin, por ejemplo para un query muy complejo, un full-table scan podra ser lo ms eficiente, pero esto es hecho en contra de "otros" SQL en el sistema que puedan estar corriendo en ese momento; entonces debemos preguntarnos afinamos un query especfico? o afinamos toda la base de datos como un conjunto?. La respuesta a estas preguntas no es sencilla, debido a que cada sentencia SQL debe ser afinada individualmente, pero este afinamiento NO debe realizarse a expensas de otros queries en la base de datos.
Como pueden ver este query est formulado para que funcione si el usuario digita el student_nbr o el social_security_nbr o ambos. Esta es una manera muy til de escribir el SQL ya que la aplicacin utiliza el mismo cdigo. Desde el punto de vista de programacin es muy conciso y claro. Desafortunadamente no se ejecuta eficientemente. Por ejemplo este query deberia reformularse como: Select student_name From student Where student_nbr = :host_student And :host_student is not null And :host_social is null UNION Select student_name From student Where social_security_nbr = :host_social And :host_social is not null And :host_student is null UNION Select student_name From student Where student_nbr = :host_student And social_security_nbr = :host_social And :host_social is not null And :host_student is not null UNION Select student_name From student Where :host_social is null And :host_student is null ;
Como podemos ver, el query original ha sido particionado en queries separaos y concatenados con el operardor UNION de SQL. Slo el cuarto query, en caso de que ambos valores en la forma sean nulos provocar un full-scan table, los otros tres utilizarn los ndices por student_nbr o social_security_nbr. Aunque reescribir este query de esta manera parece un gran esfuerzo, SI este query es para una aplicacin en lnea que es ejecutada MILES de veces al dia, la ganancia en el rendimiento bien vale la pena. Como reglas comunes podemos mencionar las siguientes para que nuestras consultas sean lo ms eficientes posible: NUNCA haga un clculo sobre (ej. WHERE salario * 5 > :mi_variable) una columna indexada
SIEMPRE que sea posible utilize UNION en vez de condiciones OR. Evite el uso de NOT IN or HAVING en la clasula WHERE. En lugar utilize la clasula NOT EXISTS. Siempre especifique valores numricos en forma numrica y valores carcter en forma carcter, o sea NO MEZCLE tipos de datos. Evite especificar NULL en una columna indexada. Evite el LIKE si se puede utilizar el =. Si su base de datos utiliza el optimizador basado en reglas (rule-based) , la posicin de las tablas en el WHERE es utilizado para escoger la tabla que va a manejar el query. Siempre ponga la tabla que ms filas va a traer de primero. Evite utilizar sub-queries cuando se puede hacer lo mismo con un JOIN. Utilize la funcin decode para minimizar el nmero de veces que una tabla es seleccionada. Para "apagar" un ndice que no quiere utilizar, concatene un string nulo a la columna indexada (ej. name||'') o agregele un cero si la columna es numrica (ej. salario+0). Si su consuta retorna ms del 20% de las filas en la tabla, utilize un full-scan table en lugar de un index-scan. SIEMPRE utilize alias de las tablas cuando referencia las columnas (ej. student.name)
ndices concatenados
Un ndice concatenado se crea basado en mltiples columnas. Este tipo de ndice puede acelerar grandemente una consulta cuando todas las columnas especificadas en el where pertenecen a un ndice. Por ejemplo, veamos el siguiente ndice: Create idnex idx1 On student (student_level, major, laste_name) ascending;
Este ndice puede ser utilizado para acelar bsquedas que hagan referencia a ambos campos, student_level y major: Select student_level From student Where student_level = 'NOGRADUADO' And major = 'computer science'; Sin embargo, algunos queries que utilizan uno u otro campo, no sern capaces de utilizar este ndice concatenado; en el siguiente ejemplo, slo el campo major es referenciado en el query: Select * From student Where major = 'computer science'; En este ejemplo, aunque el major est en el ndice, est como segunda columna, por lo que Oracle concluir que el ndice no es utilizable. Veamos este otro ejemplo: Select last_name From student Where student_level = 'PLEBE' Order by last_name; En este caso, debido a que el campo student_level es el pimer campo del ndice, la primera parte del ndice puede se leda, y el optimizador de SQL invocar un index scan.
ndices Bitmap
A partir de Oracle 7.3, podemos crear ndices bitmap, los cuales son una muy buena opcin para columnas de datos con muy pocos valores nicos, como regla general menor a 20. El ndice bitmap consume hasta 80 veces menos espacio que un ndice b-tree y provee un mejor tiempo de respuesta.
El operador NOT
El operador NOT causa que la utilizacin de un ndice sea OBVIADA causando un fullscan table en el siguiente ejemplo: Select * from student Where student_level = 'NOGRADUADO' And major != 'computer science'; Aqu la condicin NOT produce un full-scan table no deseado. Como hemos visto, muchas veces podemos provocar full-scan tables sin darnos cuenta o imaginarnoslo siquiera remotamente, para esto Oracle provee una herramienta muy til que es el EXPLAIN PLAN, el cual veremos en detalle.
EXPLAIN PLAN
Como hemos mencionado en clases anteriores antes de poder utilizar el explain plan debemos crear bajo el usuario correspondiente la tabla plan_table, cuyo script de creacin est en $ORACLE_HOME/rdbms/admin y se llama utlxplan.sql. Veamos un ejemplo de cmo utilizar esta facilidad: explain plan set statement_id = 'TEST1' for select * from student where student_nbr = 10; Es importante notar que al ejecutar en sqlplus este comando, el query no se ejecuta slo se valida contra la base de datos y se determina el plan de ejecucin, el query como tal no es ejecutado. Esto es importante para afinar querys sin esperar los resultados. Luego de haber llenado la tabla siguiente: plan_table debemos ejecutar un query como el
Set pages 9999 Select lpad(' ', 2*(level-1)) || operation operation, Options, Object_name, Position From plan_table Start with id=0 And statement_id='TEST1' Connect by prior id = parent_id;
como resultado de este query podemos ver si la consulta utiliza o no indices y en que forma, en este caso en particular utiliza la llave primaria que ha por student_nbr. Aunque el plan_table es til para determinar la ruta de acceso a los datos, por si slo no cuenta toda la historia. La configuracin de los datos es tambin una consideracin. Mientras que el optimizador de SQL conoce el nmero de filas de cada tabla (la cardinalidad) y la presencia de ndices sobre los campos, el optimizador de SQL NO conoce ciertos factores como el nmero esperado de filas retornadas de cada consulta. Existe otra herramienta, el trace de SQL, que muestra en detalle todos los recursos utilizados o consumidos durante la ejecucin de una consulta, tales como el nmero de accesos de I/O requeridos para satisfacer la consulta, el tiempo de CPU utilizado, etc. Esta la veremos ms adelante. Los posibles mtodos de acceso que podramos ver en un explain plan seran: AND-EQUAL, indica que las tablas estn siendo "joineadas" y que Oracle ser capaz de utilizar los valors de los ndices para hacer join de las filas. CONCATENATION, indica una operacin UNION.
COUNTING, indica el uso de la funcin count de SQL. FILTER, indica que la clasula where est removiendo filas no deseadas del conjunto resultante. FIRST ROW, indica que se ha declarado un cursor para la consulta FOR UPDATE, indica que las filas retornadas sern bloqueadas. INDEX (UNIQUE), indica que se utiliza un valor especfico de llave. INDEX (RANGE SCAN), indica que se busca por rangos en un ndice, usualmente al utilizar BETWEEN, LESS THAN o GREATHER THAN. INTERSECTION, indica un conjunto solucion para dos tablas joineadas. MERGE JOIN, indica que se utilizaron dos conjuntos resultantes para resolver la consulta. NESTED LOOPS, indica que la ltima operacin se realizada n veces, una por cada operacin precedente. PROJECTION, indica que slo ciertas columnas de una fila seleccionada sern retornadas SORT, indica un ordenamiento, en memoria o en el tablespace TEMP. TABLE ACCESS (ROWID), indica que una fila es accesada por ROWID. TABLE ACCESS (FULL), este es un full-table scan y es el ms lento de todos a menos que la tabla sea muy pequea. UNION, indica que probablemente se utiliz la clasula DISTINCT de SQL. VIEW, indica que una vista de SQL est involucrada en la consulta.
Optimizadores de Oracle
Oracle ofrece dos mtodos para afinar SQL, si se est usando Oracle 7.2 o superior, podemos utilizar el optimizador basado en costos, mientras que para versiones anteriores lo aconsejable es utilizar el optimizador basado en reglas. Cuando se utiliza en optimizador basado en reglas, el indexado de las talbas y el ORDEN de las clasulas dentro de cada sentencia SQL controlan las rutas de acceso. El optimizador basado en costos automticamente determina la ruta de ejecucin ms eficiente y el programador puede pasar ciertos hints para altera la ruta de acceso ya que conoce de antemano los resultados. Por default Oracle se instala con el parmetro opimizer_mode=CHOOSE, esto le indica a Oracle favorecer el optimizador basado en costos siempre y cuando las tablas involucradas en la consulta tengan estadsticas. Las estadsticas son creadas con el comando ANALYZE TABLE. Esto tiene varios problemas potenciales como son: 1. Por ejemplo en una consulta con tres tablas, si una o ms tienen estadsitcas, Oracle utilizar el optimizador basado en costos y ejecutar un
analyze tabla para las otras tablas que no tienen estadsiticas en tiempo de ejecucin retardando enormente esa consulta en particular. 2. Si, el DBA no ejecuta regularmente el analyze table, las estadsitcas estarn desactualizadas y provocarn resultados aleatorios. En general el optimizador basado en costos es la mejor opcin pero las estadsticas deben actualizarse regularmente. Para hacer esto podramos ejecutar regularmente el siguiente script: Spool runstat.sql Select 'analyze table ' || owner || '.' || table_name || ' estimate statistics sample 20%;' from dba_tables where owner not in ('SYS','SYSTEM'); select 'analyze index '|| owner || '.' || index_name || ' compute statistics;' from dba_indexes where owner not in ('SYS','SYSTEM'); spool off @runstat
Hints
Hay ocasiones en que las que el optimizador de Oracle decida no es lo mejor. Para esto tenemos a disposicin una serie de hints, los cuales son mayormente tiles cuando tenemos alguna idea del comportamiento de la aplicacin y los datos. En forma genrica podriamos hacer que para una aplicacin o sesin en particular cambiemos la forma de trabajar del optimizador: Alter session set optimizer_goal = ALL_ROWS; o Alter session set optimizer_goal = FIRST ROWS; el primero le indica al optimizador que lo que queremos es que traiga TODO lo antes posible, en cambio el segundo le indica que traiga la primera fila lo antes posible. Normalmente el primero se utilizara para procesos en lotes (generalmente nocturnos) y la segunda para aplicaciones en lnea. Adems para una query en particular podemos indicarle al optimizador hints especficos utilizando el siguiente ejemplo: select /*+ ALL_ROWS /* customer_name from customer;
en vez de ALL_ROWS podemos utilizar: ALL_ROWS, provee el mejor rendimiento global y un consumo menor de recursos, para procesos en lotes. FIRST_ROWS, provee el mejor tiempo de respuesta en lnea. INDEX(table_name index_name), obliga al optimizador a utilizar un ndice en particular. Por ejemplo: select /*+ INDEX(PK_PR_CREDITOS PR_CREDITOS) */ monto_credito from pr_creditos; RULE, indica que se utilize el optimizador basado en reglas, recuerde que el where debe estar en orden con respecto a los ndices y la tabla ms pequea debe estar a la derecha del from. hay muchas opciones ms no utilizadas frecuentemente. Debido a que los hints son codificados en las consultas como comentarios, el SQL no le indicar un error si un hint est escrito incorrectamente. Cuando utilize ALTER SESSION SET OPTIMIZER_GOAL, es importante recordar que este no tendr efecto para SQL que ya est en el shared pool de SQL, si se desea se puede ejecutar el comando ALTER SYSTEM FLUSH SHARED POOL para que regenere los SQL en el shared pool.
Afinando Sub-queries
Siempre que sea posible, el uso de un sub-query debe ser evitado en Oracle. En la mayora de los casos, el subquery puede ser remplazado por un JOIN estndar. Sin embargo hay circunstancias en las que el uso de un sub-query es inevitable. Como sabemos, Oracle en un update o delete slo permite UNA tabla, como consecuencia, la nica manera de especificar valores de otra tabla es haciendo un subquery, por ejemplo: Update table1 Set attr = 'Y' Where key in (select key from table2); Hemos dicho antes que cada quien puede escribir un query como le parezca y tengamos 30 querys que hagan lo mismo escritos en forma diferente, para el ejemplo podramos tener cuatro combinaciones bsicas, usando IN y un subquery correlacionado, IN y un subquery no-relacionado, tambin podemos usar EXISTS y un subquery correlacionado o uno no-relacionado. En esencia, un subquery correlacionado referencia la tabla externa mientras que uno norelacionado no referencia la tabla externa. Un subquery correlacionado es evaluado una vez por fila procesada en el query padre, mientras que un subquery no-relacionado se ejecuta una sla vez y, el resultado es mantenido en memoria si es pequeo o en un segmento temporal, si el resultado es grande. Un query no-relacionado que retorna un solo valores llamada un subquery scalar. En este caso el optimizador sustituye el resultado como una constante y ejecuta el subquery UNA sola vez.
Veamos un ejemplo de un mismo subquery escrito correlacionado y no-relacionado: No-relacionado select count(*) from table1 where key in (select key from table2); Correlacionado Select Count(*) From Table1 Where Key in (select key from table2 where table1.key = table2.key); Cul de estos dos ser ms eficiente? Eso depende de la cantidad de filas retornadas por el query padre y por el subquery. Debemos balancear la sobrecarga asociada con cada tipo de subquery: Subquery correlacionado: es re-ejecutado una vez por cada fila retornada en el query externo. Por lo tanto debemos asegurar que el subquery use un ndice siempre que sea posible. Subquery no-relacionado: es ejecutado una vez, y el resultado es normalmente ordenado y mantenido en un segmento temporal. Si el resultado es muy grande tendremos problemas al ordenar y almacena el resultado en un segmento temporal. Como reglas generales podemos decir: Cuando se utiliza un subquery correlacionado, los resultados son identicos para la clasula IN y EXISTS. La clasula EXISTS no es apropiada para querys no-relacionados. Cuando un query padre retorna un nmero relativamente pequeo de filas, un subquery correlacionado se ejecuta ms rapido que un subquery norelacionado. Cuando un subquery retorna un nmero pequeo de filas, un subquery norelacionado ser ms rapido que uno correlacionado.
Afortunadamente, solo cinco parmetros son de importancia para el rendimiento global de Oracle, aunque hay otros que tambin influyen: db_block_buffers, este parmetro determina el nmero de database block buffers que habr en la SGA y representa el parmetro ms importante para la memoria de Oracle db_block_size, el tamao de los bloques de base de datos pueden provocar un gran mejoramiento en el rendimiento. Mientras el valo por defecto es de 2048 bytes, las bases de datos con tablas enormes y full-scan tables vern un gran mejoramiento incrementando el db_block_size.
log_buffer, este parmetro determina la cantidad de memoria reservada para los buffers de redo log. Si hay una gran actividad de actualizacin, al log_buffer debera reservarsele ms espacio. shared_pool_size, este parmetro define el rea que es compartida por todos los usuarios en el sistema, incluye reas para SQL y cach del diccionario de datos. large_pool_size, este parmetro define un rea de memoria es utilizado exclusivamente para ordenar. Slo es valido cuando se usa el multithreaded server, pero tiene un gran impacto en el rea de memoria compartida, ya que segrega la memoria utilizada para ordenamiento del resto de reas.
Afinando la PGA
Como se ha mencionado anteriormente, la SAGA no es la nica memoria disponible para los programas. La PGA es un rea privada de memoria reservada para tareas externas. Es utilizada para mantener informacin especfica de la aplicacin, tales como valores de los cursores, reservar memoria para ordenamientos internos. Los siguientes dos parmetros influencian el tamao de la PGA: open_links, define el mximo numeo de sesiones remotas concurrentes que un proceso puede inciar. El valor por defecto es de cuatro, lo que significa que una sentencia SQL puede referenciar hasta un mximo de cuatro bases de datos dentro de un query. sort_area_size, define la mxima cantidad de memoria PGA que puede ser usada para ordenamientos en disco. Para sorts muy largos, Oracle ordenar los datos en el tablespace temporal y el area definida en el sort_area_sizee ser utilizada para manejar este proceso. Cuando se utiliza el multithreaded server, el area de sort es tomada de otra area definida por el large_pool_size.
Afinando el Ordenamiento
A menudo olvidado a la hora de afinar, el ordenamiento en Oracle se realiza implcitamente cuando ejecutamos un CREATE INDEX, ORDER BY o GROUP BY. En el momento de que una sesion empieza, se reserva una pequea ra en memoria para ser utilizada en caso de ocurrir un ordenamiento. Desafortunadamente, la cantidad de memoria debe ser la misma para todas las sesiones, no es posible agregar areas adicionales para tareas que hagan mucho sort. No obstante, el DBA debe buscar un balance que permita reservar suficiente rea de sort para evitar ordenamientos en disco para las tareas que lo requieran, aunque para la mayora de los procesos talvez no se utilize. El tamao del rea privada es determinada por el parmetro sort_area_size. El tamao de cada sort individual es especificado por el sort_area_retainde_size. Siempre que un sort no puede ser completado dentro del espacio asignado, se invocar un sort en disco, el cual utiliza el tablespace temporal. Como regla general, slo la creacin de un ndice o el ORDER BY deberan hacer sort en disco.
Los ordenamientos en disco son costos por varias razones. Primero, consumen recursos en el tablespace temporal. Oracle debe reservar bloques en el buffer para retener los bloques en el tablespace temporal. Los sorts en memoria son siempre preferibles que los sorts en disco ya que seguro retardarn esa tarea en particular e impactarn en algn grado las otras tareas concurrentes en la instancia. Tambin un excesivo ordenamiento en disco, causar un alto valor de esperas por buffers libres, paginando los bloques de otras tareas fuera del buffer. Podemos ver la cantidad de sorts en memoria y en disco ejecutando el siguiente query: Column value format 999,999,999 Select name, value from v$sysstat Where name like 'sort%'; por ejemplo: NAME --------sorts(memory) sorts(disk) sorts(rows) VALUE ---------7,019 49 3,288,608
Podemos ver que slo 49 de 7068 sorts fueron realizados en disco, lo cual es cerca de un 1%, lo cual es probablemente aceptable para un sistema en particular.
Para determinar como se est comportando actualmente la base de datos podemos correr el siguiente script, cuyo resultado DEBE ser siempre mayor a 70, sino se debe incrementar el parmetro db_block_buffers. Select trunc((1-(sum(decode(name, 'physical reads', value, 0))/ (sum(decode(name, 'db block gets', value,0))+ (sum(decode(name,'consistent gets', value,0))))) ) * 100) "Buffer Hit Ratio" from V$SYSSTAT; Esta estadstica es recolectada desde el momento que arranca la base de datos, asi que es posible que vare de un da a otro dependiendo de la carga, siempre debe tratarse de ejecutar en dias normales, no en cierres. Una cosa que podemos hacer y que puede mejorar el rendimiento ostentiblemente es parametrizar el __small_table_threshold, el cual define el tamao de las tablas o ndices que puede ser localizadas en el espacio del buffer cache, normalmente no ms del 10% de la SGA. Hoy da la mayora de las bases de datos residen en un solo servidor. En este caso podemos predicir cuanta memoria estar libre despues de calcular el consumo del Kernel de UNIX (50MB) y de la PGA, la cual podemos calcular como el tamao del sort_area_size por la cantidad de usuarios en lnea; por ejemplo si tenemos un equipo con 10 usuarios y 20MB de sort_area_size, entonces la PGA medir 200MB.
por ejemplo puede resultar: executions --------------251,272 Cache misses while executing ----------------------------------------2,409 LIBRARY CACHE MISS RATIO ------------------------------------------.0096
Cache del Diccionario El cache del diccionario es utilizado para almacenar filas de las tablas internas de Oracle, incluyendo el SQL de los paquetes. Un paquete la primera vez que se invoca va a provocar un fallo de cache, pero los otros usuarios se van a beneficiar porque lo encontrarn en memoria. El resultado del siguiente script debe ser mayor a 90, de lo contrario el remedio es incrementar el shared_pool_size: COLUMN "Data Dict. Gets" FORMAT 999,999,999 COLUMN "Data DICT. cache misses" FORMAT 999,999,999 Select Sum(gets) "Data Dict. Gets", Sum(getmisses) "Data Dict. cache misses", Trunc((1-sum(getmisses)/sum(gets)))*100) "DATA DICT RATIO" From V$ROWCACHE; por ejemplo: Data Dict. Gets --------------------409,288 Data Dict. cache misses --------------------------------11,639 DATA DICT CACHE HIT RATIO ------------------------------------------97
CACHE
HIT
Las siguientes son muy tiles para determinar si se debe reconstruir un ndice: Height, se refiere al mximo nmero de niveles encontrado dentro del ndice. Un ndice deberia tener 90% de los nodos en tres niveles, pero cuando hay mucha actualizacin y borrado pueden producirse ms niveles. Siempre que el valor de height sea mayor a 3, nos podramos beneficiar de una una reconstruccin del ndice. Del_lf_rows, se refiere al numero de hojas que han sido marcadas para ser borradas del ndice. Esto ocurre cuando existe alta activdad de update dentro del ndice e indica que el ndice debe ser reconstrudo. distinct_keys, indica el nmero de llaves distintas dentro de un ndice, a este se le llama la cardinalidad del ndice, y aquellos indices con valores menores a 20 son candidatos para ser recreados como indices bitmap. most_repeated_key, cuenta el valor que ms se repite dentro de un ndice no nico.
Para habilitar el SQL trace ejecutamos el siguiente comando: ALTER SESSION SET SQL_TRACE = TRUE; Y para desahabilitarlo: ALTER SESSION SET SQL_TRACE = FALSE;
TKPROF
El tkprof acepta como entrada un archivo de trace y produce un archivo de salida formateado, tambien puede ser utilizado para generar planes de ejecucin. Veamos un ejemplo del tkprof para el siguiente query:
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno; call count ---- ------Parse 1 Execute 1 Fetch 1 cpu ------0.16 0.00 0.03 elapsed disk query current --------- -------- -------- ------0.29 3 13 0 0.00 0 0 0 0.26 2 2 4 rows -----0 0 14
Misses in library cache during parse: 1 Parsing user id: (8) SCOTT Rows ------14 4 4 14 14 Execution Plan --------------------------------------------------MERGE JOIN SORT JOIN TABLE ACCESS (FULL) OF 'DEPT' SORT JOIN TABLE ACCESS (FULL) OF 'EMP'
La sintaxis del tkprof es: Tkprof archivo1 archivo2 explain=user/password sort=xxxx archivo1 es el archivo trace, archivo2 es el archivo de salida. xxxx es igual a uno de los siguientes: PRSCNT PRSCPU PRSELA PRSDSK PRSMIS number of times parsed CPU time spent parsing elapsed time spent parsing number of physical reads from disk during parse number of consistent mode block reads during parse
PRSCU PRSMIS EXECNT EXECPU EXEELA EXEDSK EXEQRY EXECU EXEROW EXEMIS FCHCNT FCHCPU FCHELA FCHDSK FCHQRY FCHCU FCHROW
number of current mode block reads during parse number of library cache misses during parse number of executes CPU time spent executing elapsed time spent executing number of physical reads from disk during execute number of consistent mode block reads during execute number of current mode block reads during execute number of rows processed during execute number of library cache misses during execute number of fetches CPU time spent fetching elapsed time spent fetching number of physical reads from disk during fetch number of consistent mode block reads during fetch number of current mode block reads during fetch number of rows fetched
Este paso traduce la sentencia SQL en el plan de ejecucin. Este paso incluye chequeos de autorizacin de seguridad, existencia de tablas, columnas y otros objetos referenciados. Este paso es la ejecucin de la sentencia por Oracle. Para sentencias INSERT, Execute UPDATE, DELETE este paso realiza tambin la modificacin de los datos; para setencias SELECT este paso identifica las filas seleccionadas. Fetch Este paso recupera las filas retornadas por la consulta. Este paso es slo realizado por sentencias SELECT. Las otras columnas son estadsticas combinadas para todos los parses, todos los executes y todos los fetches en la sentencia. Estos valores son 0 si el parmetro TIMED_STATISTICS est en FALSE. count cpu Nmero de veces que la sentencia fue parsed, executed o fetched.
Tiempo total de CPU en segundos para todos las llamadas de parse, execute o fetch para la sentencia. elapsed Tiempo total transcurrido en segundos para todos las llamadas de parse, execute o fetch para la sentencia disk Nmero total de bloques de datos ledos fsicamente desde los datafiles en disco para todos las llamadas de parse, execute o fetch para la sentencia query Nmero total de buffers recuperados en modo consistente para todos las llamadas de parse, execute o fetch para la sentencia. current Nmero total de buffers recuperados en el modo actual. Los buffers son recuperados en el modo actual para sentencias INSERT, UPDATE o DELETE.
Existen opciones en el tkprof, para almacena estos valores para hacer comparaciones entre diversas corridas en el tiempo.
select count(cod_persona) from personas; select /*+ index(personas pk_personas) */ count(cod_persona) from personas; select saldo from cuenta_efectivo where cod_empresa = 5; select saldo from cuenta_efectivo where num_cuenta = 10;
select saldo from cuenta_efectivo where num_cuenta=100 and cod_empresa = '1'; select saldo from cuenta_efectivo where num_cuenta=100 and cod_empresa=1; select cod_persona, nombre from personas fec_nacimiento = to_date('130999','DDMMYY'); select count(*) from cliente where estado = 'A'; where
select /*+ index(personas x) */ count(cod_persona) from personas; (observe que no da error a pesar que el indice x no existe) select * from cliente where (cod_cliente = 10 or 10=10) and (cod_oficial = 40000 or 40000=40000); (produce un full scan) select estado from cliente where (cod_cliente = '10' and 10 is not null); (es parte del query anterior pero reformulado para no usar or, y se puede completar con UNION) select count(*) from cliente where estado='A'; (note que utiliza indice para recuperar pocas filas) select count(*) from cliente where estado='V'; (note que utiliza el ndice a pesar de que recupera casi todos los datos) select count(*) from cliente where estado||'' = 'V'; (matamos el ndice para que haga un full scan. select count(*) (select cod_cliente relacionado) from personas where cod_persona from cuenta_efectivo); (query personas, cuenta_efectivo in no
where
personas,
cuenta_efectivo
where
select sum(saldo) from cuenta_efectivo x where cod_cliente in (select y.cod_cliente from cliente y where y.cod_oficial='39999' and y.cod_cliente = x.cod_cliente); (subquery correlacionado) select sum(saldo) from cuenta_efectivo x, cliente y where x.cod_cliente=y.cod_cliente and y.cod_oficial='39999'; (con join)
Si desea conocer cunto tiempo en realidad tarda un realizando puede hacer un script como el siguiente, en ejecute vi tiempos.sql y digite:
set serveroutput on declare x date; y date; z number; begin x:=sysdate; select sum(saldo) into z from cuenta_efectivo; y:=sysdate; dbms_output.put_line(to_char(yx,'9.9999999999999999999999999999999')); end; /
query unix,
slvelo y en sqlplus ejecutelo asi: @tiempos.sql el script le mostrar la diferencia en fracciones de da de la duracin del query.
Debemos tomar en cuenta que cuando ejecutamos un query, los datos que este traiga, sern almacenados temporalmente en el buffer cache, por esta razn la segunda vez que ejecutamos un mismo query, el tiempo de ejecucin va a ser mucho menor, si deseamos repetirlo en las mismas condiciones deberiamos ejecutar lo siguiente bajo el usuario system: Alter system flush shared_pool;
group by cod_persona,nombre; 8. Ejecute luego el comando: Alter session set sql_trace = false; 9. En unix ejecute: Tkprof xxx.trc salida.txt explain=prueba/prueba sort=PRSCPU 10. Observe con detenimiento el archivo salida.txt. 11. Repita el proceso de nuevo, observe la diferencia en los resultados. qu sucedi? Explique la razn de esto.
12. Entre al svrmgrl y ejecute: SVRMGRL>show SGA Observe los valores mostrados y trate de determinar de donde se calculan estos valores, observando los parmetros que estn en el archivo iniXXXX.ora. Parmetros: shared_pool_size, db_block_buffers, log_buffer 13. Ejecute el siguiente script: Column value format 999,999,999 Select name, value from v$sysstat Where name like 'sort%'; 14. Ejecute este otro script y observe el resultado: Select trunc((1-(sum(decode(name, 'physical reads',value,0))/ (sum(decode(name,'db block gets',value,0))+ (sum(decode(name,'consistent gets',value,0))))) )*100) "Buffer Hit Ratio" from v$sysstat; 15. Ejecute este script: COLUMN "LIBRARY CACHE MISS RATIO" FORMAT 99.9999 COLUM "executions" FORMAT 999,9999,999 COLUMN "Cache misses while executing" FORMAT 999,999,999 Select sum(pins) executions, sum(reloads) "Cache misses while executing", (((sum(reloads)/sum(pins)))) "LIBRARY CACHE MISS RATIO" from V$LIBRARYCACHE; 16. Y, por ltimo este otro script: COLUMN "Data Dict. Gets" FORMAT 999,999,999 COLUMN "Data DICT. cache misses" FORMAT 999,999,999 Select Sum(gets) "Data Dict. Gets", Sum(getmisses) "Data Dict. cache misses", Trunc((1-sum(getmisses)/sum(gets)))*100) "DATA DICT RATIO" From V$ROWCACHE;
CACHE
HIT
Seguridad y auditora
La seguridad y los procedimientos establecidos nos ayudan a proteger el activo de mayor crecimiento en las empresas: los datos. Y mientras que almacenar datos en la base de datos y hacerlos disponibles para todos los usuarios, tambin nos conlleva a tener la susceptibilidad de accesos no autorizados. Estos accesos deben ser prevenidos y detectados. Oracle tiene varios niveles de seguridad, y la habilidad de auditar cada nivel.
Privilegios de Objetos
El acceso a los objetos dentro de la base de datos es realizado va privilegios. Esto se realia via el comando grant. Por ejemplo si el usuario RH es dueo de la tabla emp y ejecuta el siguiente comando: grant select on emp to public; entonces todos los usuarios, tendrn la capacidad de seleccionar registros de la tabla emp de RH. Los roles (grupos de privilegios), pueden ser utilizados para simplificar la administracin de los privilegios. Para aplicaciones con gran cantidad de usuarios, los roles reducen grandemente el nmero de grants necesarios. Adems los roles puede ser protejidos via password y pueden ser habilitados o deshabilitados dinmicamente.
Creando usuarios
Cuando se crea un usuario, el objetivo es establecer una cuenta segura y til que tenga los privilegios adecuados y los seteos por defecto correctos. Cuando creamos un usuario no tiene an privilegios para conectarse, los cuales debemos otorga luego via grant. Los posible parmetros a tomar en consideracin a la hora de crear un usuario son: Parmetro Username Password Default tablespace Uso Nombre del esquema Password para lacuena, puede estar asociada a la cuenta del usuario en el sistema operativo El tablespace por defecto en el cual sern creados los objetos del usuario. Esta opcin NO le da privilegios para crear objetos, es slo un valor por defecto. El tablespace en el cual se utilizarn los segmentos temporales durante transacciones de sort. Le permite al usuario almacenar objetos en el tablespace especificado hasta un total mximo indicado por quota. Asigna un profile al usuario. Si no se asigna ninguno, se utilizar el profile estndar. Los profiles se utilizan para restringir recursos del sistema y para reforzar la administracin de las reglas aplicadas sobre los passwords.
Borrando usuarios
Un usuario puede ser borrado completamente de la base de datos con el comando DROP USER. Este comando tiene el parmetro CASCADE, el cual a su vez borra todos los objetos del usuario antes de borrar el usuario. Por ejemplo: drop user RH cascade; Cualquier vista, sinnimo, procedimiento, funcin o paquete que referencien objetos pertenecientes a este usuario sern marcados como invlidos.
CREATE [PUBLIC] DATABASE LINK CREATE PROFILE CREATE ROLE CREATE TABLESPACE CREATE USER
Crear ligas a otras bases de a Crear profiles para los usuarios Crear roles Crear tablespaces Crear nuevos usuarios
Existen ocho roles a nivel de sistema que vienen configurados con la base de datos, estos son: CONNECT, RESOURCE, DBA, IMP_FULL_DATABASE, EXP_FULL_DATABASE, SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE y DELETE_CATALOG_ROLE. El role connect, es el que tpicamente se le otorga a los usuarios. Aunque este role tiene algunas capacidades limitadas de creacin de objetos, no le otorga ninguna quota al usuario, por lo tanto si no le damos una quota no podr crear objetos. En general es mejor otorgar a los usuarios normales slo el privilegio CREATE_SESSION. El role resource se le otorga a los desarrolladores, ste tiene la mayora de los permisos requeridos normalmente por un desarrollador. El role dba incluye TODOS los privilegios a nivel de sistema. En general no debera haber ms de un usuario con role dba por base de datos. Los roles IMP_FULL_DATABASE y EXP_FULL_DATABASE son utilizados durante operaciones de import y export. En un ambiente organizacinal muy grande podriamos delegar la funcin de crear usuarios fuera del DBA para facilidad de administracin, sin otorgar ms que lo necesario para realizar esta funcion. Por ejemplo: create role account_creator; grant create_session, create user, alter user to account_creator; luego este nuevo rol se lo damos por ejemplo a alguna persona del departamento de Recursos Humanos. Tambin por razones de seguridad, podramos asignarle los roles necesarios a un usuario pero luego ejecutar el siguiente comando: alter user RH default role NONE; y luego programticamente en las aplicaciones habilitamos o deshabilitamos los roles segn se necesiten: alter user RH default role account_creator;
de esta manera si el usuario se conecta a la base de datos con una herramienta distinta como SQL*Plus, ste no tendra ningn role habilitado al momento de conectarse y por lo tanto no podra hacer mayor cosa en la base de datos.
Profiles de Usuario
Podemos utilizar profiles para configurar lmites a la cantidad de recursos del sistema y de la base de datos disponibles para el usuario, si no se especifica ninguno, se utiliza el default que asigna recursos ilimitados para los usuarios. Veamos que valores podemos definir en un profile: Recurso SESSION_PER_USER CPU_PER_SESSION CONNECT_TIME IDLE_TIME LOGICAL_READS_PER_SESSION FAILED_LOGIN_ATTEMPTS Descripcin El nmero de sesiones concurrentes que un usuario puede tener en una instancia El tiempo de CPU, en centsimos de segundo que puede utilizar una sesin El nmero de minutos que una sesin puede estar conectada a la base de datos El nmero de minutos que una sesin puede estar conectada sin ser utilizada. Nmero de bloques de base de datos que pueden ser ledos en una sesin. El nmero de intentos consecutivos de fallos de conexin que causarn que se bloquee una cuenta. El nmero de das que puede ser utilizado un password El numero de dias que deben pasar antes de que pueda ser reutilizado un password El nmero de veces que debe ser cambiado el password antes de que pueda reutilizarse el mismo. El nmero de das que una cuenta ser bloqueada si el FAILED_LOGIN_ATTEMPTS es excedido. Nmero de das de gracia que transcurren luego de ser excedido el PASSWORD_LIFE_TIME El nombre de la fncion utilizada para evaluar la complejidad del password, Oracle provee una que podemos modificar.
Los profiles son creados con el comando "create profile" y modificados con el comando "alter profile".
Debemos tomar en cuenta que tambin podemos revocar privilegios o roles de un usuario utilizando: revoke delete on emp from RH; adems si un usuario tiene el privilegio select sobre una tabla pero va rol y desea crear una vista que utiliza esta tabla, NO podr crear esa vista a menos que le demos un grant directo sobre la tabla a ese usuario. A menudo requerimos revisar que privilegios tiene otorgados un usuario o rol particular, para esto tenemos una serie de vistas: Vista del Diccionario DBA_ROLES DBA_ROLE_PRIVS DBA_SYS_PRIVS DBA_TAB_PRIVS DBA_COL_PRIVS Contenido Nombres de los roles Usuarios a los que les ha sido otorgado roles Usuarios a los que se les ha otorgado privilegios del sistema Usuarios a los cuales se les ha otorgado privilegios sobre tablas Usuarios a los cuales se les ha otorgado privilegios sobre columnas especficas de tablas Roles que han sido otorgados a otros roles Roles a los que se les ha otorgado privilegios del sistema Roles a los que se les ha otorgado privilegios sobre tablas
Por ejemplo para saber qu privilegios del sistema han sido otorgados a cules roles, podemos ejecutar el siguiente script: Select Role, Privilege, Admin_option From role_sys_privs; O para determinar qu grants se le ha otorgado a los usuarios sobre qu tablas: Select Grantee, Owner, Table_name, Grantor, Privilege, Grantable From dba_tab_privs;
Adicionalmente hay dos vistas, que listan los privilegios y roles habilitados actualmente para una sesin: SESSION_PRIVS, lista todos los privilegios del sistema disponibles para la sesin, ya sean grants directos o va rol. Lista todos los roles habiltados para la sesin.
ATTRIBUTE CHAR_VALUE
Auditando
La base de datos tiene la capacidad de auditar todas las acciones que ocurren dentro de ella. Estos registros son escritos a una tabla (SYS.AUD$) o al sistema operativo. La haiblidad de utilizar el sistema operativo depende de cul se utilize. Se pueden auditar tres distintos tipos de acciones: intentos de conexin, acceso a objetos y acciones de base de datos. Para habilitar la auditora, el archivo init.ora debe tener configurado el parmetro AUDIT_TRAIL con cualquiera de estos valores: NONE, auditora deshabilitada DB, habilita la auditora escribiendo a la tabla sys.aud$ OS, habilita la auditora utilizando la caracterstica de auditora que ofrezca el sistema operativo. Existen varias vistas para ver en forma legible los datos almacenados en sys.aud$, DBA_AUDIT_SESSION es una de ellas, por ejemplo para ver los intentos exitos o fallidos de conexin podemos ejecutar el siguiente comando: Select os_username, username, terminal, decode(returncode, '0','Connected', '1005', 'FailedNull', '1017', 'Failed', Returncode), to_char(timestamp, 'DD-MON-YY HH24:MI:SS'), to_char(Logoff_time, 'DD-MON-YY HH24:MI:SS') from dba_audit_session; Adems podemos auditar eventos u objetos especiales con el comando: audit xxxx; donde xxxx puede ser, DATABASE LINK, INDEX, PROFILE, ROLE, SESSION, TABLE, TRIGGER, TABLESPACE, etc... , o sea cada vez que se cree, borre o modifique alguno de estos, se dejar una huella en la auditora de la base de datos.
Para ver la auditora de estas acciones podemos ejecutar el siguiente script: Select Os_username, Username, Terminal, Owner, Obj_name, Action_name, Decode(returncode,'0','Success',returncode), To_char(timestamp,'DD-MON-YY HH24:MI:SS') From dba_audit_object; Tambien podemos auditar acciones especficas sobre un objeto u objetos: Audit insert on RH.emp; Audit all on RH.emp; Audit delete on RH.emp; los registros resultantes de este auditoraje quedan en la vista DBA_AUDIT_OBJECT, con esto podemos determinar con exactitud quin hizo qu cosas sobre qu tablas y en que momento especfico. Lo nico que debemos tener en cuenta es que estas tablas de auditora crecern mucho, provocando problemas en el tablespace SYSTEM, y debemos limpiar regularmente esta auditora para liberar espacio .
Respaldo y Recuperacin
Existen tres posibles mtodos para respaldar una base de datos Oracle: exports, offiline backups y online backups (ARCHIVELOG).
Respaldos Lgicos
Un respaldo lgico de la base de datos involucra leer un conjunto de registros y escribirlos a un archivo. Estos registros son ledos independientemente de su ubicacin fsica. En Oracle, el utilitario export es utilizado para realizar este tipo de respaldos.
Export
El utilitario export lee la base de datos, incluyendo el diccionario de datos, y escribe la salida a un archivo binario llamado archivo de vaciado de export. Podemos exportar TODA la base de datos (full), usuarios especficos o tablas especficas. Durante los exports, se puede escoger si queremos exportar informacin asociada a las tablas como grants, ndices y constraints. El archivo escrito por el export, contiene todos los comandos necesarios para completar la recreacin de todos los objetos escojidos. Un full export puede ser realizado para todas las tablas (llamado tambien export Completo), o slo para algunas tablas que hayan cambiado desde el ltimo export. Existen dos tipos diferentes de export incremental: Incremental y Acumulativo. El incremental exporta todas las tablas que han cambiado desde el ltimo export, mientras que el acumulativo exporta todas las tablas que han cambiado desde el ltimo full export.
Import
Una vez que los datos son exportados, puede ser importados utilizando el utilitario import. Este lee el archivo binario generado por el export y ejecuta los comandos que encuentre dentro de este. Por ejemplo estos comandos podran ser create table seguido de un insert para cargar los datos. Los datos que fueron exportados no tienen necesariamente que ser importados dentro de la misma base de datos o el mismo esquema donde se realiz el export. Podemos importar todo o parte de los datos. Si importamos un Full export en forma total, entonces todos los objetos de la base de datos, incluyendo tablespaces, datafiles y usuarios sern creados durante el import. Sin embargo, a menudo es til pre-crear los tablespaces y los usuarios de modo que podamos cambia la distibucin fsica de los objetos dentro de la base de datos.
Respaldos fsicos
Los respaldos fsicos involucran copiar los archivos que constituyen la base de datos sin importar su contenido lgico. Estos respaldos tambin se les conoce como respaldos a nivel de sistema de archivos porque conllevan utilizar utilitarios del sistema operativo para realizarlo.
Offline Backups
Los offline backups ocurren cuando la base de datos ha sido bajada normalmente (o sea, no por una falla de la instancia). Mientras la base de datos est "offline", se respaldan los siguientes tipos de archivos: Todos los datafiles Todos los control files Todos los online redo logs El archivo init.ora Es muy fcil respaldar estos achivos si utilizamos algn estndar en la estructura de directorios. Tener todos estos archivos respaldados mientras la base de datos est cerrada, nos provee una imagen COMPLETA de la base de datos tal y como exista en el momento de ser cerrada. Todos estos pueden ser restaurados posteriormene y la base de datos funcionar normalmente.
Implementacin Export
El utilitario export tiene tres niveles de funcionalidad: full, user, table. En el modo full, se exporta TODA la base de datos. Todo el diccionario de datos es ledo y se escriben los DDL necesarios para recrear completamente la base de datos. Este archivo incluye definiciones para todos los tablespaces, todos los usuarios, y todos los objetos, datos y privilegios. En el modo user, se exportan los objetos de un usuario junto con su definicin y datos. Todos los grants e ndices creados por el usuario sobre los objetos del usuario son exportados. Grants e ndices creados por otros usuarios NO son exportados en esta opcin. En el modo table, se exportan una o ms tablas especficas. La estructura de la tabla, los datos y los grants son exportados. Veamos los posibles parmetros del export y su funcionalidad: Parmetro USERID BUFFER FILE COMPRESS Descripcin Usuario y password que est ejecutando el export Tamao del buffer utilizado para recuperar las filas. Nombre del archivo que va a generar el export Es una bandera de valores Y o N que indica si el export comprime o no todos los extents de una tabla en un solo extent. Esto afecta la clasula storage de los objetos exportados. Es una bandara Y o N que indica si los grants sobre los objetos exportados tambin sern exportados. Una bandera Y o N que indica si se exportan las definiciones de los ndices. Una bandera Y o N que indica si se exportarn los datos, si se indica N, entonces slo se exportarn las definiciones DDL de las tablas. Una bandera Y o N que indica si los constraints sobre las tablas sern o no exportados. Si se pone Y, se realizar un full export. Es una lista de los usuarios a ser exportados. Lista de tablas a ser exportadas Longitud en bytes de los registros del archivo export, normalmente se deja el default a menos que requiramos pasar un export de un sistema operativo a otro distinto. Indica el tipo de export a ser realizado, los valores vlidos son : COMPLETE, CUMULATIVE, INCREMENTAL Es una bandera Y o N que indica si se realiza la opcin directa. Esta opcin se brinca el buffer cache durante el export, generando ganancias significativas de rendimiento durante el export El nombre de un archivo donde quedan todos los mensajes
INCTYPE DIRECT
LOG
PARFILE
o errores dados por el export El nombre de un archivo de texto conteniendo todos estos parmetros
INCREMENTAL
Import
El utilitario impor lee los datos del archivo generado por el export y ejecuta los comandos almacenados en l. Puede ser utilizado para restaurar selectivamente objetos o usuarios. A continuacin veamos los parmetros del import: Parmetro USERID BUFFER FILE SHOW IGNORE Descipcin Usuario y password de la cuenta que ejecuta el import. Tamao del buffer utilizado para leer datos. Nombre del archivo generado por el export Una bandera que muestra el contenido en vez de ejecutarlo Es una bandera que indica si el import debe ignorar los errorres provocados por el create cuando algn objeto ya exista. Es una bandera que indica si los grants sern importados o no. Una bandera que indica si se importarn o no los ndices. Es una bandera que indica si se importarn los datos. Si se especifica N, slo se ejecutarn los comandos DDL de creacin de los objetos. Si se especifica Y, se importar el archivo completo Una lista de usuarios cuyos objetos sern importados. (Cuando FULL=N) Lista de usuarios sobre los cuales sern restaurados los
TABLES RECORDLENGTH
INCTYPE COMMIT
PARFILE INDEXFILE
LOG ANALYZE
objetos Lista de tablas a ser restauradas Longitud en bytes de los registros del archivo export, normalmente se deja el default a menos que requiramos pasar un export de un sistema operativo a otro distinto. Indica el tipo de import a ser realizado, los valores vlidos son : COMPLETE, CUMULATIVE, INCREMENTAL Indica si el import debe hacer commit despues de cada arreglo (tamao del BUFFER), si se indice N, el import har commit despus de cada tabla. Normalmente use Y, para evitar problemas en los Rollback Segments durante el import. El nombre de un archivo de texto conteniendo todos estos parmetros Esta opcin escribe todos los comandos: create table, create cluster y create index a un archivo en luegar de ejecutar el import. Este archivo puede ser utilizado y es muy til para separar las tablas de los ndices. El nombre de un archivo donde quedan todos los mensajes o errores dados por el export Es una bandera que le indica al import si debe ejecutar los comandos analyze encontrados en el archivo export.
Una opcin muy utilizada es el Fromuser/Touser para mover datos entre usuarios, por ejemplo podramos ejecutar el siguiente comando: imp system/manager file=rh.dmp fromuser=rh touser=rh_new rows=y indexes=y;
Offline backups
En un respaldo en fro, se respaldan TODOS los archivos que constituyen la base de datos como hemos vistos previamente. Si nuestra base de datos est ubicada en un subdirectorio /discox/oracle/DEMO, donde discox puede ser disco1, disco2, etc.; en unix por ejemplo podramos ejecutar el siguiente comando para respaldar todos los archivos de la instanacia DEMO: Tar -cvf /dev/rmt/ohc /disco[1-9]/oracle/DEMO la opcin -cvf se utiliza para crear un archivo nuevo de tar. Para agregarle a este archivo el init.ora, que muy probablemente est en otra localizacin podemos ejecutar: tar -rvf /dev/rmt/ohc /orasw/app/oracle/DEMO/pfile/initDEMO.ora Estos dos comandos, ejecutados en conjunto, respaldarn todos los archivos de la base de dataos en un archivo en cinta. Antes de ejecutar los comandos anteriores debemos entrar al svrmgrl y hacer un shutdown de la base de datos.
En forma genrica podemos definir que para hacer un respaldo en caliente debemos: 1. Para cada tablespace que exista: Poner el tablespace en modo backup. Respaldar los datafiles del tablespace Restaurar el tablespace al modo normal. 2. Respaldar los archived redo logs: Temporalmente suspender el proceso de archive Determinar los archivos que existen en el directorio de archived redo logs. Restaurar el proceso de archivo. Respaldar los archived redo logs y luego borrarlos 3. Respaldar un control file utilizando el comando "alter database backup controlfile". Veamos un ejemplo reducido dentro del svrmgrl: alter tablespace SYSTEM begin backup; !tar -cvf /dev/rmt/ohc/ /db01/oracle/DEMO/system01.dbf alter tablespace SYSTEM end backup; alter tablespace RBS begin backup; !tar -rvf /dev/rmt/ohc/ /db01/oracle/DEMO/rbs01.dbf alter tablespace RBS end backup; archive log stop --Registrar cuales arch existen ... !FILES='ls /db01/oracle/arch/DEMO/arch*.dbf'; export FILES archive log start !tar -rvf /dev/rmt/0hc $FILES !rm -f $FILES alter database backup controlfile to '/db01/oracle/DEMO/DEMOcontrolfile.bck'; !tar -rvf /dev/rmt/0hc /db01/oracle/DEMO/DEMOcontrolfile.bck
Offline Backups
Fsico
Online Backups
Fsico
Recuperacin
Por ejemplo si se ha daado un datafile especfico: 1. Restaurar el archivo daado desde el respaldo de la noche anterior 2. Montar la base de datos Svrmgrl Connect internal Startup mount DEMO; 3. Dentro del svrmgrl, ejecutar Recover database esto nos preguntar por cada archived redo log, aunque existe una opcin AUTO para que la recuperacin sea mas rpida. 4. Por ltimo abrimos la base de datos: Alter database open; Tambien podemos recuperar una tabla que haya sido borrada accidentalmente importandola desde un import: Imp rh/rh tables=(emp) file=exp.dmp fromuser=rh touser=rh Existen muchas opciones adicionales de recuperacin que estn fuera del alcance de este libro pero que nos dan un nivel adicional de seguridad en caso de fallas.
Bloqueos
Oracle mantiene bloqueos a nivel de fila o tabla. Oracle nunca escalar un bloqueo hasta nivel de tabla, aunque detecte que una gran mayora de las filas en la tabla estn siendo bloqueadas. Consecuentemente, el programador debe decidir con anterioridad si bloque la tabla completa o permite que cada fila sea bloqueada individualmente. Existen dos parmetros en el init.ora que controlan el bloqueo: serializable=false y row_locking=always. Estos valores por defecto nunca deben ser cambiados excepto en casos raros. Los distintos bloqueos que utiliza Oracle pueden subdivirse en: Row Share Table Locks (RS), estos bloqueos son colocados cuando una transaccin SQL declara su intento de actualizar una tabla en modo row-share. Este tipo de bloqueo le permitir a otros queries actualizar filas en la tabla. Por ejemplo: lock table customer in row share mode; select customer_name from customer for update of customer; Row Exclusive Table Locks (RX), estos bloqueos se ejecutan automticamente contra una tabla cuando se utiliza el comando Update, Delete o Insert contra una tabla. Table Share Locks (S), este tipo de bloqueo es ejecutado cuando se utiliza el comando LOCK TABLE. Este indica que la transaccin pretende realizar actualizaciones contra algunas de las filas en la tabla y previene a otras aplicaciones ejecutarse. Share Row Exclusive Table Locks (SRX), estos bloqueos se ejecutan cuando utilizamos el comando LOCK TABLE xxxx IN SHARE ROW EXCLUSIVE MODE. Esto previene a cualquier otra tarea de colocar cualquier LOCK TABLE hasta que la tarea anterior sea completada, tambin previene cualquier intento de bloqueo a nivel de fila Exclusive Table Locks(X), este el bloqueo ms restrictivo. Este bloqueo previene todo excepto queries contra la tabla afectada. Los bloqueos exclusivos son utilizados cuando un programador desea tener control exclusivo sobre un conjunto de filas hasta que su operacin haya sido completada. lock table customer in row exclusive mode nowait;
Para entender mejor como interactan entre s los diferentes tipos de bloqueo, veamos la siguiente tabla, un valor NO, significa que no pueden existir al mismo momento. RS RS RX S SRX X YES YES YES YES NO RX YES YES NO NO NO S YES NO YES NO NO SRX YES NO NO NO NO X NO NO NO NO NO
Deadlocks
El escenario de bloqueos de Oracle asegura una integridad total de la base de datos y que actualizaciones no sobreescriban actualizaciones anterior. Sin embargo, pagamos una penalidad al utilizar bloqueos compartidos. En Oracle, cada bloqueo requiere 4 bytes de RAM, por ejemplo un select que recuper 1000 filas requerir 4000 bytes para manejo de bloqueos. Tambin se pueden producir, lo que traducido a espaol sera algo as como el abrazo mortal, deadlocks.
Tarea A
Tarea B
LOCK MANAGER
1. La tarea A, ejecuta select * from emp; (1000 shared locks) 2. La tarea B ejecuta update emp set salary = salary * 1.1; (espera que la tarea A libere sus shared locks) 3. La tarea A, ejecuta update emp set bonus_flag=1; (la tarea A ahora espera por los bloqueos exclusivos seteados por la tarea B, sin darse cuenta que la tarea A est esperando por sus bloqueos)
La mayora de los programadores no nos damos cuenta que muy comunmente los deadlocks ocurren dentro de un ndice. Es importante notar que un Select de una sla fila puede colocar ms de un bloqueo. La fila recibe un bloqueo, pero cada nodo del ndice que contiene el valor para esta fila tambien recibe un bloqueo. Cuando se ejecuta un Update o Delete tambin sucede lo mismo, se bloque la fila de datos, pero muy probablemente se localicen bloqueos en los ndices de esa tabla. Debido a que la mayora de las bases de datos comerciales slo realizan un bloqueo de una fila cuando necesitan bloquear una fila, podemos utilizar soluciones programticas para minimizar la cantidad de bloqueos utilizados durante tareas de gran actualizacin. Por ejemplo, en Oracle, un programador puede utilizar Select .... For Update, para bloquear explcitamente una fila o conjunto de filas antes de una operacin de update. Esto causar que la base de datos ejecute bloqueos exclusivos al momento de recuperar la informacin y mantendr este bloqueo hasta que la tarea sea grabada. Por ejemplo: Select * From emp Where emp_name = 'JDURAN' For update of salary; Para actualizacion muy largas, podemos bloquear una tabla completa durante la duracin de la operacin. Esto es til cuando todas las filas de la tabla van a ser actualizadas como en el siguiente ejemplo: Lock table emp in exclusive mode nowait; Update emp Set salary = salary * 1.1; Algunas veces una aplicacin necesita actualizar todas las filas en una tabla pero no es prctico bloquear toda la tabla. Una alternativa al update exclusivo, es utilizar la sentencia FETCH de Oracle para bloquear un pequeo segmento de una tabla, realizar una actualizacion, y luego liberarlas con un commit, o lo que es lo mismo hacer un cursor para traer por ejemplo todos los empleados, para cada uno hacer un update contra un cursor que haya sido hecho con la opcin "for update". Claro que este mtodo, nos provoca otros problemas, como qu pasa si detectamos un problema luego de haber procesado cierta cantidad?, ya habra muchas transacciones grabadas.
Para identificar bloqueos que estn evitando que otras tareas sean completadas podemos ejecutar el siguiente script: COLUMN username COLUMN lockwait COLUMN sql_text COLUMN object_owner COLUMN object Select b.username username, c.sid sid, c.owner object_owner, c.object object, b.lockwait, a.sql_text sql from v$sqltext a, v$session b, v$access c where a.address=b.sql_address and a.hash_value=b.sql_hash_value and b.sid=c.sid and c.owner != 'SYS'; Existen varias vistas que a veces no estn creadas, pero que su script se encuentra en $ORACLE_HOME/rdbms/admin y se llama catblock.sql, los nombres de estas vistas son: Dba_waiters Dba_blockers Dba_dml_locks Dba_ddl_locks Dba_locks format a10 format a10 format a80 format a14 format a15
Save audit 29. create table x (linea varchar2(100)); 30. audit all on x; 31. insert into x values 'askdlakdlads'; 32. commit; 33. @audit; 34. exit
Respaldo y recuperacin
35. exp userid=system/manager full=y file=curso.dmp 36. svrmgrl 37. connect internal 38. shutdown 39. exit 40. mkdir $ORACLE_HOME/respaldo 41. cd $ORACLE_HOME/dbs 42. tar -cvf $ORACLE_HOME/respaldo/copia.tar *.dbf 43. tar -rvf $ORACLE_HOME/respaldo/copia.tar init*.ora 44. tar -rvf $ORACLE_HOME/respaldo/copia.tar *control*
Bibliografa
Oracle 7 Server Concepts Manual, Oracle Corporation, 1997. Oracle 7 Server Tuning, Oracle Corporation, 1997. Oracle DBA Handbook, Kevin Loney, Osborne McGrawHill, 1998. High Performance, Oracle Tuning, Don Burleson, Coriolis Group Books, 1998