Un índice B*TREE (la B significa “Balanceado”) es una estructura de árbol. El nodo raíz de del árbol punto de muchos nodos en el segundo nivel, que puede apuntar a muchos nodos en el tercer nivel y así sucesivamente. La profundidad necesaria del árbol será determinado en gran medida por el numero de filas en la tabla y la longitud de los valores de llaves del índice.
EN EL TRABAJO
La estructura B*TREE es muy eficiente. Si la profundidad es mayor a tres o cuatro, a continuación, o las llaves índices son muy largos o la tabla tiene billones de filas. Si ninguno de estos es el caso, entonces el índice está en la necesidad de una reconstrucción.
Las hojas nodo del árbol del índice almacenan las llaves de las filas, en orden, cada uno con un puntero que identifica la localización física del registro. Así para recuperar una fila con un índice de búsqueda, si la clausula WHERE se utiliza predicado de igualdad en la columna indexada, Oracle navega abajo del árbol al nodo de hoja que contiene el valor llave deseado, y después utiliza el apuntador para encontrar la fila. Si la clausula WHERE se utiliza un predicado noneequality (como cualquiera de los operadores LIKE, BETWEEN, >, o, <) entonces Oracle puede navegar abajo del árbol para encontrar la primera llave coincidente y luego navegar atraves de los nodos hojas del índice para encontrar el resto de valores que emparejan. Como lo hace, recuperara las filas de la tabla en orden.
El puntero a la fila es el ROWID. El ROWID es una pseudo-columna propiedad de Oracle, que cada fila en cada tabla tiene. Cifrada dentro de la dirección física de la fila. Como ROWID no es parte del estándar SQL, nunca son visibles a una declaración SQL, pero usted puede ver y usar si lo desea. Esto es una muestra en la figura 9-5.
Una fila ROWID es globalmente única. Cada fila en cada tabla en la base de datos completa tendrán ROWID diferentes. El cifrado ROWID da la dirección física de la fila. De ella, Oracle puede calcular que archivo del sistema operativo, y donde en el archivo esta la fila, e ir directamente a ella.
Los índices B*Tree son una forma muy eficiente de recuperar filas si el numero de filas necesarias es bajo en proporción al número total de filas en la tabla y si la tabla es grande. Considere esta declaración:
select count(*) from employees where last_name between 'A%' and 'Z%';
Esta clausula WHERE es lo suficientemente amplia que incluirá todas las filas en la tabla. Sería mucha más lenta para buscar en el índice para encontrar los ROWIDS y luego utilizar los ROWIDS para buscar las filas que explorar la tabla completa. Después de todo. Es la tabla entera que es necesaria. Otro ejemplo seria si la tabla fuera muy pequeña que una lectura de disco podría analizarla completamente; no habría punto en la lectura del primer índice.
Se dice a menudo que si la consulta va a recuperar más de 2 o 4 por ciento de las filas, entonces una exploración completa de tabla será más rápida. Una importante excepción a esto es si el valor especificado en la clausula WHERE es nulo. NULL no van en el índice B*TREE, asi que una consulta tal como esta:
select * from employees where last_name is null;
Siempre resultara una exploración complete de la tabla. Hay poco valor crear un índice B*TREE en una columna con pocos valores únicos, no será lo suficiente selectiva: la proporción de la tabla que será recuperada para cada llave distinta será demasiado alto. En general, índices B*TREE debe ser utilizados si:
• La cardinalidad (el numero de valores distintos) en la columna es alta.
• El numero de filas de la tabla es alta, y
Comentarios
Publicar un comentario