2010-03-05 12 views
6

Si tengo una columna de tabla con datos y creo un índice en esta columna, ¿tomará el índice la misma cantidad de espacio de disco que la columna misma?¿Los índices de base de datos toman la misma cantidad de espacio de disco que los datos de columna?

Me interesa porque estoy tratando de entender si los b-trees realmente conservan copias de los datos de las columnas en los nodos de las hojas o de alguna manera lo señalan.

Disculpe si esto es "¿Reemplazará Java XML?" pregunta amable

ACTUALIZACIÓN:

creado una tabla sin índice con una sola columna de GUID, agregó filas 1m - 26MB

misma tabla con una clave principal (índice agrupado) - 25MB (incluso menos!), el tamaño del índice - 176KB

misma mesa con una clave única (índice no agrupado) - 26MB, el tamaño del índice - 27MB

Por lo tanto, solo los índices no agrupados ocupan tanto espacio como los datos mismos.

Todas las mediciones se realizaron en SQL Server 2005

Respuesta

3

El árbol B apunta a la fila en la tabla, pero el propio árbol B todavía tiene algo de espacio en disco.

Algunas bases de datos, tienen una tabla especial que incrusta el índice principal y los datos. En Oracle, se llama IOT - tabla organizada por índice.

Cada fila en una tabla normal se puede identificar mediante una ID interna (pero es específica de la base de datos) que es utilizada por el B-Tree para identificar la fila. En Oracle, se llama rowid y se parece a AAAAECAABAAAAgiAAA :)

Si tengo una columna de la tabla con los datos y crear un índice en esta columna, se el índice de tomar misma cantidad de discos espacio como la propia columna ?

En un B-Tree básico, tiene el mismo número de nodos que el número de elementos en la columna.

Considere 1,2,3,4:

1 
/
2 
    \ 3 
     \ 4 

El espacio exacto todavía puede ser un poco diferente (el índice es probablemente un poco más grande, ya que necesita almacenar enlaces entre nodos, no se puede equilibrar perfectamente, etc.) , y creo que la base de datos puede usar la optimización para comprimir parte del índice. Pero el orden de magnitud entre el índice y la columna de datos debe ser el mismo.

+0

¿Es un tipo de índice agrupado? – Anton

+0

Creo que los índices agrupados almacenan los datos reales, porque los índices agrupados se ordenan de la misma manera que los datos. – Valentin

+0

Sí, IOT es similar a un índice agrupado. La fila en la tabla está físicamente reordenada. Excelente rendimiento para consultar datos, pero más lento para insertar. – ewernli

2

Estoy casi seguro de que es un DB dependiente, pero en general, sí, ocupan espacio adicional.Esto sucede debido a dos razones:

  1. esta manera se puede utilizar el hecho de los datos en hojas BTree se ordenan;

  2. Obtienes la ventaja de la velocidad de búsqueda como y no tienes que volver atrás y para buscar cosas necesarias.

PS acaba de comprobar nuestro servidor MySQL: por un 20GB índices de las tablas toman 10 GB de espacio :)

0

A juzgar por esta article, será, de hecho, tener al menos la misma cantidad de espacio que el datos en la columna (en PostgreSQL, de todos modos). El artículo también sugiere una estrategia para reducir el uso de disco y memoria.

Una forma de comprobarlo por usted mismo sería usar, p. el DB de Derby, crea una tabla con un millón de filas y una sola columna, verifica su tamaño, crea un índice en la columna y verifica su tamaño nuevamente. Si toma entre 10 y 15 minutos para hacerlo, infórmenos los resultados. :)

+0

Pensé que depende de cuántas filas están indexadas. Por ejemplo, si una tabla contiene 30 filas pero solo se pueden buscar 2, solo necesitaría 2 árboles b para esas filas específicas. Es por eso que es importante ** no ** indexar las filas que no se usarán para las búsquedas. –

+0

@Evan: No estoy seguro de seguir ... ¿quiso decir "depende de cuántas columnas estén indexadas"? –

+0

Sí ... Dije que las columnas no lo hice;) –

Cuestiones relacionadas