curso administración oracle

Upload: maria-dolores-garcia-garcia

Post on 13-Apr-2018

245 views

Category:

Documents


1 download

TRANSCRIPT

  • 7/25/2019 Curso Administracin Oracle

    1/145

  • 7/25/2019 Curso Administracin Oracle

    2/145

  • 7/25/2019 Curso Administracin Oracle

    3/145

  • 7/25/2019 Curso Administracin Oracle

    4/145

  • 7/25/2019 Curso Administracin Oracle

    5/145

    5

    1 Introduccin

    Resultado de solicitar varias veces un curso de administracin de Oracle.

    Mucha materia. Vamos a ver muchas cosas, pero no es exhaustivo.

    Conceptos bsicos generales, arquitectura y funcionamiento.

    Otros apartados ms especficos, tiles para el trabajo del da a da de algunos de nosotros.

    Dificultad para estructurar la informacin. Muchos conceptos se entremezclan. No se pueden explicar las estructuras de memoria sin hablarsimultneamente los procesos, ni de ndices sin ver conceptos de optimizacin y estadsticas.

    Conocimiento asistentes muy diferente. Es posible que durante las explicaciones algunos conceptos se supongan conocidos. Ante cualquier duda,

    preguntar.

    Es preferible que los asistentes no tengan ordenadores. Podemos ver ms materia.

    2 Quesunabasededatos?

    Hay distintos tipos de bases de datos. Oracle es una base de datos relacional.

    A grosso modo, es un conjunto de ficheros en los que se almacena informacin de forma estructurada en forma de tablas. Cada tabla contiene

    registros, formados a su vez por campos. Estos campos estn identificados con su nombre, tipo y tamao.

    Otros componentes que tambin forman parte de una base de datos son, entre otros, las vistas, las funciones y procedimientos, las secuencias y

    los disparadores (triggers)y los servicios necesarios para su funcionamiento.

    Trminos con los que tenemos que estar familiarizados: tabla, registro, campo, vista, procedimiento, funcin, paquete, secuencia, disparador,

    esquema, sinnimo, ndice.

    Vista: agrupacin lgica de parte de una o ms tablas.

  • 7/25/2019 Curso Administracin Oracle

    6/145

    6

    Esquema: conjunto de todos los objetos que pertenecen a un usuario.

    3

    InstalacindeOracle

    Oracle est disponible en la pgina web, sin restricciones (primera versin, sin parches)

    Hay que distinguir entre la aplicacin cliente y el servidor.

    3 de las mltiples diferencias entre la versin Standardy Entreprise:

    Particiones de tablas

    ndices bitmap

    Uso de paralelismo

    Scripts para instalaciones locales. De esta forma no es necesario tener los servicios levantados (ver servicios):

    StartOracle.bat

    netstartOracleOraDb11g_home1TNSListener

    netstartOracleServiceORCL

    pause

    StopOracle.bat

    netstopOracleServiceORCL

    netstopOracleOraDb11g_home1TNSListener

    pause

    Puntos a tener en cuenta:

    nombre (SID): identificador de la base de datos en un servidor

    Contraseas de los usuarios sysy system

  • 7/25/2019 Curso Administracin Oracle

    7/145

    7

    4 Arquitecturadelabasededatos

    Tres componentes principales:

    Ficheros: de parmetros, de datos, de control, temporales y de redo log.

    Estructuras de memoria: SGA (System Global Area)

    Procesos

    Dos trminos que causan confusin:

    Database: una coleccin de ficheros

    Instancia: conjunto de procesos y la SGA (System Global Area)

    Una base de datos (conjunto de ficheros) puede ser montada y abierta por ms de una instancia (conjunto de procesos y la SGA), aunque en la

    mayora de los casos la relacin es de 1 a 1.

    En un ordenador para pruebas podemos tener una instancia y varias bases de datos y montar y abrir una de las bases de datos. Para ello

    tendramos distintos ficheros de configuracin, cada uno de los cuales abrira una de las bases de datos. Una instancia solo puede estar conectada

    a una base de datos.

  • 7/25/2019 Curso Administracin Oracle

    8/145

    8

    La SGA contiene estructuras de datos a las que acceden los procesos, como son la cache de datos, la cache de redo de los datos modificados, los

    planes de ejecucin de SQL, etc.

    Si Oracle estuviese instalado en un servidor Unix podramos ver los procesos de fondo:

    $/bin/ps

    aef

    |grep

    ora

    En Windows, solo vemos el servicio Oracle.exe. Este servicio tiene varios hilos, uno por proceso, aunque para poder verlos necesitamos alguna

    herramienta especial.

    Esquema de conexin a Oracle:

  • 7/25/2019 Curso Administracin Oracle

    9/145

    9

    El modo de conexin ms habitual es el de servidor dedicado. En este modo, Oracle crea un proceso para cada sesin. Este proceso hace de

    interfaz entre el cliente y la base de datos. Recibe las sentencias que le enviamos, select, updates, etc., efecta las operaciones y nos devuelve las

    respuestas. El cliente "habla" directamente con el proceso dedicated servera travs de TCP/IP u otro mecanismo de comunicacin.

    Existe otro modo de trabajo: el de servidor multi-hilo(multi-threaded servero MTS). Este modo se utiliza cuando el nmero de clientes

    conectados es muy grande. Con el modo de servidor dedicado, si queremos tener 10.000 conexiones abiertas, Oracle necesitara crear 10.0000

    procesos. Con el modo MTS es posible que con 100 o 200 procesos (servidores compartidos) podamos dar servicio a esos 10.000 clientes.

    Una diferencia importante entre este modo y el modo de servidor dedicado es que los clientes no se comunican directamente con los servidores

    compartidos. En su lugar, los clientes se comunican con un proceso o conjunto de procesos llamados dispatchers. Estos dispatchersponen las

    peticiones de los clientes en una cola. El primer servidor compartido que queda libre toma la peticin de la cola, la procesa y deja el resultado en

    una cola de respuestas. El dispatcherest continuamente monitorizando la cola de respuestas para enviar los resultados a los clientes

    correspondientes.

  • 7/25/2019 Curso Administracin Oracle

    10/145

    10

    Normalmente, los servidores compartidos (procesos) se crean al levantar la base de datos.

    4.1 Conexiones

    Cuando nos conectamos a Oracle con un comando como el siguiente:

    C:\>sqlplusCURSO/curso@ORCL

    la aplicacin cliente leer el fichero tnsnames.oraque suele estar en el directorio [ORACLE_HOME]\network\adminpara averiguar la direccin del

    servidor y el modo de conexin.

    ORCL=

    (DESCRIPTION=

    (ADDRESS=(PROTOCOL

    =TCP)(HOST

    =localhost)(PORT

    =1521))

    (CONNECT_DATA=

    (SERVER=DEDICATED)

    (SERVICE_NAME=ORCL)

    )

    )

    Con esta informacin, el cliente ya puede establecer una conexin con la direccin IP localhostpor el puerto 1521.

  • 7/25/2019 Curso Administracin Oracle

    11/145

    11

    Si el servidor est bien configurado, debe haber un proceso llamado TNS Listenerque est a la escucha de nuevas peticiones de conexin.

    Si la conexin solicitada es de servidor dedicado, el listenercrea un nuevo servidor dedicado (un proceso) y el cliente es redireccionado a estenuevo proceso. La conexin est establecida.

    Si por el contrario, la conexin solicitada es de servidor compartido, el listener, que conoce los dispatchersque se estn ejecutando en el servidor,

    elegir uno y enviar al cliente los datos para que se pueda conectar a l. En ese momento, el cliente se desconecta del listenery se conecta al

    dispatcherquedando la conexin establecida.

  • 7/25/2019 Curso Administracin Oracle

    12/145

    12

    Una instancia de Oracle puede usar ambos tipos de conexiones simultneamente.

    4.2 Ficheros

    Ficheros que conforman la base de datos:

    Ficheros de datos: contienen las tablas, ndices y otros segmentos.

    Redo log files: ficheros en los que se van guardando las transacciones. Ficheros temporales: usados como almacenamiento temporal y espacio para realizar ordenaciones en disco.

    Ficheros de control: indican la localizacin de los ficheros de datos.

    El nico fichero necesario para levantar una instancia es el fichero de parmetros.

  • 7/25/2019 Curso Administracin Oracle

    13/145

    13

    4.2.1 Ficherodeparmetros

    Es un fichero de texto, conocido como fichero PFILE.

    Se suele llamar ora.ora. As, si el nombre de nuestra base de datos es ORCL, el nombre del fichero de parmetros sera

    oraORCL.ora.

    Suele estar en el directorio %ORACLE_HOME%/database.

    En muchos casos se puede comprobar que el fichero de parmetros contiene slo una lnea que apunta a otro fichero:

    IFILE='C:\oracle\product\10.2.0\db_1\database\oraORCL.ora'

    SPFILE='C:\oracle\product\10.2.0\db_1\database\spfileORCL.ora'

    Tambin podemos arrancar la base de datos manualmente especificando como parmetro del comando startupun fichero diferente:

    SQL>startuppfile='C:\oracle\pfile\init.ora'

    Ejemplo de fichero de parmetros

    db_name="ORCL"

    db_block_size=4096

    control_files=("C:\oradata\control01.ctl","C:\oradata\control02.ctl")

    nls_territory=spain

    nls_language=spanish

    El nmero de parmetros as como el nombre de estos vara entre las diferentes versiones de Oracle.

    En las versiones ms recientes de Oracle, se utiliza una variante del fichero PFILEconocida como SPFILE.

    Se debe llamar SPFILE.ora.

  • 7/25/2019 Curso Administracin Oracle

    14/145

    14

    A diferencia del anterior, este fichero est en formato binario (no se puede editar con un editor de texto).

    Podemos crear un fichero SPFILEa partir de un fichero PFILEcon el siguiente comando:

    SQL>createspfilefrompfile='C:\oracle\pfile\init.ora';

    y viceversa:

    SQL>createpfile='oraORCL.ora'fromspfile='C:\oracle\product\10.2.0\db_1\database\spfileORCL.ora';

    SQL>createpfilefromspfile;

    Si no se especifican las rutas de los ficheros, se utiliza la ruta por defecto.

    Si en el directorio %ORACLE_HOME%/databasehay un fichero de parmetros del tipo PFILE y otro del tipo SPFILE, Oracle arrancar con el SPFILE.

    Una de las ventajas del nuevo formato es que los parmetros se pueden modificar mediante el comando alter system.

    altersystemsetsessions=200scope=[SPFILE|MEMORY|BOTH]

    Si el scope (mbito, alcance)es SPFILE, el nuevo parmetro se modifica en el fichero SPFILEy se activar al reiniciar la instancia.

    Si es MEMORYse activa inmediatamente, sin modificar el fichero SPFILE.

    Si la instancia se ha arrancado con un fichero PFILEsolo se podr usar la opcin MEMORYque sera la opcin por defecto.

    Si la instancia se ha arrancado con un fichero SPFILEel valor por defecto es BOTH.

    Otra ventaja de usar un fichero SPFILEes que Oracle puede almacenar en l parmetros de ajuste internos calculados automticamente.

    Ejemplos: vamos a ver el contenido de nuestro SPFILE:

    Nota: hay que conectarse como sysdbapara poder realizar esta operacin.

  • 7/25/2019 Curso Administracin Oracle

    15/145

    15

    C:\>sqlplussys/sys@ORCLassysdba

    SQL*Plus:

    Release

    11.2.0.1.0

    Production

    on

    Jue

    Sep

    18

    10:27:32

    2014

    Copyright(c)1982,2010,Oracle. Allrightsreserved.

    Conectadoa:

    OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0 64bitProduction

    WiththePartitioningoption

    SQL>create

    pfile

    from

    spfile;

    Archivocreado.

    SQL>exit

    DesconectadodeOracleDatabase11gEnterpriseEditionRelease11.2.0.1.0 64bit

    ProductionWiththePartitioningoption

    C:\>type

    C:\oracle\product\11.2.0\dbhome_1\database\initORCL.ora

    orcl.__db_cache_size=771751936

    orcl.__java_pool_size=16777216

    orcl.__large_pool_size=16777216

    orcl.__oracle_base='c:\oracle'#ORACLE_BASEsetfromenvironment

    orcl.__pga_aggregate_target=570425344

    orcl.__sga_target=1090519040

    orcl.__shared_io_pool_size=0

    orcl.__shared_pool_size=251658240

    orcl.__streams_pool_size=16777216

    *.audit_file_dest='c:\oracle\admin\ORCL\adump'

    *.audit_trail='db'

    *.compatible='11.2.0.0.0'

    *.control_files='D:\oracle\ORCL\control01.ctl','D:\oracle\ORCL\control02.ctl'

    *.db_block_size=8192

  • 7/25/2019 Curso Administracin Oracle

    16/145

    16

    *.db_domain=''

    *.db_name='ORCL'

    *.diagnostic_dest='c:\oracle'

    *.dispatchers='(PROTOCOL=TCP)(SERVICE=ORCLXDB)'

    *.job_queue_processes=20

    *.memory_target=1660944384

    *.nls_language='SPANISH'

    *.nls_territory='SPAIN'

    *.open_cursors=300

    *.processes=150

    *.remote_login_passwordfile='EXCLUSIVE'*.sec_case_sensitive_logon=FALSE

    *.statistics_level='TYPICAL'

    *.undo_tablespace='UNDOTBS1'

    C:\>

    Vamos a modificar el valor del parmetro sessions:

    SQL>showparametersessions

    NAME TYPE VALUE

    java_max_sessionspace_size integer 0

    java_soft_sessionspace_limit integer 0

    license_max_sessions integer 0

    license_sessions_warning integer 0

    sessions integer 248

    shared_server_sessions integer

    SQL>altersystemsetsessions=200scope=SPFILE;

    Sistemamodificado.

  • 7/25/2019 Curso Administracin Oracle

    17/145

    17

    SQL>showparametersessions

    NAME

    TYPE

    VALUE

    java_max_sessionspace_size integer 0

    java_soft_sessionspace_limit integer 0

    license_max_sessions integer 0

    license_sessions_warning integer 0

    sessions integer 248

    shared_server_sessions integer

    SQL>createpfilefromspfile;

    Archivocreado.

    Podemos comprobar que el parmetro se ha establecido en el fichero SPFILEaunque todava no est activo.

    Este parmetro en concreto no se puede modificar en memoria, por lo que si intentamos usar el scopeMEMORYo BOTHnos aparecer un mensaje

    de error.

    4.2.1.1 ParmetroDB_NAME

    Es el nico parmetro obligatorio en el fichero de parmetros.

    Cuando se crea una base de datos, su nombre se almacena en los ficheros de datos, los ficheros de redo log y los ficheros de control. Si el nombre

    de la base de datos en el fichero de parmetros no coincide con el nombre de la base de datos, no se podr arrancar.

    4.2.1.2

    Parmetro

    DB_BLOCK_SIZE

    Es uno de los parmetros ms importantes de la base de datos.

    Define la unidad mnima de lectura y escritura.

  • 7/25/2019 Curso Administracin Oracle

    18/145

    18

    Se recomienda que sea mltiplo del tamao de bloque del sistema operativo.

    El tamao que utiliza Oracle cuando se instala una base de datos suele ser correcto para la mayora de los casos.

    Para averiguar el tamao de bloque del sistema operativo:

    D:\Usuarios\aruiz>fsutilfsinfontfsinfoc:

    LautilidadFSUTILrequiereprivilegiosadministrativos.

    Ejecutamos la consola de comandos como administrador:

    C:\Windows\system32>fsutilfsinfontfsinfoc:

    NmerodeseriedevolumenNTFS: 0x32423d91423d5b35

    Versin: 3.1

    Nmerodesectores: 0x000000000b1f3658

    Totaldeclsteres: 0x000000000163e6cb

    Clsteresvacos: 0x00000000005b5114

    Totaldeclsteresreservados: 0x0000000000000830

    Bytesporsector: 512

    Bytesporsectorfsico: 4096

    Bytesporclster: 4096

    Bytesporsegmentoderegistrodearchivo: 1024

    Clsteresporsegmentoderegistrodearchivo:0

    TamaovlidodedatosMFT: 0x0000000013d00000

    LCNdeiniciodeMFT: 0x00000000000b65b2

    LCNdeiniciodeMFT2: 0x00000000003f47e0

    IniciodezonaMFT: 0x0000000000ff67c0

    FindezonaMFT: 0x0000000001001f00

    Id.deAdministradorderecursos(RM):E6171C6C6A4811E2AED1AB806DF76A1E

    El tamao a usar depende del tipo de aplicacin:

  • 7/25/2019 Curso Administracin Oracle

    19/145

    19

    Pequeo: 2kb, 4kb, para sistemas OLTP(Online Transaction Processing)

    Grande: 8kb, 16kb, 32kb, para sistemas DSS(Decision Support Systems)

    En un sistema OLTP se hacen muchas lecturas aleatorias (dispersas). Si las filas son pequeas y el tamao del bloque es grande, como en cada

    lectura se lee un bloque, estaramos leyendo muchas filas que quedaran en la cache y que nadie necesitara.

    Por el contrario, en un sistema que hace un uso intensivo de consultas, caso de un sistema DSS, si el tamao de bloque es grande, se leern ms

    filas con una sola operacin fsica de lectura, con lo que reducimos el nmero de lecturas necesarias, que es lo ms costoso.

    En general, si los registros son grandes (con campos LOB) y las lecturas son secuenciales (full scan), es mejor usar un tamao de bloque mayor.

    Si las filas son pequeas y hay muchos accesos aleatorios, es mejor usar un bloque pequeo.

    As, por ejemplo, si tenemos un bloque de 8 kb y queremos leer una sola fila que ocupa 50 bytes, estaramos desperdiciando 8192 - 50 bytes de la

    cache.

    Con un bloque pequeo, se puede llegar a producir ms frecuentemente el efecto de filas encadenadas (row chaining,)si una fila no cabe en un

    bloque.

    El espacio se aprovecha mejor con bloques grandes, ya que la proporcin entre el espacio ocupado por la cabecera del bloque y el espacio para

    los datos es menor.

    4.2.2 Ficherosdedatos

    Son los ficheros donde se almacena la informacin.

    La jerarqua de almacenamiento de Oracle es la siguiente:

    Una base de datos est compuesta por uno o ms tablespaces.

    Un tablespaceest compuesto por uno o ms ficheros.

    Las tablas, ndices, vistas materializadas, etc. se conocen como segmentos.

  • 7/25/2019 Curso Administracin Oracle

    20/145

    20

    Los segmentosestn compuestos por una o ms extensiones, que son reas contiguas de almacenamiento en un fichero.

    Una extensin es un conjunto contiguo de bloques.

    Las extensionesque componen un segmento(una tabla p. ej.) no tienen por qu pertenecer a un mismo fichero, aunque si deben estaren el mismo tablespace.

    Un bloquees la unidad mnima de lectura y escritura.

    Un segmento, para crecer, necesita aadir nuevas extensiones, que no tienen por qu ser contiguas a las existentes, pudiendo incluso pertenecer

    a otro fichero, siempre que sea del mismo tablespace.

    Si necesitamos ms espacio en un tablespacepodemos bien aumentar el tamao de sus ficheros de datos, bien aadirle nuevos ficheros de datos.

    Todos los bloquesde un tablespacetienen el mismo tamao y estn divididos en tres partes: cabecera, datos y espacio libre.

  • 7/25/2019 Curso Administracin Oracle

    21/145

    21

    4.2.2.1 Casoprctico

    CREATETABLESPACEINDX

    DATAFILE'D:\ORACLE\ORADATA\SIPLAMA\INDX1.DBF'SIZE10GAUTOEXTENDONNEXT2GMAXSIZE32G;

    ALTERTABLESPACEINDX

    ADDDATAFILE'D:\ORACLE\ORADATA\SIPLAMA\INDX2.DBF'SIZE4G;

    ALTERDATABASEDATAFILE'D:\ORACLE\ORADATA\SIPLAMA\INDX2.DBF'RESIZE10G;

    ALTERDATABASEDATAFILE'D:\ORACLE\ORADATA\SIPLAMA\INDX2.DBF'AUTOEXTENDONNEXT2GMAXSIZE32G;

    4.2.3 Diccionariodelsistema

    Las tablas del diccionario del sistema siempre estn en el tablespaceSYSTEM.

  • 7/25/2019 Curso Administracin Oracle

    22/145

    22

    Vamos a usar dos tablas del diccionario del sistema para ver informacin sobre los ficheros de datos:

    select

    df.tablespace_name,

    df.file_name,

    to_char(df.blocks,'999,999,999')asblocks,

    to_char(df.bytes/1024/1024,'999,999,999')asMb,

    to_char(fe.free_blocks,'999,999,999')asfree_blocks,

    to_char(fe.free_bytes/1024/1024,'999,999,999')asfree_Mb

    fromdba_data_filesdf,

    (

    selecttablespace_name,file_id,sum(blocks)asfree_blocks,sum(bytes)asfree_bytes

    fromdba_free_spacegroupbytablespace_name,file_id

    )fe

    wheredf.file_id=fe.file_id(+)

    orderbydf.tablespace_name,df.file_name;

    4.2.4 Ficherostemporales

    Oracle utiliza los ficheros temporales para almacenar resultados intermedios y realizar operaciones de ordenacin grandes que no caben enmemoria. Tambin se almacenan en estos ficheros temporales las tablas e ndices temporales.

    Estos ficheros estn en un tablespaceespecial del tipo temporal.

    4.2.5 Ficherosdecontrol

    Es un fichero binario, sin el cual no es posible arrancar la BD. Por ello es conveniente mantener varias copias del mismo, preferiblemente en

    diferentes discos.

    Las distintas copias se encuentran situadas en las rutas especificadas en el fichero de parmetros.

    Podemos ver la lista fe ficheros de control a travs de la vista del sistema v$controlfile.

  • 7/25/2019 Curso Administracin Oracle

    23/145

    23

    Contienen informacin como el nombre y fecha de creacin de la base de datos, nombre de los tablespaces, nombre y localizacin de los ficheros

    de datos y de redo, nmero de secuencia del redo log en curso, informacin de checkpoint, informacin del archivado de los redo log, etc.

    Para aadir un fichero de control tenemos que parar la base de datos (shutdown), hacer una copia de uno de los ficheros de control a nivel de

    sistema operativo, aadir la ruta de la copia en el parmetro control_filesdel fichero de parmetros init.orao spfiley volver a arrancar la base

    de datos (startup).

    Es posible crear una copia visible del fichero control file con el comando:

    SQL>

    alter

    database

    backup

    controlfile

    to

    trace;

    La traza se crea en el directorio indicado por el parmetro user_dump_dest.

    SQL>select*fromv$parameterwherename='user_dump_dest';

    Tambin podemos especificar la ruta en la que crear el fichero:

    SQL>

    alter

    database

    backup

    controlfile

    to

    trace

    as

    'D:\Usuarios\aruiz\Documents\Temp\controlfile.txt';

    o hacer una copia binaria del fichero en una ruta concreta:

    alterdatabasebackupcontrolfileto'D:\Usuarios\aruiz\Documents\Temp\controlfile.bak';

    La vista v$databasenos proporciona informacin sobre algunos de los parmetros almacenados en el fichero de control.

    4.2.6

    FicherosRedoLogComenzar explicando qu son las transacciones: Transacciones

    Los ficheros redo logson cruciales para el funcionamiento de Oracle.

    En ellos se guardan todas las transacciones que se realizan en la base de datos, con objeto de poder repetirlas ms adelante si es necesario:

  • 7/25/2019 Curso Administracin Oracle

    24/145

    24

    Si insertamos un registro en un tabla, el resultado de la insercin se escribe en el redo log.

    Si borramos un registro, el hecho de que lo hemos borrado se escribe en el redo log.

    Si borramos una tabla, el contenido de la tabla no se escribe en el redo log, pero s la modificacin que se realiza en el diccionario de datos.

    En definitiva, en los ficheros redo logse almacena la informacin necesaria para volver a repetir las ltimas operaciones realizadas.

    Los utiliza Oracle para poder recuperar los datos en el caso de que se produzca un error en el sistema (hardware o software).

    Como veremos ms adelante, tambin son una de las razones fundamentales de la eficiencia(velocidad) de Oracle.

    En caso de un fallo de alimentacin elctrica, Oracle usar los redo log onlinepara restaurar los datos al mismo estado en que estaban antes deirse la luz.

    Esta afirmacin necesita una explicacin. Si cada operacin que realizamos se escribe en los ficheros de datos no se debera perder informacin al irse

    la luz.

    Si un disco se rompe, Oracle puede usar los redo log archivadosjunto con los redo log onlinepara restaurar un backupdel disco al estado antes del

    fallo.

    Si un usuario borra una tabla accidentalmente, es posible restaurar un backupanterior y actualizar los datos hasta el momento anterior al

    accidente.

    qu son los redo log archivados? en qu se diferencian de los ficheros de redo log online?

    Toda base de datos Oracle debe tener al menos dos ficheros de redo log online.por qu?

    Oracle escribe en los redo log de una forma circular. Comienza escribiendo en el primero. Cuando este se llena comienza a sobrescribir el segundo

    y as hasta el ltimo, despus del cual vuelve a comenzar por el primero.

    Al cambio de un fichero de log a otro (cuando se pasa de escribir en uno a escribir en el siguiente) se le llama log switch. Este cambio puede hacer

    que una base de datos que no est bien configurada se quede "parada" temporalmente.por qu?

  • 7/25/2019 Curso Administracin Oracle

    25/145

    25

    Para entender cmo funcionan los ficheros de redo log onliney alguna de las afirmaciones hechas anteriormente necesitamos comprender algunos

    conceptos importantes como saber qu es un checkpoint, que es el buffer o cache de datosy que hace el proceso Database Block Writer

    (DBWn).

    El buffer o cache de datoses un rea de memoria, ms concretamente de la SGA (System Global Area), en la que se almacenan temporalmente

    los bloques cuando se leen de los ficheros de datos. La idea es evitar tener que leerlos otra vez si los necesitamos ms adelante. Las operaciones

    ms costosas de una base de datos son las de lectura y escritura (I/O). Si conseguimos disminuir estas operaciones, la respuesta de la base de

    datos ser ms rpida. Cuando se modifica un registro, la modificacin se hace sobre el bloque que contiene el registro en el buffer de datosque

    est en la memoria. El bloque del fichero de datos no se toca. La informacin necesaria para repetir la operacin tambin se guarda en otra rea de

    la SGAconocida como redo log buffer. Cuando realizamos un commitpara hacer los datos permanentes (finalizar la transaccin), Oracle no

    escribe los bloques modificados de la SGAa disco inmediatamente. Tan solo escribe el contenido del redo log bufferal fichero de redo log online

    activo. Mientras que el bloque modificado no se haya escrito en el disco, necesitamos el respaldo del fichero redo log onlinepor si la base de

    datos falla. Si despus de hacer commitla luz se va, el buffer de datosse perder y por lo tanto perderemos los bloques modificados. En este

    caso, el nico registro que tenemos de los cambios realizados estar en el fichero de redo log online activo. Cuando levantemos otra vez la base

    de datos, Oracle ejecutar las transacciones de este fichero, volviendo a realizar la modificacin en el bloque de la cache de datos. Es por este

    motivo que hasta que los bloques modificados no se escriben en los ficheros de datos no se puede reutilizar el fichero de redo log online.

  • 7/25/2019 Curso Administracin Oracle

    26/145

    26

    Es aqu cuando el proceso DBWnentra en escena. Es un proceso backgroundde Oracle responsable de hacer sitio en el buffer de datoscuando se

    llena y de hacer los checkpoints. Un checkpointconsiste en la escritura de los bloques modificados (dirty blocks)del buffer de datosa disco. Hay

    varias circunstancias que pueden provocar un checkpoint, siendo la ms habitual el cambio de fichero de redo log activo. Cuando el fichero de

    log 1 se llena, se cambia al fichero de log 2 y Oracle lanza un checkpoint. En ese momento el proceso DBWcomienza a escribir a disco todos los

    bloques modificados protegidos por el fichero de log 1. Hasta que el proceso DBWnno termina, Oracle no puede reutilizar el fichero de log 1. Sise intenta utilizar antes de que el proceso DBWnhaya terminado, se interrumpen todos los procesos hasta que el proceso DBWnfinaliza el

    checkpointy se escribe en el fichero de trazas el indeseado mensaje "Checkpoint not complete" (el fichero de trazas contiene mensajes

    informativos que genera el servidor relacionados con acciones como el arranque y parada de la instancia y eventos excepcionales como el que

    acabamos de ver).

  • 7/25/2019 Curso Administracin Oracle

    27/145

    27

    Siempre que veamos este mensaje, sabremos que estamos induciendo esperas innecesarias para el usuario final que pueden ser evitadas. Uno de

    los objetivos de un DBA es definir el nmero suficiente y el tamao de los redo logs online necesario para evitar la reutilizacin de uno de ellos

    antes de que finalice el checkpointque gener cuando se llen.

    Si queremos, podemos forzar un checkpointmanual con la siguiente sentencia:

    SQL>altersystemcheckpoint;

    Por qu no definimos muchos ficheros de redo log o hacemos que sean muy grandes y as evitamos siempre el problema?

    Cada tipo de aplicacin genera diferentes cantidades de redo log. Un sistema DSS(Decision Support System)genera significativamente menos redo

    logque un sistema OLTP(Transaction Processing). Una aplicacin que gestiones muchas imgenes en campos BLOB(Binary Large Objects)genera

    ms redo logque un sistema de pedidos. Un sistema con 100 usuarios generar una dcima parte del redo logque genere una aplicacin con 1.000

    usuarios.

    No existe un valor nico apropiado para el nmero ni el tamao de los ficheros de redo log. Existen multitud de factores que hay que tener en

    cuenta.

    As, por ejemplo, para mantener una base de datos de consulta sincronizada con otra (Standby Database), como se sincronizan enviando los

    ficheros de redo logque se van llenando, interesa usar muchos fichero pequeos para que la sincronizacin sea siempre cercana.

    En una aplicacin en la que hay muchos usuarios modificando la misma informacin, interesa tener ficheros de redo loggrandes para que los

    bloques se modifiquen tantas veces como sea posible en memoria antes de enviarlos a disco. Esto, sin embargo, puede hacer que el tiempo de

    recuperacin despus de una cada sea mayor.

    Utilizar ficheros pequeos tambin puede disminuir la eficiencia de la base de datos al producirse un mayor nmero de checkpoints, pero por el

    contrario, el tiempo de recuperacin en caso de fallo tambin ser menor.

    Podemos ver la cantidad de redo generado (en bytes) (google: oracle statistics descriptions 11g)

    selectn.name,s.value

  • 7/25/2019 Curso Administracin Oracle

    28/145

    28

    fromv$mystats,v$statnamen

    wheres.statistic#=n.statistic#

    andn.namelike'redosize';

    createtabletas

    selectobject_id,object_name,created

    fromall_objects

    whererownumselectlog_modefromv$database;

    Para activar el modoARCHIVELOGhay que aadir los siguientes parmetros al fichero de parmetros:

    log_archive_start=true(elarchivadodelosficherosderedologesautomticoenlugardemanual)

    log_archive_dest_1=C:\oracle\oradata\orcl\arch(hasta10rutasdiferentes)

    log_archive_format=arch_%t_%s.arc(nombreconelquesecopianlosficheros)

    Para cambiar el modo de funcionamiento la base de datos debe estar montada pero no abierta:

  • 7/25/2019 Curso Administracin Oracle

    29/145

    29

    SQL>startupmount;

    SQL>alterdatabasearchivelog;

    SQL>alterdatabaseopen;

    4.2.6.2 Otraventajadelusodeficherosderedolog

    Adems de todo lo visto anteriormente, existe otro motivo por el que Oracle decidi usar los ficheros de redo log.

    Los ficheros de redo logse escriben de forma secuencial, y la escritura secuencial es mucho ms rpida que la escritura aleatoria.

    Cuando hacemos un commit, slo tenemos que esperar a que finalice la escritura secuencial del redo log bufferal fichero de redo log online

    activopara seguir trabajando, operacin que es mucho ms rpida que la escritura aleatoria de los bloques modificados en los ficheros de datos.

    Otro motivo, como ya hemos visto, es el de reducir el nmero de escrituras a disco, lo que logramos dejando los bloques de datos modificados en

    memoria tanto tiempo como sea posible, sin temor a la perdida de informacin por un fallo de la instancia.

    4.2.6.3 Casoprctico

    select*fromv$logfile;

    select*fromv$log;

    alterdatabasedroplogfilegroup1;

    alterdatabaseaddlogfilegroup1'D:\ORACLE\ORADATA\SIPLAMA\REDO1.LOG'size100M;

    alter

    database

    drop

    logfile

    group

    2;

    alterdatabaseaddlogfilegroup2'D:\ORACLE\ORADATA\SIPLAMA\REDO2.LOG'size100M;

    altersystemswitchlogfile;

    alterdatabasedroplogfilegroup3;

  • 7/25/2019 Curso Administracin Oracle

    30/145

    30

    alterdatabaseaddlogfilegroup3'D:\ORACLE\ORADATA\SIPLAMA\REDO3.LOG'size100M;

    alterdatabaseaddlogfilegroup4'D:\ORACLE\ORADATA\SIPLAMA\REDO4.LOG'size100M;

    alterdatabaseaddlogfilegroup5'D:\ORACLE\ORADATA\SIPLAMA\REDO5.LOG'size100M;

    4.2.7 Undo,bloqueosyconcurrencia

    Como ya hemos visto, cuando Oracle modifica un registro, tambin aade los datos de la operacin realizada a los ficheros de redo log. Esta

    informacin nos permite volver a repetir la operacin si fuese necesario.

    Por otra parte, el registro modificado tambin se marca con el identificador de la transaccin que lo ha modificado.

    Este identificador acta como un bloqueo de escritura sobre el registro. Si otro usuario intenta modificar este registro, Oracle comprobara que ya

    est bloqueado por otra transaccin activa y no lo permitir.

    Esta caracterstica ha permitido a Oracle implementar otra funcionalidad fundamental: el multi-versioning, que permite que Oracle nunca bloquee

    la informacin en modo de lectura. Para entender este mecanismo hemos de ver primero que son los segmentos de rollbacko segmentos de

    undo.

    Adems de la informacin de redo, Oracle tambin guarda la informacin necesaria para poder deshacer la operacin en caso de que la

    transaccin no finalice correctamente. Esta informacin se conoce como de undoy se guarda en los segmentos de rollbacko undo(rollback or

    undo segments). En caso de que la transaccin falle, Oracle leer la imagen anterior de los segmentos de rollbacky restaurar la informacin.

    Supongamos ahora que hemos abierto un cursor (hecho un select) a las 10:00:00 contra una tabla con 100.000 registros. Empezamos a recorrerlo y

    a las 10:00:05, cuando vamos por el registro nmero 20.000, un usuario modifica el registro nmero 25.000. Si seguimos recorriendo el cursor y al

    llegar al registro nmero 25.000 el usuario todava no ha finalizado la transaccin, est claro que deberamos ver la informacin que haba antes de

    la modificacin. Pero, qu pasa si ya ha hecho commity la transaccin ha finalizado?

  • 7/25/2019 Curso Administracin Oracle

    31/145

    31

    Pues que tambin debera ver el registro como estaba a las 10:00:00 cuando comenz la consulta (cuando se abri el cursor). Oracle consigue este

    comportamiento comprobando que la hora a la que se realiz la modificacin (realmente el SCN: System Change Number) es posterior a la del

    comienzo de la consulta, y en el caso de este registro, devolviendo la informacin que est almacenada en el segmento de undo.

    Mediante este mecanismo, Oracle ha conseguido que las actualizaciones que estn realizando unos usuarios no afecten a las operaciones de

    lectura que estn usando otros.

    Cuando se hace un commito un rollback, la transaccin, que se almacena en los segmentos de rollbackse marca como activa o finalizada.

  • 7/25/2019 Curso Administracin Oracle

    32/145

    32

  • 7/25/2019 Curso Administracin Oracle

    33/145

    33

    Finalizar explicacin transacciones: Transacciones

    4.2.8 Transacciones

    En teora, no sera demasiado complejo escribir nuestras aplicaciones para que lean y escriban los registros que necesitan directamente desde

    ficheros. La principal diferencia entre usar este mecanismo y una base de datos como Oracle es el concepto de transaccin. Una base de datos nos

    garantiza la integridad de los datos. Si una operacin requiere que se realicen modificaciones en dos ficheros (tablas), y el sistema se cae despus

  • 7/25/2019 Curso Administracin Oracle

    34/145

    34

    de realizar la primera actualizacin, los datos podran quedar inconsistentes. Esto no ocurre usando una base de datos. La base de datos nos

    garantiza la atomicidad de la operacin mediante el concepto de transaccin. La operacin se realiza completa o no se realiza, pero nunca se

    queda a medias.

    Otra propiedad importante de las transacciones es el aislamiento(isolation). Los cambios que est realizando una transaccin no finalizada no

    deben ser visibles para el resto de transacciones en curso.

    Existen dos comandos para controlar las transacciones: commity rollback.

    Commitfinaliza una transaccin haciendo que los cambios sean permanentes.

    Rollbacktambin finaliza una transaccin, pero deshaciendo todos los cambios que se hubiesen realizado desde la transaccin anterior.

    En muchas bases de datos como Informix, Sybasey SQLServercada operacin es una transaccin en s misma. Si queremos que varias sentencias

    formen parte de una misma transaccin es necesario comenzarla explcitamente. Oracle adopt el criterio opuesto. Todas las operaciones se

    realizan en el mbito de una transaccin y no se hacen efectivas hasta que esta no se cierra.

    Hace algunos aos (y an hoy con algunas bases de datos), si un usuario estaba modificando una tabla, otro usuario no poda leerla hasta quefinalizaba la operacin. Los registros que se estaban modificando o incluso la tabla entera se bloqueaban durante la transaccin. Adems, estos

    bloqueos consuman muchos recursos. Esto motiv que muchos programadores intentaran que las transacciones fuesen lo ms cortas posibles.

    As, por ejemplo, si queran actualizar todos los registros de una tabla con un milln de registros, podan escribir un procedimiento para

    modificarlos de 1000 en mil. Este procedimiento, adems de ser ms complejo que una simple actualizacin, poda dar lugar a una inconsistencia

    en los datos.

    En Oracle, el tamao de una transaccin no es un problema. No se usa ms memoria ni se consumen ms recursos (por bloqueos) en una

    transaccin grande que en una pequea. El tamao de las transacciones debe ser el que corresponda a cada operacin. Si queremos actualizar un

    campo de una tabla con un milln de registros, lo correcto sera finalizar la transaccin cuando se hubiesen modificado todos los registros.

    Enlace a Ficheros Redo Log

  • 7/25/2019 Curso Administracin Oracle

    35/145

    35

    Realmente, las operaciones commitson casi inmediatas, independientemente del tamao de la transaccin. Cuando se realiza el commitla

    informacin de redoy la de undoya se ha generado, y los bloques de datos se han modificado en la cache. Si la transaccin es grande, dicha

    informacin se ha ido volcando a disco.

    La parte ms costosa de una transaccin es la escritura del redo log buffera los ficheros de redo log onlinepor el proceso LGWR, aunque esto no

    suele ser un problema ya que este proceso suele estar enviando esta informacin continuamente:

    Cada 3 segundos

    Si se ha llenado un tercio del buffer.

    Cuando se realiza un commit

    puede un select generar redo?

    Al hacer un commit, se hace una limpieza rpida (total o parcial) de las transacciones asociadas a los registros modificados (realmente bloques)

    que todava estn en la cache. No as de los registros que el proceso DBWRha volcado a los ficheros de datos y ya no estn en memoria (esta

    situacin ocurre sobre todo en transacciones grandes). A este proceso se le llama commit cleanout. Posteriormente, otra sesin puede leer alguno

    de estos bloques que tiene transacciones asociadas. Oracle comprueba si las transacciones ya han finalizado y limpia el bloque. Como estaoperacin no se hace como consecuencia de un commit, se le llama delayed block cleanout. Como se trata de una operacin que modifica los

    bloques, se genera redo. Por este motivo, es posible que una sentencia selectpueda generar redo, especialmente despus de una actualizacin

    grande.

    Realizar el block cleanoutes conveniente para evitar que Oracle tenga que comprobar cada vez si el registro pertenece a una transaccin activa.

    (*) En teora, no se podr limpiar la transaccin asociada a un registro si hay un cursor abierto antes del comienzo de la transaccin, aunque latransaccin ya haya finalizado.

    El caso del rollbackes el opuesto del commit. El tiempo necesario para realizar un rollbackdepende directamente del volumen de datos

    modificados. Oracle tiene que leer la informacin que haba antes del cambio de los segmentos de undopara revertir la operacin.

    Conclusin: Oracle est optimizado para ser muy rpido haciendo commita costa de que los rollbacksean ms lentos y costosos.

  • 7/25/2019 Curso Administracin Oracle

    36/145

    36

    Repaso de las acciones realizadas en un commit:

    Antes de que se haga commit, ya se han realizado las siguientes acciones:

    La informacin de undose ha generado en la SGA.

    Los bloques se han modificado en la SGA.

    Se ha generado la informacin de redode las dos acciones anteriores en la SGA. (ver Nota *)

    Dependiendo del tamao de la transaccin y el tiempo que dure, parte de la informacin de los tres puntos anteriores puede que se

    haya volcado a disco.

    Se han activado los bloqueos correspondientes.

    Despus del commit:

    Se genera el System Change Number (SCN)de la transaccin.

    El proceso LGWR escribe el resto del redo log buffera disco y anota tambin el SCN.

    La transaccin se marca como finalizada (committed).

    Se liberan los bloqueos.

    Se hace un barrido rpido de los bloques modificados que an estn en memoria para borrar la informacin sobre transacciones

    finalizadas que puedan contener (commit cleanout).

    La accin ms costosa es la escritura del resto del redo log buffera disco, y esta accin siempre ser pequea porque Oracle ha ido realizando

    la escritura de esta informacin de forma regular durante la transaccin. Aunque el proceso LGWR normalmente se ejecuta de forma asncrona,

    esta ltima escritura se realiza de forma sncrona. Hasta que no finalice, Oracle no puede seguir trabajando.

    Nota *: como hemos visto, en transacciones grandes puede ser que parte de la informacin ya se haya volcado a disco, aunque la transaccin no

    haya an finalizado, por lo que la informacin de undotambin tiene que estar protegida por los ficheros de redo, para, en caso de cada, despus

    de recuperar el ltimo estado, poder realizar el rollbackque no se pudo hacer por la cada.

    Con la siguiente consulta podemos ver las transacciones activas y el nmero de bloques de undoque contienen:

  • 7/25/2019 Curso Administracin Oracle

    37/145

    37

    selecta.sid,a.username,b.used_ublk

    fromv$sessiona,v$transactionb

    wherea.saddr=b.ses_addr;

    Podemos averiguar el tiempo aproximado que le queda a un rollbackpara finalizar, viendo cuando se reduce el valor del campo USED_UBLKen un

    intervalo de, digamos, 60 segundos.

    4.2.9 Flashback

    Mediante esta funcionalidad podemos consultar y recuperar datos pasados.

    Utiliza la informacin de undoque generan las transacciones.

    createtabletas

    selectobject_id,object_name,created

    fromall_objects

    whereowner='DIMA'

    andobject_type='TABLE'

    orderbyobject_name;

    select*fromtwhereobject_name='REPUESTOS_ET';

    updatetsetobject_name='FOO'whereobject_name='REPUESTOS_ET';

    select*fromtwhereobject_name='FOO';

    select

    t.*

    fromtversionsbetweenscnminvalueandmaxvalue

    whereobject_id=64508;

    selectora_rowscn,scn_to_timestamp(ora_rowscn),t.*

    fromt

    whereobject_id=64508;

  • 7/25/2019 Curso Administracin Oracle

    38/145

    38

    select*

    fromtasoftimestampto_timestamp('2014092217:30:30','YYYYMMDDHH24:MI:SS')

    whereobject_id=64508;

    select*

    fromtasoftimestamp(systimestamp interval'20'minute)

    whereobject_id=64508;

    Incluso podemos buscar los registros eliminados o modificados recientemente:

    deletefromtwhereobject_name='FOO';

    commit;

    select*

    fromtasoftimestamp(systimestamp interval'10'minute)

    minusselect*fromt;

    El tiempo que se almacena depende del tamao del tablespacede undoy del parmetro undo_retention(en segundos).

    El parmetro undo_retentiondebera ser superior al tiempo de ejecucin de la consulta ms larga.

    select*fromv$parameterwherenamelike'%undo_%';

    altersystemsetundo_retention=1800;

    Para averiguar el tiempo que se estn guardando los segmentos de undo:selectbegin_time,end_time,undoblks,txncount,maxquerylen,tuned_undoretention

    fromv$undostat

    orderbyend_timedesc;

    Cada registro contiene las estadsticas en periodos de 10 minutos:

  • 7/25/2019 Curso Administracin Oracle

    39/145

    39

    undoblks: nmero total de bloques de undousados.

    txncount: nmero de transacciones ejecutado en el periodo

    maxquerylen: duracin en segundos de la consulta ms larga.

    tuned_undoretention: tiempo de retencin de los datos de los bloques de undo

    Tambin podemos investigar ms a fondo es estado de los segmentos de undo:

    selectstatus,

    round(sum_bytes/1024/1024)asMB,

    round((sum_bytes

    /

    undo_size)

    *

    100)

    as

    PERC

    from

    (

    selectstatus,sum(bytes)sum_bytes

    fromdba_undo_extents

    groupbystatus

    ),

    (

    selectsum(a.bytes)undo_sizefromdba_tablespacesc,

    v$tablespaceb,

    v$datafilea

    wherec.contents='UNDO'

    andc.status='ONLINE'

    andb.name=c.tablespace_name

    anda.ts#=b.ts#

    );

    Con esta consulta podemos ver la cantidad de undoen cada uno de los tres estados posibles:

    ACTIVEEspacio usado por las transacciones activas y que es necesario para poder realizar un rollback.

    El parmetro undo_retentionno se utiliza para este tipo de undo. Si no hubiese suficiente espacio en el tablaspace de undopara

  • 7/25/2019 Curso Administracin Oracle

    40/145

    40

    guardar la informacin generada por la transaccin, se abortara la transaccin y se producira el error ORA30036unabletoextendsegmentinUndotablespace.

    UNEXPIRED

    Informacin generada por transacciones finalizadas y antigedad inferior al parmetro undo_retention.. Es necesario para laconsistencia de las lecturas y las funciones de flashback. Si no est toda la informacin necesaria para realizar una lecturaconsistente, aparecera el error ORA01555snapshottooold.

    EXPIREDInformacin generada por transacciones finalizadas y antigedad superior al parmetro undo_retention. No es necesario para laconsistencia de las lecturas.

    4.2.10Tamaodelabasededatos

    select(a.data_size+b.temp_size+c.redo_size)/1024/1024/1024"GB",

    free.bytes/1024/1024/1024"FreeGB"

    from(selectsum(bytes)data_sizefromdba_data_files)a,

    (selectnvl(sum(bytes),0)temp_sizefromdba_temp_files)b,

    (selectsum(bytes)redo_sizefromv$log)c,

    (selectsum(bytes)bytesfromdba_free_space)free;

    4.3 Estructurasdememoria

    Las estructuras bsicas de memoria de Oracle son la SGA(System Global Area)y la PGA(Program Global Area).

  • 7/25/2019 Curso Administracin Oracle

    41/145

    41

    La SGAest compuesta por un grupo de estructuras de memoria compartida (componentes) que contienen datos e informacin de control de la

    instancia.

    La comparten todos los procesos, tanto los servidores dedicados (creados con cada sesin) como los procesos que funcionan en background.

    Los componentes principales de la SGAson la cache de datos, los redo log buffersy el shared pool.

    La PGAes una zona de memoria propia y exclusiva de cada proceso. Se conoce como PGAal conjunto de todas las PGAs.

    En este rea se guarda informacin como los valores de las variables enlazadas (bind variables), el estado de ejecucin de la sentencia, cursores

    abiertos y tambin se reserva espacio para realizar ordenaciones (sort area)y "joins" (hash rea y bitmap merge area). Si el espacio que se puede

    reservar (suponiendo que estamos usando la gestin automtica de la memoria de la PGA) es demasiado pequeo en relacin con el tamao de la

    operacin, el tiempo de respuesta puede dispararse ya que las operaciones han de realizarse sobre segmentos temporales en disco.

    4.3.1

    Lacachededatos(databasebuffercache)

    Es uno de los componentes principales de la SGA.

    Contiene una copia en memoria de los ltimos bloques que se han ledo y de los bloques modificados que an no se han escrito en los ficheros de

    datos.

  • 7/25/2019 Curso Administracin Oracle

    42/145

    42

    Esta lista de bloques es dinmica. Cuando un proceso necesita un registro (realmente un bloque), primero lo busca en la cache de datos. Si lo

    encuentra, el bloque se coloca al comienzo de la lista, de forma que los bloques de la cache menos usados se van moviendo haca el final.

    En realidad, actualmente se utiliza un mecanismo del tipo touch count, por el que cada vez que se accede a un bloque, se incrementa un contador

    en dicho bloque, y cuando hay que hacer hueco para los nuevos bloques, Oracle intenta mantener los bloques ms usados, eliminado los que se

    hayan usado menos veces.

    Qu ocurre con la lectura de tablas grandes (full scan)? podran ocupar todo el buffer y hacer que perdamos los segmentos ms usados?

    No. Oracle utiliza dos mecanismos para que esto no ocurra. En primer lugar, nunca utiliza ms del 25% del buffer cuando hace un full scan. Si la

    tabla es mayor que el 25% del tamao del buffer, los bloques ms recientes van borrando a los ms antiguos de la misma tabla. En segundo lugar,

    si el tamao de la tabla es mayor que el 10% del tamao del buffer, el contador de uso de los bloques no se incrementar con las siguientes

    lecturas de la misma tabla, por lo que esos bloques sern los primeros en salir de la cache.

    Este comportamiento podemos modificarlo a nivel de tabla mediante el keepy recycle pool, como veremos ms adelante.

    Con la siguiente consulta podemos ver cmo de efectiva est siendo la cache de datos:

    selectname,to_char(value/1024/1024,'999,999,999')asM_BLOCKS

    fromv$sysstat

    wherenamein

    (

    'physicalreadscache',

    'consistentgetsfromcache',

    'dbblockgetsfromcache'

    );

  • 7/25/2019 Curso Administracin Oracle

    43/145

    43

    Bufferhitratio=physicalreads/(consistentgetsfromcache+dbblockgetsfromcache)

    Physical reads:los bloques de datos que Oracle lee de disco. Muy costosos.

    Buffer gets y logical reads:nmero de veces que se solicita un bloque del buffer cache. Son prcticamente sinnimos. Si el bloque no est en el

    buffer cache, la lectura lgica implica una lectura fsica (es uno de los campos de la vista v$sql_monitorque veremos ms adelante).

    Consistent gets:son las lecturas de bloques consistentes con un instante determinado (o SCN).

    Son las lecturas normales. La mayora de las veces, los bloques que estn en la cache son consistentes y no hay que hacer ninguna operacin

    adicional para recuperar la informacin.

    Cuando se crea un cursor (select) para acceder a una serie de registros, los valores de los registros deben ser consistentes con el momento de la

    creacin del cursor, aunque otras sesiones modifiquen algunos de esos bloques antes de que hayan sido ledos. Si el bloque en la cache no es

    consistente con el momento deseado, Oracle debe reconstruir el bloque con la informacin de los segmentos de rollbackdel tablespace de UNDO.

    Si no tuvisemos suficientes segmentos de rollbackpara reconstruir el bloque, nos aparecera el error ORA1555"snapshottooold".

    El nmero total de bloques ledos es la suma de Consistent Getsy DB Block gets.

    DB block gets:cuando Oracle lee la versin del bloque que haya en la cache (la actual), sin importarle si se ha modificado o no. No est muy claro,

    ni es muy importante.

    Para los valores anteriores nos sale un buffer hit ratiode 0,6%.

    Este ratio nos da una idea del porcentaje de veces que Oracle ha encontrado el bloque que necesitaba en la cache y por lo tanto no ha tenido que

    leerlo de los ficheros de datos. Cuanto menor sea este valor, ms efectiva est siendo la cache.

    Estos mismos indicadores podemos verlos a nivel de sesin:

    selectnvl(n.username,'ORACLEPROC')||'('||n.sid||')'usernamex,

    n.program,

  • 7/25/2019 Curso Administracin Oracle

    44/145

    44

    n.machine,

    t.name,

    to_char(s.value,'999,999,999,999')asvalue,

    round((sysdate

    n.logon_time)*24)

    ashoras,

    to_char(s.value/(sysdate n.logon_time)/24,'999,999,999,999')asvalue_per_hour

    fromv$sesstats,v$statnamet,v$sessionn

    wheres.statistic#=t.statistic#

    andn.sid=s.sid

    andt.namein

    (

    'physicalreadscache',

    'consistentgetsfromcache',

    'dbblockgetsfromcache'

    )

    ands.value>0

    orderbys.valuedesc;

    o a nivel de pool:

    selectname,physical_reads,db_block_gets,consistent_gets,

    1 (physical_reads/(db_block_gets+consistent_gets))"HitRatio"

    fromv$buffer_pool_statistics;

  • 7/25/2019 Curso Administracin Oracle

    45/145

    45

    Existe una vista que nos proporciona una idea de cmo podra variar este ratio en funcin del tamao de la cache.

    selectsize_for_estimate,

    to_char(buffers_for_estimate,'999,999,999')asbuffers_for_estimate,

    estd_physical_read_factor,

    to_char(estd_physical_reads,'999,999,999,999')asestd_physical_reads

    fromv$db_cache_advice

    wherename

    ='DEFAULT'

    andblock_size=(selectvaluefromv$parameterwherename='db_block_size')

    andadvice_status='ON';

  • 7/25/2019 Curso Administracin Oracle

    46/145

    46

    Este resultado nos indica que aumentando el tamao de la cache de los 3505 Mb actuales a 6048 Mb, la lectura fsica de bloques se reducira un

    50%.

    Tener una cache muy grande no siempre hace que Oracle vaya ms rpido. Cierto tipo de operaciones que deben recorrer todos los bloques en

    memoria podrian verse afectadas negativamente si el nmero de bloques en la cache fuese muy grande.

  • 7/25/2019 Curso Administracin Oracle

    47/145

    47

    Esta consulta nos muestra los objetos con ms bloques en la cache:

    selecto.owner,o.object_name,o.object_type,count(*)asnb

    fromdba_objectso,v$bhb

    whereo.data_object_id=b.objd

    and

    not

    o.owner

    like

    'SYS%'

    groupbyo.owner,o.object_name,o.object_type

    havingcount(*)>=100

    orderby4desc;

  • 7/25/2019 Curso Administracin Oracle

    48/145

    48

    Vista para averiguar los objetos que ms tiempo han permanecido enla cache (hay que ejecutarla como sys):

    withb1as

    (

    selectobj,

    max(tch)

    as

    tch

    fromx$bh

    groupbyobj

    orderby2desc

    ),

    b2as

    (

  • 7/25/2019 Curso Administracin Oracle

    49/145

    49

    selectobj,tch

    fromb1

    wheretch>=10

    )

    selecto.owner,o.object_name,o.object_type,b2.tch

    fromdba_objectso,b2

    whereo.data_object_id=b2.obj

    andnoto.ownerlike'SYS%'

    orderby4desc;

    Consulta para ver los objetos a los que se est accediendo ms frecuentemente:

    selectobject_owner,object_name,count(*)

    fromv$sql_plan

    wherenotobject_ownerin('SYS','SYSTEM','SYSMAN','DBSNMP','APEX_030200','EXFSYS','MDSYS')

    groupbyobject_owner,object_name

    orderbycount(*)desc;

  • 7/25/2019 Curso Administracin Oracle

    50/145

    50

    Oracle usa por defecto con un buffer de datos: DEFAULT, pero nos permite trabajar con dos ms, KEEPy RECYCLE.

    Cuando se accede a un segmento grande (full scan o index range scan), los bloques pertenecientes a segmentos importantes que se usan ms a

    menudo quizs no salgan del buffer, pero aquellos bloques pertenecientes a segmentos importantes que se hayan usado menos frecuentemente

    es posible que s salgan. Para evitarlo Oracle nos permite definir dos buffers de datos adicionales:

  • 7/25/2019 Curso Administracin Oracle

    51/145

    51

    KEEP pool: para mantener los bloques de los segmentos que sabemos que se van a usar muy frecuentemente y queremos que estn (casi) siempre

    disponibles.

    RECYCLE pool: para evitar que lecturas de segmentos grandes que sabemos que no se van a usar frecuentemente, eliminen a otros objetos deacceso ms frecuente.

    El funcionamiento de estos dos buffers es el mismo que el del buffer por defecto, por lo que tambin salen los bloques menos usados para que

    entren otros ms recientes.

    Es muy fcil que disminuyamos el rendimiento de la cache en general por un mal uso de estos buffers adicionales. Hay que tener en cuenta que el

    espacion que destinamos a estos buffers adicionales lo estamos quitando del buffer por defecto.

    Para usarlos, primero hemos de haberlos creado a nivel de instancia, mediante los parmetros de inicializacin buffer_pool_keepy

    buffer_pool_recycle(se especifica el nmero de bloques).

    Luego tenemos que asociar los segmentos a estos buffers.

    CREATE

    TABLE

    EMP

    (...)

    STORAGE

    (BUFFER_POOL

    KEEP)

    CACHE;

    ALTERTABLESTORAGE(BUFFER_POOLKEEP|RECYCLE|DEFAULT);

    CREATEINDEXSTORAGE(BUFFER_POOLKEEP|RECYCLE|DEFAULT);

    CREATETABLESTORAGE(BUFFER_POOLKEEP|RECYCLE|DEFAULT);

    ALTERINDEXREBUILDSTORAGE(BUFFER_POOLKEEP|RECYCLE|DEFAULT);

    4.3.2 SharedPool

    Es otro de los componentes fundamentales de la SGA.Tres de los componentes fundamentales es este rea de memoria son:

    Library cache: almacena las sentencias SQL y cdigo PL-SQL compilado.

    Data dictionary: cache: almacena informacin del diccionario de datos.

    Server result cache: almacena resultados de consultas (a partir de la versin 11g)

    El d j d f i f i d l id d

  • 7/25/2019 Curso Administracin Oracle

    52/145

    52

    El tamao de estas reas se ajusta de forma automtica en funcin de las necesidades.

    La compilacin de las sentencias SQL es una tarea muy costosa (query plan), por lo que es importante que las que se ejecutan con mayor

    frecuencia estn compiladas y disponibles en la library cache. No encontrar una sentencia en la cache es bastante ms costoso que no encontrar un

    bloque en la cache de datos.

    El funcionamiento de esta cache es muy parecido al de la cache de datos.

    Una buena manera de deteriorar el rendimiento de una base de datos consiste en usar sentencias SQL sin variables (bind variables). Oracle

    entiende que cada sentencia es diferente, por lo que elimina sentencias importantes que no se han usado recientemente para almacenar otras que

    con toda probabilidad no se van a volver a usar. Este problema empeora an ms aumentado el tamao de la library cache.

    Respecto a la server result cache, Oracle asigna un 0,25% del parmetro MEMORY_TARGETa este rea, que va aumentando hasta llegar al valor

    mximo permitido, que est definido en el parmetro de inicializacin result_cache_max_size.

    select*fromv$parameterwherenamelike'result_cache%';

    El valor por defecto del parmetro result_cache_modees MANUAL, que indica que Oracle no almacena resultados a no ser que se especifique con

    el hint/*+RESULT_CACHE

    */en la propia consulta. El otro valor posible es FORCE, que se puede activar a nivel de sesin.

    El parmetro result_cache_max_resultindica el mximo porcentaje de la cache que se puede almacenar en una consulta. Por defecto es un 5%.

    Este mecanismo puede ser interesante en consultas que extraigan un volumen pequeo de informacin de la lectura de un gran nmero de

    registros: agrupaciones, medias, etc., por ejemplo, si vamos a usar varias veces el nmero de movimientospor ao, suponiendo que la tabla

    movimientostiene muchos registros.

    4 3 3 Administracinde lamemoria

  • 7/25/2019 Curso Administracin Oracle

    53/145

    53

    4.3.3 Administracindelamemoria

    Oracle recomienda que usemos la gestin automtica de la memoria (Automatic Memory Management).

    Con este modo, disponible a partir de Oracle 11g, el administrador tan slo establece el tamao total de la memoria para la instancia y Oracle se

    encarga de repartir el espacio dinmicamente entre la SGA y la PGA.

    Supongamos que queremos usar 5Gb de memoria con posibilidad de aumentar hasta 8Gb en el futuro:

    altersystemsetmemory_max_target=8Gscope=spfile;

    altersystemsetmemory_target=5Gscope=spfile;

    altersystemsetpga_aggregate_target=0scope=spfile;

    altersystemsetsga_target=0scope=spfile;

    shutdownimmediate;

    startup;

    Al establecer los parmetrospga_aggregate_targety sga_targeta 0, dejamos el control total a Oracle.

    Con estos parmetros, los tamaos de la SGAy la PGA(suma de las PGAs de todos los procesos) se ajustan automticamente. Si establecisemos

    valores para sga_targetopga_aggregate_targetdistintos de 0, los valores se usaran como valores mnimos para las respectivas reas de

    memoria.

    El parmetro memory_targetse puede modificar dinmicamente, siempre que no supere el valor definido en el parmetro memory_max_target:

    altersystemsetmemory_target=8G;

    Tamao de las reas de memoria dinmicas:

    select*fromv$memory_dynamic_components;

    ltimas operaciones de redimensionamiento de memoria:

    select*fromv$memory_resize_ops;

    Informacin sobre la SGA y la PGA:

  • 7/25/2019 Curso Administracin Oracle

    54/145

    54

    Informacin sobre la SGAy la PGA:

    select*fromv$sgastat;

    select*fromv$pgastat;

    4.4 Procesos

    selectpname,background

    fromv$process

    wherenotpnameisnull;

    4.4.1

    ProcessMonitorProcess(PMON)Es un monitorizador de procesos.

    Si una sesin falla o se mata, este proceso es el encargado de iniciar un rollbackde las transacciones en curso y liberar los recursos que estaba

    usando: memoria, bloqueos, etc.

    Tambin monitoriza al resto de procesos, para reiniciarlos en caso de que alguno falle, si es posible, o en caso contrario, parar la instancia.

    4.4.2 Systemmonitor(SMON)

    Realiza la recuperacin de la instancia cuando se vuelve a iniciar despus de un fallo.

    Tambin limpia los segmentos temporales que no estn en uso y desfragmenta el espacio libre en los ficheros.

    4.4.3 DatabaseWriterProcess(DBWn)

    Es el proceso encargado de escribir los bloques modificados (dirty blocks)de la cache a disco. Escribe los bloques que no se han usadorecientemente (algoritmo LRU Least Recently Used) intentando garantizar que siempre queden bloques libres en la cache para poder cargar nuevos

    bloques.

    Aunque un proceso (DBW0) es suficiente en la mayora de los casos, en sistemas con varios procesadores que modifiquen muchos datos puede ser

    conveniente tener varios procesos DBWn funcionando simultneamente.

    Aunque Oracle propone el nmero de procesos de escritura durante la instalacin podemos modificar este valor con el parmetro

  • 7/25/2019 Curso Administracin Oracle

    55/145

    55

    Aunque Oracle propone el nmero de procesos de escritura durante la instalacin, podemos modificar este valor con el parmetro

    db_writer_processes.

    Hay dos condiciones que hacen que los procesos DBWn escriban a disco:

    Que un proceso no pueda encontrar bloques libres despus de buscar en un porcentaje del buffer de datos.

    Para avanzar el checkpoint. Todos los bloques modificados del buffer de datos deben estar respaldados por los ficheros de redo (redo log).

    Para poder reutilizar un fichero de redo, los procesos DBWn deben escribir los bloques modificados respaldados por dicho fichero.

    4.4.4 LogWriterProcess(LGWR)

    Es el encargado de escribir las entradas del buffer de redoa los ficheros de redoen disco. Escribe todas las entradas nuevas desde que se realiz la

    ltima escritura.

    El buffer de redo es circular, es decir, las entradas que se van escribiendo en los ficheros de redo Oracle las va reescribiendo.

    El proceso entra en funcionamiento en las siguientes circunstancias:

    Cuando se realiza un commit Cada 3 segundos

    Si se ha llenado un tercio del buffer.

    Cuando el proceso DBWn intenta escribir un buffer modificado a disco y comprueba que su entrada de redo asociada an no se ha escrito

    a disco. En este caso avisa al proceso LGWR para que lo haga, quedndose a la espera de que este finalice para continuar.

    Cada vez que se hace commitde una transaccin, Oracle asigna un nmero secuencial a la transaccin (SCN: system change number). Este

    nmero se almacena con las entradas de redo log generadas por la transaccin.

    Con objeto de maximizar la eficiencia del proceso, si durante una escritura generada por un commitse producen varios commitms, estos se

    ponen en cola y cuando la primera escritura finaliza, todas las dems se hacen a la vez.

    4.4.5 Checkpoint Process (CKPT)

  • 7/25/2019 Curso Administracin Oracle

    56/145

    56

    4.4.5 CheckpointProcess(CKPT)

    Cuando los procesos DBWn han escrito los bloques modificados a disco, se produce un checkpoint.

    Este proceso, que realiza el checkpoint, escribe el SCNen la cabecera de los ficheros de datos y en los ficheros de control.

    Un checkpointfinalizado garantiza que todos los datos son correctos hasta el ltimo SCNescrito. Si hay que realizar una recuperacin, tan solo

    hay que volver a aplicar los cambios almacenados en los redo log posteriores al ltimo SCNalmacenado (roll forward). Es posible que despus de

    roll forwardhaya que realizar un rollbackpara deshacer las transacciones activas no finalizadas.

    Oracle sabe si ha habido una cada y se necesita recuperacin si alguno de los SCNsde los ficheros de datos no coincide con el almacenado en el

  • 7/25/2019 Curso Administracin Oracle

    57/145

    57

    y p g

    fichero de control.

    4.4.6

    ArchiverProcesses(ARCn)

    Es el proceso encargado de copiar los redo log onlinea los destinos especificados cuando la base est en modo ARCHIVELOG. Se lanza despus de

    cada log switch. Puede haber hasta 10 de estos procesos y el proceso LGWR se encarga de lanzar ms instancias si el rendimiento de las que hay

    activas no es suficiente. En el fichero alert.logqueda constancia de la creacin de nuevos procesos ARCn. Se puede establecer el nmero mximo

    mediante el parmetro log_archive_max_processes.

    4.4.7

    Ficheros

    de

    trazas

    y

    fichero

    alert.log

    Los procesos descritos anteriormente dejan constancia de los problemas que puedan presentarse en su fichero de trazas. El nombre de estos

    ficheros contiene el nombre del proceso que los escribe.

    Tambin existe un fichero de trazas genrico llamado alert.logen el que Oracle escribe cronolgicamente mensajes de advertencias y errores:

    Errores internos, corrupcin de bloques, deadlocks.

    Tareas administrativas realizadas como la creacin o eliminacin de tablespaces, paradas y arranques de la instancia, finalizacin desesiones, etc.

    Errores en el refresco de vistas materializadas y otros.

    Los ficheros de trazas estn en el directorio:

    select*fromv$parameterwherename='background_dump_dest';

    5 Tablas

    5.1 IndexOrganizedTables(IOTs)

    ej. lookup tables

    CREATETABLEDIMA.L_UNIDADES

  • 7/25/2019 Curso Administracin Oracle

    58/145

    58

    (

    CD_USUARIO VARCHAR2(8BYTE) NOTNULL,

    CD_UNIDAD VARCHAR2(8BYTE) NOTNULL,CONSTRAINTL_UNIDADES_PKPRIMARYKEY(CD_USUARIO,CD_UNIDAD)

    )

    ORGANIZATIONINDEX

    TABLESPACEDIMA;

    5.2 TemporaryTables

    Se usan para guardar resultados temporales.

    Los datos que se insertan en las tablas temporales solo son visibles para la sesin que los inserta, aunque se haga commit.

    Generan mucho menos redo que las tablas normales.

    createglobaltemporarytabletemp_table

    (

    )

    oncommitpreserverows;

    Aunque la creemos con la clusula oncommitpreserverows, al cerrar la sesin los datos desaparecern.

    createglobaltemporarytabletemp_table

    (

    )

    oncommitdeleterows;

    se genera redo al trabajar con tablas temporales?

    SQL>createglobaltemporarytablegttoncommitpreserverowsasselect*fromall_objectswhere1=0;

    Tablacreada.

  • 7/25/2019 Curso Administracin Oracle

    59/145

    59

    SQL>setautotraceonstatistics

    SQL>insertintogttselect*fromall_objects;

    66107filascreadas.

    Estadsticas

    2144 recursivecalls

    5192 dbblockgets

    43211 consistentgets

    258 physicalreads

    367432 redosize

    854 bytessentviaSQL*Nettoclient

    794 bytesreceivedviaSQL*Netfromclient

    3 SQL*Netroundtripsto/fromclient

    1088 sorts(memory)

    0 sorts(disk)

    66107 rowsprocessed

    SQL>insert/*+append*/intogttselect*fromall_objects;

    66107filascreadas.

    Estadsticas

    136 recursivecalls

    953 dbblockgets

    41219 consistentgets

    0 physicalreads

    68 redosize

  • 7/25/2019 Curso Administracin Oracle

    60/145

    60

    839 bytessentviaSQL*Nettoclient

    808 bytesreceivedviaSQL*Netfromclient

    3 SQL*Netroundtripsto/fromclient1042 sorts(memory)

    0 sorts(disk)

    66107 rowsprocessed

    SQL>setautotraceoff

    Al usar la clusula /*+append*/estamos usando lo que se conoce como direct-path insert.

    En este modo, los datos se escriben directamente en los ficheros de datos sin pasar por el buffer cachey por lo tanto sin generar redo. Tampoco se

    reutilizan los espacios libres en los bloques ni se tienen en cuenta las restricciones de integridad.

    Para poder usar este mecanismo en tablas no temporales, hay que crearlas con el atributo NOLOGGING.

    5.3 Lobs

    Los campos LOBs (Large Objects)pueden tener un tamao de hasta 4Gb. (similares a los campos MEMOde Access)

    Adems del segmento que se crea al crear una tabla, Oracle crea dos segmentos adicionales, LOB SEGMENTy LOB INDEX, por cada campo LOB que

    contenga la tabla.

    El motivo es que si los objetos son muy grandes es ms eficiente guardarlos en segmentos independientes, en lugar de meterlos en la fila dentro

    del bloque. Adems, estos objetos grandes se almacenan en trozos (chunks). El tamao de estos chunkses configurable. De ah la necesidad del

    segmento LOB INDEX.

    Como veremos ahora, estos segmentos no tienen por qu estar en el mismo tablespaceque la tabla, lo cual puede simplificar las tareas

    administrativas (backup, gestin del espacio, etc.)

    Otro motivo fundamental es que los objetos LOB, por defecto, no se cacheanen el buffer cache.

  • 7/25/2019 Curso Administracin Oracle

    61/145

    61

    create

    table

    t1

    (c1

    number,

    c2

    clob);

    select*fromuser_segments;

    Hasta que no insertamos un registro no se crean los segmentos:

    insertintot1(c1,c2)values(1,null);

    La definicin completa de la tabla podemos verla con la sentencia:

    selectdbms_metadata.get_ddl('TABLE','T1')fromdual;

    Se puede modificar la propiedad de cache:

    ALTERTABLEtabnameMODIFYLOB(lobname)(CACHE);

    ALTERTABLEtabnameMODIFYLOB(lobname)(CACHEREADS);

    ALTER TABLE tabname MODIFY LOB (lobname) (NOCACHE); defecto

  • 7/25/2019 Curso Administracin Oracle

    62/145

    62

    ALTERTABLEtabnameMODIFYLOB(lobname)(NOCACHE); defecto

    Por defecto, si los objetos no ocupan ms de 4Kb, Oracle los guarda junto con la fila en el mismo bloque, lo que hace que el funcionamiento seams eficiente. Este comportamiento se puede modificar cambiando la clusula ENABLE STORAGE IN ROWpor DISABLE STORAGE IN ROWen el script de

    creacin de la tabla, o posteriormente con la siguiente sentencia:

    ALTERTABLEtestMOVE

    TABLESPACEtbs1

    LOB(lob1,lob2)

    STOREAS(

    TABLESPACEtbs2

    DISABLESTORAGEINROW);

    6 ndices

    Los ndices contienen adems de los campos que los definen, un campo adicional llamado ROWID.

    Este campo contiene la informacin del fichero de datos y el bloque dentro del fichero de datos que contiene el registro. Con esta informacinOracle puede acceder rpidamente a un registro. Es la forma ms rpida de acceder a un registro (aunque no necesariamente a varios).

    Se deberan disear al mismo tiempo que las tablas, no luego sobre la marcha.

    En general, no es buena idea aadir ndices a una tabla que ya est en produccin.

    Mi apreciacin es que en muchos casos se utilizan demasiados ndices y adems, suelen estar mal diseados.

    Ejemplo de lo que no se debera hacer (15 ndices en una misma tabla):

    CREATETABLEDIMA.COSES1

    (

    ID_COSES1 NUMBER,

    ANO VARCHAR2(4BYTE) NOTNULL,

    CO TIP VARCHAR2(1 BYTE) NOT NULL

  • 7/25/2019 Curso Administracin Oracle

    63/145

    63

    CO_TIP VARCHAR2(1BYTE) NOTNULL,

    NOC VARCHAR2(13BYTE) NOTNULL,

    NU_SERIE_ET VARCHAR2(15BYTE) NOTNULL,CO_UNIDAD_ASIGNADA VARCHAR2(8BYTE),

    DS_UCO_ASIGNADA VARCHAR2(25BYTE),

    DS_BRIGADA VARCHAR2(25BYTE),

    DS_CABECERA VARCHAR2(40BYTE),

    DS_VOCES_COLECTIVAS VARCHAR2(40BYTE),

    DS_SERV VARCHAR2(50BYTE),

    DS_NOMBRE_FAMILIA_CUF VARCHAR2(45BYTE),

    DS_FAM_ACPLA VARCHAR2(100BYTE),

    DS_CONTROL_VIDA1 VARCHAR2(40BYTE),

    DS_CONTROL_VIDA2 VARCHAR2(40BYTE),

    DS_CONTROL_VIDA3 VARCHAR2(40BYTE),

    CA_CONTROL_VIDA1 NUMBER,

    CA_CONTROL_VIDA2 NUMBER,

    CA_CONTROL_VIDA3 NUMBER,

    COS NUMBER,

    CM NUMBER,

    COD NUMBER,

    COI NUMBER,

    YOLD NUMBER,

    COP NUMBER,

    COC NUMBER,

    ESCALON NUMBER NOTNULL,

    A02P NUMBER,

    A02C NUMBER,

    ET VARCHAR2(2BYTE) DEFAULT'ET' NOTNULL

    );

    CREATEINDEXDIMA.COSES1_CO_TIP_INDXONDIMA.COSES1(CO_TIP);

    CREATEINDEXDIMA.COSES1_CO_UNIDAD_ASIG_INDXONDIMA.COSES1(CO_UNIDAD_ASIGNADA);

    CREATEINDEXDIMA.COSES1_DS_BRIGADA_INDXONDIMA.COSES1(DS_BRIGADA);

    CREATE INDEX DIMA COSES1 DS CABECERA INDX ON DIMA COSES1 (DS CABECERA);

  • 7/25/2019 Curso Administracin Oracle

    64/145

    64

    CREATEINDEXDIMA.COSES1_DS_CABECERA_INDXONDIMA.COSES1(DS_CABECERA);

    CREATEINDEXDIMA.COSES1_DS_DS_CNTR_VIDA1_INDXONDIMA.COSES1(DS_CONTROL_VIDA1);

    CREATE

    INDEX

    DIMA.COSES1_DS_DS_CNTR_VIDA2_INDX

    ON

    DIMA.COSES1

    (DS_CONTROL_VIDA2);

    CREATEINDEXDIMA.COSES1_DS_DS_CNTR_VIDA3_INDXONDIMA.COSES1(DS_CONTROL_VIDA3);

    CREATEINDEXDIMA.COSES1_DS_FAM_ACPLA_INDXONDIMA.COSES1(DS_FAM_ACPLA);

    CREATEINDEXDIMA.COSES1_DS_NOMBRE_FAM_CUF_INDXONDIMA.COSES1(DS_NOMBRE_FAMILIA_CUF);

    CREATEINDEXDIMA.COSES1_DS_SERV_INDXONDIMA.COSES1(DS_SERV);

    CREATEINDEXDIMA.COSES1_DS_UCO_ASIGNADA_INDXONDIMA.COSES1(DS_UCO_ASIGNADA);

    CREATEINDEXDIMA.COSES1_DS_VOC_COLECTIV_INDXONDIMA.COSES1(DS_VOCES_COLECTIVAS);

    CREATEINDEXDIMA.COSES1_ESC_INDX1ONDIMA.COSES1(ESCALON);

    CREATEUNIQUEINDEXDIMA.COSES1_PKONDIMA.COSES1(ID_COSES1);

    CREATEUNIQUEINDEXDIMA.COSES1_U01ONDIMA.COSES1(ANO,CO_TIP,NOC,NU_SERIE_ET,ESCALON);

    CREATEINDEXDIMA.COSES1_YOLD_INDXONDIMA.COSES1(YOLD);

    Consultas til para la consulta de ndices:

    selecttable_name,count(*)

    fromdba_indexes

    wheretable_owner='DIMA'

    groupbytable_name

    orderby2desc;

    selecttable_owner,table_name,index_name,column_name,column_position

    fromdba_ind_columns

    wheretable_owner='DIMA'

    orderbytable_name,index_name,column_position;

    Desventajas de definir muchos ndices y/o ndices con muchas columnas:

    Las actualizaciones de las tablas son ms costosas. Por cada registro que se inserte, modifique o borre, hay que actualizar todos los ndices

    de la tabla.

    La eleccin del plan de ejecucin ser ms compleja, aumentando la probabilidad de que el optimizador elija uno que no sea ptimo.

    Si un ndice contiene muchos campos, se necesitarn ms lecturas para leerlo y ocupar ms espacio en memoria, por lo que penalizar a

    todos los usuarios

  • 7/25/2019 Curso Administracin Oracle

    65/145

    65

    todos los usuarios.

    Cuando se cargan o se eliminan grandes cantidades de registros de una tabla puede ser bastante ms eficiente deshabilitar algunos ndices yrecrearlos al finalizar la operacin:

    ALTERINDEXUNUSABLE;

    ALTERINDEXREBUILD;

    Tipos de ndices:

    B*Tree

    Index Organized Tables (IOT)

    Birmap

    Bitmap Join

    Function-based indexes

    6.1 B*Tree

  • 7/25/2019 Curso Administracin Oracle

    66/145

    66

    Los nodos finales (leaf nodes)que contienen la clave y el RowIddel registro estn enlazados por una doble lista enlazada que permite el barrido

    de los registros secuencialmente (index rage scan).

    Una de las propiedades de este tipo de rboles es que todos los nodos finales estn al mismo nivel, que se conoce como la profundidad (height)

    del ndice. La mayora de los ndices tienen una profundidad de 2 o 3, aunque tengan millones de registros, por lo que solo se necesitan dos o tres

    lecturas para llegar al registro deseado. Otra propiedad es que los rboles se crean perfectamente balanceados, aunque tras mltiples inserciones e

    eliminaciones este balanceo se puede ir deteriorando.

  • 7/25/2019 Curso Administracin Oracle

    67/145

    valor se aproxima al nmero de bloques de la tabla, significa que los datos en la tabla estn muy ordenados respecto al ndice. Sin embargo, si el

    valor es cercano al nmero de registros, los datos estn muy desordenados y su uso sera poco eficiente.

  • 7/25/2019 Curso Administracin Oracle

    68/145

    68

    valor es cercano al nmero de registros, los datos estn muy desordenados y su uso sera poco eficiente.

    Es uno de los factores que el optimizador tiene en cuenta a la hora de decidir el plan de ejecucin para una consulta.

    Hay que tener en cuenta que solo un ndice de data tabla puede tener un buen clustering_factor.

    Hay veces que Oracle puede darnos el resultado de una consulta accediendo nicamente al ndice, como por ejemplo, si queremos conocer el

    nmero de registros de una tabla.

    Existe un modo rpido de lectura de ndices llamado fast full scan, con el que se leen los bloques del ndice sin un orden en particular. El resultado

    de esta lectura no est ordenado.

    6.2 ndicesBitmap

    No estn disponibles en la versin Standard, solo en la Enterprise.

    Son adecuados para columnas en las que hay pocos valores diferentes comparados con el nmero total de registros en la tabla.

    Ejemplo del tipo de consulta en la que son muy eficientes.

    selectcount(*)

    fromT

    wheregenero='H'

    andprovinciain(1,10,30)

  • 7/25/2019 Curso Administracin Oracle

    69/145

    69

    andgrupo_de_edad='41ysuperior';

    Esta consulta sera muy poco eficiente si se utilizan ndices B*Tree, sobre todo si no conocemos a priori cules son las condiciones que se aplicarn.

    Estn orientados a sistemas DSS (Decision Support Systems) y Data Warehouses, no sistemas OLTP (Online Transaction Processing).

    Cuando se modifican los datos, Oracle necesita bloquear gran parte del ndice para poder recrearlo, lo que podra degradar el funcionamiento de

    sistemas OLTP, en los que varios usuarios pueden estar modificando datos simultneamente.

    6.3

    ndices

    Bitmap

    Join

    Permiten realizar una desnormalizacin, pero no en los datos sino en el ndice.

    Veamos un ejemplo:

    La tabla DIMA.REPUESTOS_ET tiene el campo ID_TIPOS_DE_ARTICULOS.

    Este campo es una referencia a la tabla DIMA.TIPOS_DE_ARTICULOS:

    Si queremos hacer una consulta por el cdigo del tipo de artculo, no nos queda ms remedio que hacer unjoin:

    selectcount(*)

    fromREPUESTOS_ETR,TIPOS_DE_ARTICULOST

    whereR.ID_TIPOS_DE_ARTICULOS=T.ID_TIPOS_DE_ARTICULOS

    d T CO TIPOS DE ARTICULOS 'G'

  • 7/25/2019 Curso Administracin Oracle

    70/145

    70

    andT.CO_TIPOS_DE_ARTICULOS='G';

    |Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |

    | 0|SELECTSTATEMENT | | 1| 8| 5992 (1)|00:01:12|

    | 1| SORTAGGREGATE | | 1| 8| | |

    |* 2| HASHJOIN | |86228| 673K| 5992 (1)|00:01:12|

    |* 3| TABLEACCESSFULL|TIPOS_DE_ARTICULOS| 1| 5| 3 (0)|00:00:01|

    |* 4| TABLEACCESSFULL|REPUESTOS_ET | 517K| 1515K| 5988 (1)|00:01:12|

    PredicateInformation(identifiedbyoperationid):

    2 access("R"."ID_TIPOS_DE_ARTICULOS"="T"."ID_TIPOS_DE_ARTICULOS")

    3 filter("T"."CO_TIPOS_DE_ARTICULOS"='G')

    4 filter("R"."ID_TIPOS_DE_ARTICULOS"ISNOTNULL)

    Oracle nos permite crear el siguiente ndice, con el que asociamos al ndice de una tabla un campo de otra tabla:

    createbitmapindexREPUESTOS_ET_TIPO_ART_IDX

    onREPUESTOS_ET(T.CO_TIPOS_DE_ARTICULOS)

    fromREPUESTOS_ETR,TIPOS_DE_ARTICULOST

    where

    R.ID_TIPOS_DE_ARTICULOS

    =

    T.ID_TIPOS_DE_ARTICULOS;

    Con este ndice, podemos conseguir el resultado de la consulta accediendo tan solo al ndice.

    La lnea 2 es un error del optimizador, que aade una condicin que en este caso es innecesaria y que obliga a Oracle a leer los registros que

    cumplen la condicin principal.

    |Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |

  • 7/25/2019 Curso Administracin Oracle

    71/145

    71

    |

    0

    |

    SELECT

    STATEMENT

    |

    |

    1

    |

    3

    |

    4

    (0)|

    00:00:01

    |

    | 1| SORTAGGREGATE | | 1| 3| | |

    |* 2| TABLEACCESSBYINDEXROWID|REPUESTOS_ET | 103K| 302K| 4 (0)|00:00:01|

    | 3| BITMAPCONVERSIONTOROWIDS| | | | | |

    |* 4| BITMAPINDEXSINGLEVALUE|REPUESTOS_ET_TIPO_ART_IDX| | | | |

    PredicateInformation(identifiedbyoperationid):

    2 filter("R"."ID_TIPOS_DE_ARTICULOS"ISNOTNULL)

    4 access("R"."SYS_NC00089$"='G')

    6.4 Functionbasedindexes

    select*

    fromUNIDADwhereUpper(DS_NOMBRE_CORTO)='GACAI/63';

    |Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |

    | 0|SELECTSTATEMENT | | 14| 2492| 13 (0)|00:00:01|

    |* 1| TABLEACCESSFULL|UNIDAD| 14| 2492| 13 (0)|00:00:01|

    PredicateInformation(identifiedbyoperationid):

    1 filter(UPPER("DS_NOMBRE_CORTO")='GACAI/63')

    createindexUNIDAD_NOMBRE_CORTO_IDX

    on UNIDAD(DS NOMBRE CORTO);

  • 7/25/2019 Curso Administracin Oracle

    72/145

    72

    onUNIDAD(DS_NOMBRE_CORTO);

    |Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |

    | 0|SELECTSTATEMENT | | 14| 2492| 13 (0)|00:00:01|

    |* 1| TABLEACCESSFULL|UNIDAD| 14| 2492| 13 (0)|00:00:01|

    PredicateInformation(identifiedbyoperationid):

    1 filter(UPPER("DS_NOMBRE_CORTO")='GACAI/63')

    dropindexUNIDAD_NOMBRE_CORTO_IDX;

    createindexUNIDAD_NOMBRE_CORTO_IDX

    onUNIDAD(Upper(DS_NOMBRE_CORTO));

    |Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |

    | 0|SELECTSTATEMENT | | 14| 2492| 6 (0)|00:00:01|

    | 1| TABLEACCESSBYINDEXROWID|UNIDAD | 14| 2492| 6 (0)|00:00:01|

    |* 2| INDEXRANGESCAN |UNIDAD_NOMBRE_CORTO_IDX| 6| | 1 (0)|00:00:01|

    PredicateInformation(identifiedbyoperationid):

    2 access(UPPER("DS_NOMBRE_CORTO")='GACAI/63')

    Importante: para poder usar funciones en este tipo de ndices es necesario marcarlas como DETERMINISTIC para indicar a Oracle que para un

  • 7/25/2019 Curso Administracin Oracle

    73/145

    73

    Importante: para poder usar funciones en este tipo de ndices, es necesario marcarlas como DETERMINISTIC, para indicar a Oracle que para un

    mismo parmetro la funcin siempre devolver el mismo resultado.

    functionmi_funcion(parametroinvarchar2)returnvarchar2deterministicas

    begin

    ...

    end;

    Otro caso til: supongamos que tenemos una tabla PEDIDOS con un campo ENVIADO que puede tomar los valores S y N. Cuando tiene el valor

    S debe rellenarse el campo NUM_ENVIO. En caso contrario permanece a nulo. En principio no podemos definir un ndice nico por los camposENVIADO y NUM_ENVIO porque habra muchos registros con los valores (N, NULL). Puesto que en los ndices B*Treeno se almacenan los

    registros en los que todos los campos del ndice sean nulos, podemos definirlo del siguiente modo:

    createuniqueindexPEDIDOS_IDX

    onPEDIDOS(casewhenENVIADO='N'thenNULLend,NUM_ENVIO);

    Nota: Oracle nunca podr usar un ndice en el que todos sus campos puedan ser nulos para realizar un count(*).

    La vista dba_ind_expressionsnos permite consultar los ndices basados en funciones.

    7 Vistasyvistasmaterializadas

    Breve descripcin.

    Cuando se utiliza una vista, Oracle sustituye la vista por su cdigo.

    8 Sql*Loader

    CREATEUSERCURSO

    IDENTIFIEDBYcurso

    DEFAULTTABLESPACEUSERS

    TEMPORARY TABLESPACE TEMP

  • 7/25/2019 Curso Administracin Oracle

    74/145

    74

    O S C

    PROFILE

    DEFAULT

    ACCOUNTUNLOCK;

    Comprobamos que no podemos iniciar una sesin.

    GRANTCREATESESSIONTOCURSO;

    Creamos la tabla para rellenar a partir de un fichero externo:

    CREATETABLECURSO.LDR_TEST

    (

    CAMPO1 VARCHAR2(20)NOTNULL,

    CAMPO2 VARCHAR2(12),

    CAMPO3 INTEGERNOTNULL,

    CAMPO4 NUMBER,

    CAMPO5 DATE,

    CAMPO6 DATE,

    CAMPO7 VARCHAR2(2000)

    );

    El usuario no tiene permisos para crear una tabla.

    GRANTCREATETABLETOCURSO;

    El usuario todava no puede insertar registros en la tabla:

    ORA01950:noexistenprivilegiosentablespace'USERS'

    GRANTUNLIMITEDTABLESPACETOCURSO;

    insertintoCURSO.LDR_TEST(CAMPO1,CAMPO2,CAMPO3,CAMPO4)

    values('ABC','FOO',15,10.34);

  • 7/25/2019 Curso Administracin Oracle

    75/145

    75

    Vamos a cargar el siguiente fichero:test.csv

    uno;sdfg;dos;tres;cuatro;cinco;seis;siete

    Prueba1;foo;texto1;115;616,33;04/10/2014;06/10/2014;Comentario1

    Prueba2;;texto2;72;;;07/10/201410:15:30;"Comentario2"

    Prueba3;;;101

    Prueba4;;;225

    Prueba

    5

    Prueba6;;;badnumber

    Necesitamos un fichero de control de carga:

    test.ctl

    LOADDATA

    TRUNCATE

    INTOTABLELDR_TESTWHENCAMPO1'Prueba4'

    FIELDSTERMINATEDBY';'

    TRAILINGNULLCOLS

    (

    CAMPO1,

    NO_IMPORTAFILLER,

    CAMPO2"upper(:CAMPO2)",

    CAMPO3INTEGEREXTERNAL,

    CAMPO4DECIMALEXTERNALNULLIFCAMPO4=BLANKS,

    CAMPO5DATE"dd/mm/yyyy",

    CAMPO6"casewhenlength(:CAMPO6)

  • 7/25/2019 Curso Administracin Oracle

    76/145

    76

    test.paruserid=CURSO/curso@ORCL

    direct=true

    silent=(FEEDBACK,HEADER,DISCARDS)

    skip=1

    control=test.ctl

    data=test.csv

    log=test.log

    bad=test.bad

    discard=test.dis

    Ya podemos ejecutar el comando:

    C:\>sqlldrparfile=test.par

    El fichero test.discontendr los registros que no cumplen el formato especificado en el fichero de control. El nmero de registros rechazados se

    puede limitar con el parmetro DISCARDMAX. Por defecto tiene el valor ALLpero se podra poner a 1.

    El fichero test.badcontendr los registros que no se han podido insertar porque se ha producido algn error.

    En el fichero test.logcontendr las estadsticas de la carga y el motivo de los errores si se han producido.

    En el fichero de control podramos haber especificado APPENDen lugar de TRUNCATE.

    9 Tablasexternas

    Desde un usuario autorizado creamos un directorio de Oracle en el que estar el fichero que queremos leer como si fuese una tabla:

    createorreplacedirectoryEXT_TBLas'C:\Users\Alex\Temp\SqlLoader';

    Utilizaremos el mismo fichero test.csvusado en el captulo sobre Sql Loader.

    El usuario CURSO no tiene acceso al directorio:

  • 7/25/2019 Curso Administracin Oracle

    77/145

    77

    selectowner,directory_name,directory_path

    fromall_directories;

    Habilitamos al acceso del usuario CURSOal directorio EXT_TBLen modo lectura, y escritura porque Oracle generar ficheros de log.

    grantread,writeondirectoryEXT_TBLtoCURSO;

    CREATETABLETEST_EXT

    (

    CAMPO1 VARCHAR2(20BYTE),

    NO_VALEVARCHAR(10BYTE),

    CAMPO2 VARCHAR2(12BYTE),

    CAMPO3 VARCHAR2(16BYTE),

    CAMPO4 VARCHAR2(16BYTE),

    CAMPO5 VARCHAR2(10BYTE),

    CAMPO6 VARCHAR2(19BYTE),

    CAMPO7 VARCHAR2(2000BYTE)

    )

    ORGANIZATIONEXTERNAL

    (

    TYPEORACLE_LOADER

    DEFAULTDIRECTORYEXT_TBL

    ACCESSPARAMETERS

    (

    RECORDSDELIMITEDBYNEWLINE

    LOGFILE'test.log'

    BADFILE'test.bad'

    SKIP1

    FIELDSTERMINATEDBY';'OPTIONALLYENCLOSEDBY'"'LDRTRIM

    MISSINGFIELDVALUESARENULL

    REJECTROWSWITHALLNULL

    FIELDS

  • 7/25/2019 Curso Administracin Oracle