Sie sind auf Seite 1von 5

Cálculo de Espacio en Oracle 9i

Marı́a Esther Vidal (traducción original del anexo del manual de Oracle)
Editado por: Claudia González y Soraya Abad Mota

5 de marzo de 2006

1. Cálculo del tamaño según los tipos de datos


Cuando se crea una tabla y otras estructuras de datos, debe conocerse cuánto espacio van a
necesitar. Algunos ejemplos son:
1. El CHAR almacena strings de longitud fija.
Tamaño = Longitud * NroBytes por caracter
2. El VARCHAR2 almacena strings de longitud variable.
Tamaño = Longitud promedio * NroBytes por caracter
3. El tipo de datos NUMBER almacena nmeros punto fijo y punto flotante. Se puede especificar
la precision (número total de dı́gitos) y la escala (número total de dgitos a la derecha del
punto decimal). La precisión mxima es 38, y la escala puede variar entre -84 y 127.
Tamaño variable, puede ser hasta 21 bytes por fila.
Tamaño= 1 + techo((precision/2) +1)
4. El tipo de datos DATE almacena fechas y horas.
Tamaño = 7 bytes
5. El tipo de datos LONG almacena datos alfanumricos de longitud variable.
Tamaño variable, hasta 2 GB por fila
6. El tipo de datos ROWID representa la dirección fı́sica para una fila.
Tamaño: 16 bytes por fila

2. Espacio requerido para almacenar tablas no agrupadas


La cantidad de espacio requerido para almacenar las non-clustered tables depende de:

1. La cantidad total de espacio para el encabezado (header) del bloque.


TamañoHeader = KCBH +UB4 + KTBBH + (INITRANS -1) * KTBIT + KDBH
donde,

KCBH, UB4, KTBBH, KTBIT, KDBH son constantes cuyo tamaño puede ser obtenido
seleccionando las entradas de la vista V$TYPE SIZE.

1
KCBH: espacio de encabezado que Oracle coloca por defecto a cualquier bloque.
( Valor 20)
UB4: espacio reservado para marcar el tipo de datos contenido en el bloque de datos.
(Valor 4)
KTBBH: espacio requerido para controlar las posibles transacciones concurrentes.
(Valor 48)
KTBIT: espacio requerido para el control de una transacción concurrente sobre el bloque
de datos. (Valor 24)
KDBH: espacio de encabezado que Oracle coloca a cualquier bloque de datos. (Valor 14)
INITRANS: número inicial de entradas de transacciones asignadas a la tabla.

Puede verificar el valor de estos parámetros en su instancia de Oracle.

2. La cantidad de espacio disponible por bloque de datos.


espacioDisponible = d(hsize ∗ (1 − P CT F REE/100)) − KDBT e
donde

hsize = BD BLOCK SIZE TamañoHeader;


BD BLOCK SIZE: tamaño del bloque de Oracle
KDBT: espacio reservado para el directorio de tablas. (Valor 4)

3. La cantidad de espacio usado por cada fila.

Tamaño de una columna = columnSize + N


If columnSize < 250, N=1 ; else N=3
columnSize se puede determinar con avg(vsize(colname)) de cada columna de la tabla.
rowSize = rowHeader + suma de los tamaños de las columnas, donde
rowHeader = (3*UB1)
SpaceUsedPerRow = MAX(UB1*3 +UB4 +SB2, rowSize) + SB2, donde
UB1= 1, UB4 = 4 y SB2 = 2

4. El número de filas que pueden ser almacenadas en un bloque de datos.


b(espacioDisponible/SpaceU sedP erRow)c

Este procedimiento solamente estima el tamaño de una tabla, no da un valor exacto del número
de bloques. El valor obtenido en estos cálculos se puede utilizar para definir el parámetro INITIAL
de la tabla en el CREATE TABLE. Una vez que se crea y se usa la tabla, el espacio requerido puede
ser mayor que el estimado. Generalmente se requiere mas espacio durante el uso por la forma en
como Oracle administra el espacio libre o el que se va liberando.

2
3. Espacio estimado para los ı́ndices
La cantidad de bloques requeridos para almacenar un archivo de ı́ndice depende de:

El tamaño total del header del bloque de ı́ndice.


Block header size = fixed header + variable transaction header donde,
fixed header= 113
variable transaction header= 24* INITRANS, donde el valor por defecto de INITRANS es 2.

El espacio disponible para datos en cada bloque. Se utiliza la misma fórmula que para las
tablas no agrupadas.

La longitud promedio de la combinación de las columnas ı́ndice. Antes de poder calcular el


espacio ocupado por una fila del ı́ndice, es necesario calcular la longitud promedio de las
columnas que conforman el ı́ndice. Este paso es igual al descrito para las tablas no agrupa-
das, la diferencia está en que en lugar de utilizar todas las columnas de la tabla, se utilizan
solamente las columnas que forman el ı́ndice.

El espacio promedio de los valores del ı́ndice. Una vez que se calcula la longitud promedio
de las columnas del ı́ndice, se puede calcular el tamaño promedio de las entradas del ı́ndice
usando la siguiente fórmula:
BytesPorEntradaIndice = entry header + ROWID length + F + V +D
Donde,

• entry header = 2 bytes


• ROWID length = 6 bytes
• F = longitud total en bytes de todas las columnas que almacenan 127 bytes o menos. El
número de bytes requeridos por cada columna de este tipo es 1.
• V = longitud total en bytes de todas las columnas que almacenan mas de 127 bytes. El
número de bytes requeridos por cada columna de este tipo es 2.
• D = espacio combinado para todas las columnas del ı́ndice

El número total de bloques y bytes requeridos para el ı́ndice.


Blocks for Index= 1.05 * (Numnot null rows/FLOOR(avalDataPerblock / avg entry size))
El 5 % de espacio adicional se reserva para el espacio requerido para los bloques de las ra-
mas de los indices. El resultado obtenido por estas fórmulas se puede usar en el parámetro
INITIAL en la cláusula CREATE INDEX.

3
4. Estimando el espacio requerido para almacenar un cluster
Se esboza un procedimiento para estimar el espacio inicial necesario para las tablas de un clus-
ter. Hay que tomar en cuenta las siguientes restricciones:

No se almacenan los nulos al final, ni siquiera el byte de longitud de éstos.

Las actualizaciones (insesrciones, modificaciones y borrados) de filas o también las tablas que
contengan columnas más grandes que un bloque de datos, pueden causar fragmentación y
row pieces encadenados.

Una vez que se logre un estimado con el procedimiento descrito a continuación, es necesario
agregar entre un 10 y un 20 % adicional al espacio estimado para darle un valor al parámetro
INITIAL.
Procedimiento para estimar el espacio de un cluster de tablas.

Paso 1: Calcular el espacio realmente disponible en el bloque una vez que se toman en cuenta el
header, el tamaño del bloque y el PCTFREE.
T amanoHEADER = KCBH + U B4 + KT BBH + (IN IT RAN S − 1) ∗ KT BIT + KDBH
donde,

KCBH, UB4, KTBBH, KTBIT, KDBH son constantes cuyo tamaño puede ser obtenido
seleccionando las entradas de la vista V$TYPE SIZE
KCBH: espacio de encabezado que Oracle coloca por defecto a cualquier bloque. ( Valor
20)
UB4: espacio reservado para marcar el tipo de datos contenido en el blqoue de datos.
(Valor 4)
KTBBH: espacio requerido para controlar las posibles transacciones concurrentes. (Valor
48)
KTBIT: espacio requerido para el control de una transaccin concurrente sobre el bloque
de datos. (Valor 24)
KDBH: espacio de encabezado que Oracle coloca a cualquier bloque de datos. (Valor 14)
INITRANS: Número inicial de entradas de transacciones asignadas a la tabla.

Hsize = BLOCK SIZE - TamañoHeader


Espacio Disponible para datos en las tablas (AvailTableData)
AvailT ableData = Hsize ∗ (1 − P CT F REE/100) − 4 ∗ (N T ABLES)∗ROW SIN BLOCK,
donde
NTABLES es el número de tablas en el cluster
ROWSINBLOCK es el nmero de filas en un bloque

Paso 2: Calcular el espacio que ocupa una fila de cada tipo de tabla almacenada en el cluster,
sin tomar en cuenta la clave del cluster en ninguna de estas filas. La clave del cluster es la
colección de atributos comunes a todas las tablas que se van a almacenar agrupadas en el
cluster. En este paso tampoco se considera el row header.

4
Paso 3: Calcular el tamao promedio de una fila completa del cluster (sin incluir el cluster key).
bytesLongF ila(T ablai ) + espacioSin(f ilai ) + rowHeader
Calcular el tamaño promedio de las tuplas de todas las tablas agrupadas (clusters)
Se puede calcular la cantidad mı́nima de espacio requerido por una fila en la tabla Ti del
cluster de acuerdo a la siguiente fórmula:
Si = rowHeader + Fi + Vi + Di , donde
rowHeader: 4 bytes por fila
Fi : si la fila tiene 250 bytes o menos, este valor es 1. En caso contrario es 0.
Vi : si la fila tiene mas de 250 bytes, este valor es 3. En caso contrario es 0.
Di : Espacio requerido por la fila de la tabla Ti , tal y como se calculó en el punto anterior.

Paso 4: Calcular el tamaño promedio de un bloque de cluster.


El valor resultante de este paso es lo que se utiliza para el parámetro SIZE. La opción por
defecto es que se coloca un valor de clave de cluster por bloque de datos. Si uno quisiera
colocar más de un valor de la clave de cluster en un bloque, el apéndice del manual de Oracle
sugiere una fórmula (p. A-15) que no parece ser correcta y tiene algunas ambigüedades. Su
objetivo era determinar cuántos registros de cluster con su valor de la clave de cluster, cabrı́an
en un bloque.
Para calcular el tamao promedio de un registro del cluster, hay que primero estimar el núme-
ro promedio de filas, para las tablas, por clave del cluster, despés calcular el tamao promedio
de un bloque del cluster:

SIZE = ((R1 ∗ S1 ) + (R2 ∗ S2 ) + (R3 ∗ S3 ) + + (RN ∗ SN )) + keyHeader + Ck + Sk + 2Rt,


donde
Ri : es el número promedio de filas en la tabla Ti en el cluster.
Si : es el tamaño promedio de las filas en la tabla Ti en el cluster.
keyHeader: 19
Ck : longitud de la columna para la clave del cluster.
Sk : espacio requerido para el valor promedio de la clave del cluster.
Rt: Número total de de filas asociadas con una clave de cluster (R1 + R2 + + Rn ).

Para estimar el número de claves del cluster que pueden almacenarse en un bloque fı́sico:
N umclusterKeysP erBlock = b((EspacioDisponible + 2R)/(SIZE + 2Rt))c

Paso 5: Calcular el número total de bloques requeridos por el cluster.


Para calcular el número total de bloques para el cluster, se debe estimar el número de valores
distintos de la clave de cluster. Una vez que esto es estimado, se usa la siguiente fórmula
para calcular el número total de bloques requeridos para el cluster:
N umBloquesCluster = dN umV aloresClusterKey / N umClusterKeysP erBlocke
Se puede usar el comando ANALYZE para actualizar el nmero de valores de la clave del
cluster.

Das könnte Ihnen auch gefallen