miércoles, 16 de septiembre de 2009

QUE ES UN INDICE BITMAP EN ORACLE?

Los indices B-Tree almacenan rowids en las hojas del arbol. Estos indices pueden llegar a utilizar grandes cantidades de espacio de almacenamiento. A diferencia de los indices B-Tree, los indices de tipo Bitmap utilizan una fraccion de espacio mucho menor representando los rowids como valores binarios (on/off).
Los indices Bitmap son aconsejables en situaciones en que los diferentes valores que puede tomar la columna son relativamente pocos. Ejemplos: sexo, estado civil, etc. Cuantos menos valores posibles, mejor. A medida que crece la cantidad de valores posibles, aumentara el tamaño del indice.

Curiosamente este es el articulo mas leido de SqlEficiente. Evidentemente hay poca informacion en español acerca de los indices bitmap. Por dicho motivo, estare agregando algunos apendices al proyecto, referidos a los indices bitmap. Los links a dichos apendices se iran agregando a este articulo a medida que los vaya publicando.

QUE ES INDICE B-TREE EN ORACLE ?

El indice B-tree es de tipo indice mas comun en una base de datos en oracle.
ES el indice defaul, es decir que si uno crea un indice sin especificar el tipo. Oracle lo creara de tipo B-TREE.
La estructura de un indice B-tree tiene la forma de un arbol invertido. Las estructuras superiores se llaman ramas y la estructura inferior constrituyen las hojas.
Generlamente los indices B-tree tienen uno o mas niveles de ramas cada rama un nivel y contiene informacion sobre otra rama del nivel inmediatamente inferior.

¿QUE ES UN INDICE B-TREE EN ORACLE?

QUE ES UN INDICE (index) ?
  • un indice es una estructura de memoria secunadaria que permite el acceso directo a las filas de una tabla (este o no agrupada).
  • Auamenta la velocidad de respuesta de la consulta, mejorando su remdimiento y optimizando su resultado.
  • su manejo se hace de forma inteligente. Es de propio Oracle quien decide que indice se necesita.

TIPO DE INDICE (INDEX)

LECTURA/ESCRITURA

  • B-tree(árboles binarios)
  • funcion Based
  • Reserve Key

SOLO LECTURA (read only)

  • Bimap
  • Bimap join
  • index orgamized table
  • Cluster y hash cluster

Domain


¿QUE ES Y PARA QUE SIRVE UN TABLESPACE DEL TIPO UNDO (UNDO TABLESPACE) ?

LOS TABLE ESPACE DE TIPO UNO
  1. Podemos tener varios tablespaces de "UNDO", pero solo uno de ellos estarà.
  2. No se pueden crear objetos sobre Tablespace de "UNDO".
  3. Al cambiar de Tablespace "UNDO" activo (con undo_tablespace), los segmentos de Rollback pasan a estar "ONLINE", mientras que los del tablespace anterior se ponen offline.

Los tablespace de tipo uno se crean de dos formas :

  • Mediante create database.
  • Medianate create tablespace: create undo tablespace undotbs02 datafile 'c:\oraclexe\oradata\ex\undo02.dbf' size 25m reuse autoextend on;
  • Para eliminar : Drop tablespace undotbs02;

Paràmetro de inicializaciòn de los espacios de tablas de deshacer:

  • Undo_Management(valores MANUAL/AUTO).si auto se gestionarà de forma automàtica el espcacio de deshacer. No es dinàmico, cuando se cambia de estado se debe rearancar la isntalacia.
  • Undo_tablespace(MANUAL/AUTO). En entornos RAC(Real Application Clusters)

miércoles, 9 de septiembre de 2009

¿QUE ES UN EXTENSION EN ORACLE ?

Al crear o, mejor dicho, asignar una nueva extensión al segmento, se está reservando espacio en el disco para almacenar los nuevos datos de dicho segmento. Por lo tanto, al crear la nueva extensión está totalmente vacía y todo su espacio está disponible para almacenar los datos del segmento y, además, en el disco debe haber espacio libre para que Oracle reserve todo el tamaño que necesita la extensión, y lo formatea de forma especial para poder utilizarlo. A partir de ese momento, en esa extensión solamente se podrán almacenar datos del segmento al que pertenece.

Cuando se llenan todos los bloques de datos de una extensión, el segmento solicita una nueva extensión al sistema para poder seguir almacenando información.

¿Cómo podemos determinar el número de extensiones y su tamaño de un segmento?.

Para establecer el tamaño de las futuras extensiones que irá solicitando un segmento se utilizan varios parámetros a los que hay que dar valor en el momento de la creación de la tabla, índice o segmento de rollback. Estos parámetros se indican en la claúsula STORAGE de la sentencia que crea el segmento y son los siguientes:

Initial:

Indica el tamaño en bytes de la primera extensión que tendrá el segmento. Se puede indicar después del valor una "K" o "M" para que el valor sea interpretado como Kilobytes o Megabytes en lugar de bytes. Si no se pone explícitamente este parámetro en la creación del segmento, se hereda por defecto el valor que tenga este parámetro en el tablespace en el que se está creando el segmento y que, si no se ha indicado tampoco, por defecto son 5 bytes. Cuando se crea una extensión oracle redondea el tamaño indicado al siguiente múltiplo superior a 5 bloques de datos. Por lo tanto, si nuestros bloques son de 8192 bytes y creamos un segmento con un inital de 256Kbytes, realmente estamos creando un segmento de 32 bloques y oracle lo redondea a 35 bloques que es el primer múltiplo superior a 5 de 32. Por lo tanto, nuestra initial extent será de 35 * 8192 = 280 Kbytes.

Para comprobar estos datos se puede consultar la tabla dba_segments en la que tenemos un registro por cada segmento distinto:

Select segment_name, initial_extent, next_extent, pct_increase, min_extent,
max_extent from dba_segments;

Next:

Indica el tamaño que tendrá la próxima extensión que se cree cuando no quede más sitio en las extensiones que ya tiene asignadas el segmento. De igual manera que en el caso del parámetro initial, Oracle redondea a un múltiplo de 5 bloques este valor, a la hora de crear la extensión nueva. Cada vez que se crea una nueva extensión, se recalcula el valor de este parámetro en función del valor de pctincrease y se actualiza la vista dba_segments.

Pctincrease:

En el momento que se asigna una nueva extensión al segmento, se recalcula el valor que va a tener la próxima que se le asigne y que será, el tamaño de la extensión recién creada (el next que tenía el segmento) aumentado en el porcentaje indicado por pctincrease. Por lo tanto, si qeremos que todas las extensiones de nuestro segmento tengan el mismo tamaño, habrá que asignarles el pctincrease a 0. Oracle recomienda establecer por norma el pctincrease a 0 para evitar que se descontrolen los tamaños de los segmentos, especialmente los temporales, aunque, curiosamente, su valor por defecto es de 50%. No se puede modificar el pctincrease de los segmentos de rollback que es siempre 0.

Mostremos un ejemplo: tenemos un segmento que en el campo next_extent tiene como valor 262144 y en pct_increase tiene 50 y los bloques son de 8192 bytes. Cuando crezca el segmento y solicite una nueva extensión, ésta se creará del tamaño indicado en next_extent redondeándola al primer múltiplo de 5 bloques superior o igual a dicho valor. En nuestro caso 262144 son 32 bloques así que creará una extensión de 35 que son 286720 bytes. Además, recalcula el valor del siguiente next_extent aumentando en un 50% el valor del antiguo next_extent, es decir 262144 * 1,5 = 393216 bytes.

Minextents:

Se indica el número de extensiones que se deben reservar a la vez para un determinado segmento en el momento de su creación. Por defecto es una excepto en los segmentos de rollback que son dos. Puede que las extensiones no estén contiguas. Por supuesto, si en la cláusula storage en la créación del objeto se indican valores para next y pctincrease, las extensiones iniciales que se crean se recalculan para cumplir lo indicado en estos parámetros.

Por ejemplo, creamos un segmento con minextents = 4, con un initial de 262144, next de también 262144, bytes y con un pctincrease del 50%, el resultado será la creación de 4 extensiones de tamaños, 286720, 286720, 409600, 614400 y de un next extent de 884736. Estos tamaños vienen de redondear 32, 48 y 72 a múltiplos de 5 y el next extent es 108 bloques que es el 50% de 72 bloques.

Maxextents:

Es el numero máximo de extensiones que se pueden crear en ese objeto, contando también la primera. Se puede especificar UNLIMITED con lo que pueden crecer indefinidamente. No se recomienda que a los segmentos de rollback se les asigne unlimited maxextents ya que con operaciones complejas podrían aumentar excesivamente de tamaño y llenarían el disco. Así que hay que tener cuidado a la hora de crear rollback segments, sobretodo porque heredan por defecto el valor del parámetro que tenga asignado el tablespace en el que se crean.

Desasignación de Extensiones

Las extensiones que han sido reservadas por un segmento no son devueltas a Oracle para que se las pueda signar a otro segmento del mismo tablespace hasta que se elimina el objeto mediante la instrucción DROP. Por lo tanto, cuando tenemos una tabla que nos ocupa varias extensiones, a pesar de que borremos todas sus filas, esa tabla seguirá teniendo reservadas las extensiones aunque eso si, estarán vacías.

Existen algunas excepciones. Se pueden devolver todas las extensiones de una tabla excepto las min_extents haciendo un truncate de la misma. Hay que ser muy cuidadoso con esta instrucción ya que se eliminan todos los datos de la tabla y, no hay rollback posible. En los segmentos de rollback, si tienen puesto el parámetro optimal, oracle periódicamente puede desasignarle las extensiones que no usa hasta que vuelve a tener el tamaño óptimo. Finalmente, existe una sentencia que también desasigna las extensiones que no se usan en una tabla:

Alter table nombre_de_table deallocate unused; 

En cuanto se ha desasignado una extensión del segmento al que pertenecía, Oracle ya la puede volver a reclamar para que la puedan utilizar otros segmentos del mismo tablespace. Por lo tanto, cuando un nuevo objeto solicite una nueva extensión, si Oracle no encuentra espacio libre suficiente para crear una nueva, y entre las que ha ido desasignando tampoco encuentra ninguna suficientemente grande como para asignarla, puede unir varias de estas extensiones hasta conseguir una lo suficientemente grande como para poder asignársela al segmento. A esta operación se le llama COALESCE de extensiones.


¿QUE ES UN SEGMENTO DE ORACLE?

En una base de datos Oracle, los tablespaces son los contenedores logicos que almacenan estructuras logicas. Oracle provee cuatro tipo de estructuras logicas, llamadas segmentos, que se pueden almacenar dentro de un tablespace: segmentos de datos, segmentos de indices, segmentos de undo y segmentos temporales.
Es muy importante saber que un segmento pertenece a un solo tablespace.
Segmentos de Datos
El espacio del diccionario de datos se suele mantener mas o menos constante, aunque es critico que tenga suficiente espacio

para crecer en el espacio de tablas SYSTEM. Asi, hay que tener cuidado de colocar las tablas de usuario, los indices, segmentos

temporales y los segmentos de rollback en otros espacios de tablas. Ademas, es recomendable que el espacio de tablas

SYSTEM esta al 50% o 75% de su espacio disponible. Finalmente, asegurarse que los usuarios no tienen privilegios de escritura
en el espacio de tablas SYSTEM

Segmentos de indice
Los indices crecen en tamaño en mayor proporcion que las tablas asociadas si los datos en la tabla son modificados
frecuentemente. La gestion del espacio es mejor si se mantienen los indices de tablas grandes en espacios de tablas separados.

Segmentos de Rollback

Los segmentos de rollback almacenan la imagen anterior a una modificacion de un bloque. La informacion en el segmento de
rollback se utiliza para asegurar la consistencia en lectura, el rollback (el valor en el segmento de rollback se copia en el bloque de datos) y la recuperacion.

Segmentos Temporales

Los segmentos temporales se crean cuando se efectuan las siguientes operaciones:

* Create Index
* Select con distinct, order by, union, intersect y minus.
* uniones no indexadas.
* Ciertas subconsultas correlacionadas.

Si las tablas a ordenar son pequeñas la ordenaciin se realiza en memoria principal, pero si la tabla es grande se realiza en disco.

El parametro SORT_AREA_SIZE determina el lugar donde se hace la ordenaciòn. Incrementandole se reduce la creacion de
segmentos temporales.