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.