Cláusulas de almacenamiento (INITIAL EXTENTS) en ‘SYSTEM LMT’s’

Cláusulas de almacenamiento (INITIAL EXTENTS) en ‘SYSTEM LMT’s’

Oracle presentó los LMT’s (‘Locally Managed Tablespaces’, Tablespaces Gestionados Localmente) a partir de la versión 8. Al principio los DBA’s eran remisos a utilizarlos, pero a partir de la versión 9 su uso no sólo se ha extendido, sino que parece ser casi obligado por el gran número de ventajas que supone (y la ausencia de inconvenientes -al menos que yo conozca-).

Su funcionamiento se basa en ‘bitmaps’ en los datafiles -en vez de tablas en el diccionario de datos como se hacía anteriormente- para localizar los ‘extents’ libres donde alojar nuevos datos. Esto hace que el espacio adyacente pueda verse como ‘uno’ y no fragmentado, evitando así la necesidad de ‘COALESCE’.

En el caso de los LMT’s gestionados por el sistema (‘SYSTEM MANAGED’), a diferencia de los LMT de extensiones de tamaño fijo (‘UNIFORM SIZE’), Oracle tiene un algoritmo propio que calcula el tamaño de los ‘extents’ según se van necesitando.

De esta manera los primeros 16 ‘extents’ serán de 64Kb, sumando así 1Mb en total. En el siguiente escalón se utilizarán hasta 63 ‘extents’ de 1Mb, llegando así a 64 Mb (contando con los 16 de 64Kb). Finalmente los siguientes ‘extents’ serán de 8Mb. y se utilizarán ya todos de este tamaño según vaya creciendo el segmento.

El objetivo parece claro: para segmentos pequeños, se utilizan ‘extents’ pequeños. Cuando el segmento crece los extents se van haciendo más grandes (1Mb), y sólo cuando el tamaño alcanza proporciones mayores (más de 64Mb) se utilizarán ‘extents’ de 8Mb. Es una especie de funcionamiento mejorado del viejo ‘PCTINCREASE’.

Aunque el uso de LMT’s ha dejado obsoleto el uso de INITIAL, NEXT, y MINEXTENTS, resulta que dichos parámetros de almacenamientos SÍ TIENEN REPERCUSIÓN en el momento de crear un objeto (segmento). Oracle reservará el espacio requerido en la creación del objeto, si bien los trasladará a ‘sus números’ utilizando los ‘extents’ necesarios según su algoritmo.

Lo curioso del caso es que Oracle puede decidir saltarse tramos según esas condiciones iniciales de creación.

Para verlo, vamos a utilizar esta vez un índice, para variar (aunque lo mismo valdría para una tabla).

Primero creamos una tabla:

carlosal@db01.xxxxxx> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Solaris: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


carlosal@db01.xxxxxx> create table prueba07 as select * from dba_objects a, prueba01 b;

Tabla creada.

Transcurrido: 00:00:05.04
carlosal@db01.xxxxxx> select  count('x') from prueba07;

COUNT('X')
----------
    144781

carlosal@db01.xxxxxx>

carlosal@db01.xxxxxx> SELECT
  2     TABLESPACE_NAME,
  3     BLOCK_SIZE,
  4     STATUS,
  5     EXTENT_MANAGEMENT,
  6     ALLOCATION_TYPE
  7   FROM DBA_TABLESPACES
  8  WHERE TABLESPACE_NAME='TBS1'
  9  /

TABLESPACE_NAME BLOCK_SIZE STATUS    EXTENT_MAN ALLOCATIO
--------------- ---------- --------- ---------- ---------
TBS1                  8192 ONLINE    LOCAL      SYSTEM

Si creamos un índice ‘tal cual’, Oracle utilizará su algoritmo sin novedad aparente empezando con los 16 ‘extents’ de 64Kb.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2      ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3      TABLESPACE TBS1
  4  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1';

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     2233   65536      8            4
PRUEBA07_IDX1 INDEX                1       4     2241   65536      8            4
PRUEBA07_IDX1 INDEX                2       4     2249   65536      8            4
PRUEBA07_IDX1 INDEX                3       4     2257   65536      8            4
PRUEBA07_IDX1 INDEX                4       4     2265   65536      8            4
PRUEBA07_IDX1 INDEX                5       4     2273   65536      8            4
PRUEBA07_IDX1 INDEX                6       4     2281   65536      8            4
PRUEBA07_IDX1 INDEX                7       4     2289   65536      8            4
PRUEBA07_IDX1 INDEX                8       4     2297   65536      8            4
PRUEBA07_IDX1 INDEX                9       4     2305   65536      8            4
PRUEBA07_IDX1 INDEX               10       4     4361   65536      8            4
PRUEBA07_IDX1 INDEX               11       4     4369   65536      8            4
PRUEBA07_IDX1 INDEX               12       4     4377   65536      8            4
PRUEBA07_IDX1 INDEX               13       4     4385   65536      8            4
PRUEBA07_IDX1 INDEX               14       4     4393   65536      8            4
PRUEBA07_IDX1 INDEX               15       4     4401   65536      8            4
PRUEBA07_IDX1 INDEX               16       4     4489 1048576    128            4
PRUEBA07_IDX1 INDEX               17       4     4617 1048576    128            4
PRUEBA07_IDX1 INDEX               18       4     4745 1048576    128            4
PRUEBA07_IDX1 INDEX               19       4     4873 1048576    128            4
PRUEBA07_IDX1 INDEX               20       4     5001 1048576    128            4
PRUEBA07_IDX1 INDEX               21       4     5129 1048576    128            4

22 filas seleccionadas.

carlosal@carlosal@db01.xxxxxx>

Lo mismo ocurre si creamos el índice con un ‘INITIAL’ por debajo del primer tramo (512k):


carlosal@db01.xxxxxx> DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2      ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3      STORAGE( INITIAL 512k)
  4      TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1';

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     2233   65536      8            4
PRUEBA07_IDX1 INDEX                1       4     2241   65536      8            4
PRUEBA07_IDX1 INDEX                2       4     2249   65536      8            4
PRUEBA07_IDX1 INDEX                3       4     2257   65536      8            4
PRUEBA07_IDX1 INDEX                4       4     2265   65536      8            4
PRUEBA07_IDX1 INDEX                5       4     2273   65536      8            4
PRUEBA07_IDX1 INDEX                6       4     2281   65536      8            4
PRUEBA07_IDX1 INDEX                7       4     2289   65536      8            4
PRUEBA07_IDX1 INDEX                8       4     2297   65536      8            4
PRUEBA07_IDX1 INDEX                9       4     2305   65536      8            4
PRUEBA07_IDX1 INDEX               10       4     4361   65536      8            4
PRUEBA07_IDX1 INDEX               11       4     4369   65536      8            4
PRUEBA07_IDX1 INDEX               12       4     4377   65536      8            4
PRUEBA07_IDX1 INDEX               13       4     4385   65536      8            4
PRUEBA07_IDX1 INDEX               14       4     4393   65536      8            4
PRUEBA07_IDX1 INDEX               15       4     4401   65536      8            4
PRUEBA07_IDX1 INDEX               16       4     4489 1048576    128            4
PRUEBA07_IDX1 INDEX               17       4     4617 1048576    128            4
PRUEBA07_IDX1 INDEX               18       4     4745 1048576    128            4
PRUEBA07_IDX1 INDEX               19       4     4873 1048576    128            4
PRUEBA07_IDX1 INDEX               20       4     5001 1048576    128            4
PRUEBA07_IDX1 INDEX               21       4     5129 1048576    128            4

22 filas seleccionadas.

carlosal@carlosal@db01.xxxxxx>

Pero si intentamos in INITIAL mayor de 1M tendremos que:


carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2      ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3      STORAGE( INITIAL 1032k)
  4      TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 1048576    128            4
PRUEBA07_IDX1 INDEX                1       4     4489 1048576    128            4
PRUEBA07_IDX1 INDEX                2       4     4617 1048576    128            4
PRUEBA07_IDX1 INDEX                3       4     4745 1048576    128            4
PRUEBA07_IDX1 INDEX                4       4     4873 1048576    128            4
PRUEBA07_IDX1 INDEX                5       4     5001 1048576    128            4
PRUEBA07_IDX1 INDEX                6       4     5129 1048576    128            4

7 filas seleccionadas.

Ahora Oracle ha elegido ‘extents’ de 1Mb, saltándose los de 64Kb.

Otra vez, lo mismo ocurre si nos mantenemos por debako de 64 Mb:


carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2  ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3  STORAGE( INITIAL 20m)
  4  TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 1048576    128            4
PRUEBA07_IDX1 INDEX                1       4     4489 1048576    128            4
PRUEBA07_IDX1 INDEX                2       4     4617 1048576    128            4
PRUEBA07_IDX1 INDEX                3       4     4745 1048576    128            4
PRUEBA07_IDX1 INDEX                4       4     4873 1048576    128            4
PRUEBA07_IDX1 INDEX                5       4     5001 1048576    128            4
PRUEBA07_IDX1 INDEX                6       4     5129 1048576    128            4
PRUEBA07_IDX1 INDEX                7       4     5257 1048576    128            4
PRUEBA07_IDX1 INDEX                8       4     5385 1048576    128            4
PRUEBA07_IDX1 INDEX                9       4     5513 1048576    128            4
PRUEBA07_IDX1 INDEX               10       4     5641 1048576    128            4
PRUEBA07_IDX1 INDEX               11       4     5769 1048576    128            4
PRUEBA07_IDX1 INDEX               12       4     5897 1048576    128            4
PRUEBA07_IDX1 INDEX               13       4     6025 1048576    128            4
PRUEBA07_IDX1 INDEX               14       4     6153 1048576    128            4
PRUEBA07_IDX1 INDEX               15       4     6281 1048576    128            4
PRUEBA07_IDX1 INDEX               16       4     6409 1048576    128            4
PRUEBA07_IDX1 INDEX               17       4     6537 1048576    128            4
PRUEBA07_IDX1 INDEX               18       4     6665 1048576    128            4
PRUEBA07_IDX1 INDEX               19       4     6793 1048576    128            4

20 filas seleccionadas.

carlosal@db01.xxxxxx>

Ahora, para satisfacer los 20Mb solicitados, ha optado por utilizar 20 ‘extents’ de 1Mb, obviando de nuevo los 16 de 64Kb.

Si solicitamos un ‘initial’ de 64 Mb, utilizará 64 ‘extents’ de 1 Mb cada uno:

carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2      ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3      STORAGE( INITIAL 64m)
  4      TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx>
carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 1048576    128            4
PRUEBA07_IDX1 INDEX                1       4     4489 1048576    128            4
PRUEBA07_IDX1 INDEX                2       4     4617 1048576    128            4
PRUEBA07_IDX1 INDEX                3       4     4745 1048576    128            4
[...]
PRUEBA07_IDX1 INDEX               61       4    12169 1048576    128            4
PRUEBA07_IDX1 INDEX               62       4    12297 1048576    128            4
PRUEBA07_IDX1 INDEX               63       4    12425 1048576    128            4

64 filas seleccionadas.

carlosal@db01.xxxxxx>

Pero si sobrepasamos, aunque sea un poquito, los 64mB, vemos que se vuelve a producir un salto de tramo:

carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2      ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3      STORAGE( INITIAL 65544k)
  4      TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 8388608   1024            4
PRUEBA07_IDX1 INDEX                1       4     5385 8388608   1024            4
PRUEBA07_IDX1 INDEX                2       4     6409 8388608   1024            4
PRUEBA07_IDX1 INDEX                3       4     7433 8388608   1024            4
PRUEBA07_IDX1 INDEX                4       4     8457 8388608   1024            4
PRUEBA07_IDX1 INDEX                5       4     9481 8388608   1024            4
PRUEBA07_IDX1 INDEX                6       4    10505 8388608   1024            4
PRUEBA07_IDX1 INDEX                7       4    11529 8388608   1024            4
PRUEBA07_IDX1 INDEX                8       4    12553 1048576    128            4

9 filas seleccionadas.

carlosal@db01.xxxxxx>

Ahora se han utilizado directamente los ‘extents’ de 8Mb. Pero curiosamente el último extent (el que pasa de los 64 Mb) es de 1Mb!!

Veamos qué pasa si vamos un poco más allá:

carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx>  CREATE INDEX PRUEBA07_IDX1
  2  ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3  STORAGE( INITIAL 65m)
  4  TABLESPACE TBS1
  5  /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 8388608   1024            4
PRUEBA07_IDX1 INDEX                1       4     5385 8388608   1024            4
PRUEBA07_IDX1 INDEX                2       4     6409 8388608   1024            4
PRUEBA07_IDX1 INDEX                3       4     7433 8388608   1024            4
PRUEBA07_IDX1 INDEX                4       4     8457 8388608   1024            4
PRUEBA07_IDX1 INDEX                5       4     9481 8388608   1024            4
PRUEBA07_IDX1 INDEX                6       4    10505 8388608   1024            4
PRUEBA07_IDX1 INDEX                7       4    11529 8388608   1024            4
PRUEBA07_IDX1 INDEX                8       4    12553 1048576    128            4

9 filas seleccionadas.

Exactamente lo mismo. Si excedemos hasta 1Mb de un múltiplo de 8Mb, se utilizará un último ‘extent’ de 1Mb.

Si vamos más allá, volvemos a los ‘extents’ de 8Mb:



carlosal@db01.xxxxxx>  DROP INDEX PRUEBA07_IDX1
  2  /

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2  ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3  STORAGE( INITIAL 66M)
  4   TABLESPACE TBS1
  5   /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 8388608   1024            4
PRUEBA07_IDX1 INDEX                1       4     5385 8388608   1024            4
PRUEBA07_IDX1 INDEX                2       4     6409 8388608   1024            4
PRUEBA07_IDX1 INDEX                3       4     7433 8388608   1024            4
PRUEBA07_IDX1 INDEX                4       4     8457 8388608   1024            4
PRUEBA07_IDX1 INDEX                5       4     9481 8388608   1024            4
PRUEBA07_IDX1 INDEX                6       4    10505 8388608   1024            4
PRUEBA07_IDX1 INDEX                7       4    11529 8388608   1024            4
PRUEBA07_IDX1 INDEX                8       4    12553 8388608   1024            4

9 filas seleccionadas.

carlosal@db01.xxxxxx>

Este comportamiento se repite en todos los múltiplos de 8Mb:

carlosal@db01.xxxxxx> drop index PRUEBA07_IDX1;

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2  ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3  STORAGE( INITIAL 73M)
  4   TABLESPACE TBS1
  5   /

Índice creado.


carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 8388608   1024            4
PRUEBA07_IDX1 INDEX                1       4     5385 8388608   1024            4
PRUEBA07_IDX1 INDEX                2       4     6409 8388608   1024            4
PRUEBA07_IDX1 INDEX                3       4     7433 8388608   1024            4
PRUEBA07_IDX1 INDEX                4       4     8457 8388608   1024            4
PRUEBA07_IDX1 INDEX                5       4     9481 8388608   1024            4
PRUEBA07_IDX1 INDEX                6       4    10505 8388608   1024            4
PRUEBA07_IDX1 INDEX                7       4    11529 8388608   1024            4
PRUEBA07_IDX1 INDEX                8       4    12553 8388608   1024            4
PRUEBA07_IDX1 INDEX                9       4    13577 1048576    128            4

10 filas seleccionadas.

carlosal@db01.xxxxxx> drop index PRUEBA07_IDX1;

Índice borrado.

carlosal@db01.xxxxxx> CREATE INDEX PRUEBA07_IDX1
  2  ON PRUEBA07(OWNER, OBJECT_NAME, CREATED)
  3  STORAGE( INITIAL 76554240) -- 73M + 8K!!
  4  TABLESPACE TBS1
  5   /

Índice creado.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2         SEGMENT_TYPE,
  3         EXTENT_ID,
  4         FILE_ID,
  5         BLOCK_ID,
  6         BYTES,
  7         BLOCKS,
  8         RELATIVE_FNO
  9    FROM DBA_EXTENTS
 10   WHERE OWNER='CARLOSAL'
 11     AND SEGMENT_NAME='PRUEBA07_IDX1'
 12  /

SEGMENT_NAME  SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------- ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07_IDX1 INDEX                0       4     4361 8388608   1024            4
PRUEBA07_IDX1 INDEX                1       4     5385 8388608   1024            4
PRUEBA07_IDX1 INDEX                2       4     6409 8388608   1024            4
PRUEBA07_IDX1 INDEX                3       4     7433 8388608   1024            4
PRUEBA07_IDX1 INDEX                4       4     8457 8388608   1024            4
PRUEBA07_IDX1 INDEX                5       4     9481 8388608   1024            4
PRUEBA07_IDX1 INDEX                6       4    10505 8388608   1024            4
PRUEBA07_IDX1 INDEX                7       4    11529 8388608   1024            4
PRUEBA07_IDX1 INDEX                8       4    12553 8388608   1024            4
PRUEBA07_IDX1 INDEX                9       4    13577 8388608   1024            4

10 filas seleccionadas.

carlosal@db01.xxxxxx>

En resumen: dejando a un lado el mito de ‘todo en un extent’, Oracle parece evitar los tramos más pequeños a la hora de reservar espacio si utilizamos parámetros de almacenamiento (‘INITIAL’) en la creación de segmentos.

Por último: la curiosidad de utilizar un ‘extent’ de 1Mb para satisfacer los requisitos ‘INITIAL’, no supone que se sigan utilizando ‘extents’ de 1Mb para almacenar subsiguientes necesidades de espacio. Si se necesita más espacio, se utilizarán de nuevo ‘extents’ de 8Mb, dejando una ‘isla’ de un ‘extent’ de 1Mb para seguir creciendo en ‘extents’ de 8Mb.

Para verlo, (y de paso probar que con tablas el comportamiento descrito hasta ahora es idéntico) recrearemos la tabla PRUEBA07 de manera que ocupe más de los 65Mb solicitados en el ‘INITIAL’ y observaremos qué ocurre:

carlosal@db01.xxxxxx> CREATE TABLE PRUEBA07
  2            STORAGE( INITIAL 65m)
  3            TABLESPACE TBS1
  4            AS SELECT a.*, b.* FROM DBA_OBJECTS a, PRUEBA01 b, PRUEBA02 c
  5   /

Tabla creada.

carlosal@db01.xxxxxx> SELECT SEGMENT_NAME,
  2  SEGMENT_TYPE,
  3  EXTENT_ID,
  4  FILE_ID,
  5  BLOCK_ID,
  6  BYTES,
  7  BLOCKS,
  8  RELATIVE_FNO
  9  FROM DBA_EXTENTS
 10  WHERE OWNER='CARLOSAL'
 11  AND SEGMENT_NAME='PRUEBA07'
 12  /

SEGMENT_NAME SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------------ ------------ --------- ------- -------- ------- ------ ------------
PRUEBA07     TABLE                0       4     2185 8388608   1024            4
PRUEBA07     TABLE                1       4     3209 8388608   1024            4
PRUEBA07     TABLE                2       4     4233 8388608   1024            4
PRUEBA07     TABLE                3       4     5257 8388608   1024            4
PRUEBA07     TABLE                4       4     6281 8388608   1024            4
PRUEBA07     TABLE                5       4     7305 8388608   1024            4
PRUEBA07     TABLE                6       4     8329 8388608   1024            4
PRUEBA07     TABLE                7       4     9353 8388608   1024            4
PRUEBA07     TABLE                8       4    10377 1048576    128            4
PRUEBA07     TABLE                9       4    10505 8388608   1024            4
PRUEBA07     TABLE               10       4    11529 8388608   1024            4
PRUEBA07     TABLE               11       4    12553 8388608   1024            4
PRUEBA07     TABLE               12       4    13577 8388608   1024            4
PRUEBA07     TABLE               13       4    14601 8388608   1024            4
PRUEBA07     TABLE               14       4    15625 8388608   1024            4
PRUEBA07     TABLE               15       4    16649 8388608   1024            4
PRUEBA07     TABLE               16       4    17673 8388608   1024            4
PRUEBA07     TABLE               17       4    18697 8388608   1024            4
PRUEBA07     TABLE               18       4    19721 8388608   1024            4
PRUEBA07     TABLE               19       4    20745 8388608   1024            4
PRUEBA07     TABLE               20       4    21769 8388608   1024            4
PRUEBA07     TABLE               21       4    22793 8388608   1024            4

22 filas seleccionadas.

carlosal@db01.xxxxxx>

El ‘extent’ número 8 es de 1Mb (para satisfacer el ‘INITIAL’), pero los siguientes vuelven a ser de 8Mb.

Este comportamiento es un poco ‘particular’, pero es como Oracle gestiona los ‘extents’ para LMT’s de tipo ‘SYSTEM MANAGED’ con cláusulas de almacenamiento.

Saludos.

Carlos.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: