Concepto de Segment
Un segment es aquel espacio reservado por la base de datos, dentro de un datafile, para ser utilizado por un solo objeto. Así una tabla (o cualquier otro objeto) está dentro de su segmento, y nunca podrá salir de él, ya que si la tabla crece, el segmento también crece con ella. Físicamente, todo objeto en base de datos no es más que un segmento (segmento, trozo, sección) dentro de un datafile. Se puede decir que, un segmento es a un objeto de base de datos, lo que un datafile a un tablespace: el segmento es la representación física del objeto en base de datos (el objeto no es más que una definición lógica).
Existen cuatro tipos de segmentos (principalmente):
- Segmentos de TABLE: aquellos que contienen tablas
- Segmentos de INDEX: aquellos que contienen índices
- Segmentos de ROLLBACK: aquellos se usan para almacenar información de la transacción activa.
- Segmentos TEMPORALES: aquellos que se usan para realizar operaciones temporales que no pueden realizarse en memoria, tales como ordenaciones o agrupaciones de conjuntos grandes de datos.
En el esquema vemos como el objeto (tabla) FACTURA tiene un segmento en el datafile A-1, y este segmento está compuesto de 3 extensiones. Una de estas extensiones tiene un color distinto. Esto es porque existen dos tipos de extensiones:
- INITIAL (extensiones iniciales): estas son las extensiones que se reservan durante la creación del objeto. Una vez que un objeto está creado, no se puede modificar su extensión inicial.
- NEXT (siguientes o subsiguientes extensiones): toda extensión reservada después de la creación del objeto. Si el INITIAL EXTENT de una tabla está llena y se está intentando insertar más filas, se intentará crear un NEXT EXTENT (siempre y cuando el datafile tenga espacio libre y tengamos cuota de ocupación suficiente).
Sabiendo que las extensiones se crean en momentos distintos de tiempo, es lógico pensar que unas extensiones pueden estar fragmentadas de otras. Un objeto de base de datos no reside todo junto dentro del bloque, sino que residirá en tantos bloque como extensiones tenga. Por eso es crítico definir un buen tamaño de extensión inicial, ya que, si es lo suficientemente grande, el objeto nunca estará fragmentado.
Si el objeto tiene muchas extensiones y éstas están muy separadas en disco, las consultas pueden retardarse considerablemente, ya que las cabezas lectoras tienes que dar saltos constantemente.
El tamaño de las extensiones (tanto las INITIAL como las NEXT), se definen durante la creación del objeto y no puede ser modificado después de la creación. Oracle recomienda que el tamaño del INITIAL EXTENT sea igual al tamaño del NEXT EXTENT.
La mejor solución es calcular el tamaño que tendrá el objeto (tabla o índice), multiplicando el tamaño de cada fila por una estimación del número de filas. Cuando hemos hecho este cálculo, debemos utilizar este tamaño como extensión INITIAL y NEXT, y tendremos prácticamente la certeza de que no se va a producir fragmentación en ese objeto. En caso de detectar más de 10 extensiones en un objeto (consultando el catálogo de Oracle, como veremos), debemos recrear el objeto desde cero (aplicando el cálculo anterior) e importar de nuevo los datos.
Ciertas operaciones, necesitan de espacio en disco para poder realizarse. El espacio reservado se denomina “segmentos temporales”. Se pueden crear segmentos temporales cuando:
- Se crea un índice
- Se utiliza ORDER BY, DISTINTC o GROUP BY en un SELECT.
- Se utilizan los operadores UNION, INTERSECT o MINUS.
- Se utilizan joins entre tablas.
- Se utilizan subconsultas.
No hay comentarios:
Publicar un comentario