SQL 2008 HierarchyID SQL Server 2008 Bootcamp – Día 2
Información sobre versiones
beta• Toda la información y ejemplos respectivos, son
relativos a la beta pública CTP5 de SQL Server
2008
• Comandos y funcionalidades pueden diferir de
la versión RTM final
2© 2007 Solid Quality Mentors
Agenda
• HiearchyId
– Escenarios
– Propiedades clave
– Indexación
– Métodos
– Actualizando a SQL 2008
HiearchyId
3© 2007 Solid Quality Mentors
HierarchyID
• Foros, e hilos en listas de correo
• Gráficos de organización de negocio
• Categorías de gestión de contenidos (CMS)
• Categorías de productos
• Gestión de Archivos/Carpetas
• Una estructura organizacional
• Un conjunto de tareas de un proyecto
• Un grafo de enlaces entre páginas web
Escenarios
4© 2007 Solid Quality Mentors
HierarchyID
• Codifica lógicamente información sobre un nodo
singular en un árbol jerárquico, codificando la
ruta desde la raíz del árbol, al nodo
– Como una secuencia de etiquetas de nodo de un hijo
visitado después del padre
• Una introducción comienza la representación
– La raíz se representa por una introducción única
– Cuatro niveles por debajo de la raíz, cada etiqueta se
codifica como una secuencia de enteros separados
por puntos
Propiedades clave
5© 2007 Solid Quality Mentors
HierarchyID
– La comparación entre hijos se realiza
comparando la secuencia de enteros separados
por comas en un orden de diccionario.
• Cada nivel es seguido de una barra
• Una barra separa padres de hijos
– Los nodos se pueden insertar en cualquier lugar
• Los nodos insertados después de /1/2/ pero
antes de /1/3/ se pueden representar como
/1/2.5/.
• Los nodos insertados antes de 0 tienen la
representación lógica de un número negativo
Propiedades clave
7© 2007 Solid Quality Mentors
HierarchyID
• Hace fácil el guardar
datos y preguntar por
datos jerárquicos
• Optimizado para
representar árboles, que
son la forma mas común
de datos jerárquicos
– Extremadamente
compacto
Propiedades clave
8© 2007 Solid Quality Mentors
/
/1 /2 /3
/1/1 /1/2
/1/1/1
/1/1/1/1
/3/1 /3/2
HierarchyID
• El número medio de bits necesarios para
representar un nodo en un árbol con n nodos,
depende del “fanout” medio
– Fanout: La media de número de hijos de un nodo
• Para pocos fanouts (0-7) el tamaño está sobre
6*logAn bits
– Donde A es el fanout medio
Propiedades clave
9© 2007 Solid Quality Mentors
HierarchyID
• Un nodo en una jerarquía organizacional de
100k elementos con un fanout medio de 6
niveles ocupa sobre 38 bits
– 6 * log6100000 = 38.55
– Los 38 bits son redondeados a 5 bytes (40 bits) para
el almacenamiento
Propiedades clave
10© 2007 Solid Quality Mentors
HierarchyID
• Un tipo de datos del sistema con un tamaño
variable
– CLR UDT
– Microsoft.SqlServer.Types
• Disponible a los clientes como tipo SqlHierarchyId
– Codificación Varbinary (892 bytes max)
• Para representar la posición jerárquica
– No representa una jerarquía por si mismo
• Codifica lógicamente la información sobre un
nodo singular en un árbol jerárquico, codificando
la ruta desde la raíz al nodo
Propiedades clave
11© 2007 Solid Quality Mentors
HierarchyID
• Métodos ricos de manipulación jerárquica nativa
(built-in)
• Simplifica el almacenamiento y recuperación de
datos jerárquicos
• La comparación es en “Depth first”
– a<b significa que a viene antes de b en un recorrido
en profundidad
• Soporte para inserciones y borrados arbitrarios
– Usando métodos del tipo de datos
Propiedades clave
12© 2007 Solid Quality Mentors
HierarchyID
• Dos estrategias para indexado jerárquico de los
datos
– Profundidad (Depth First)
– Anchura (Breadth First)
• No hay palabras especiales para crear índices
– Depth First o Breath first basan las columnas en la
forma en que creaste el índice
• Por defecto: Depth First
• Si pones una columna que contiene un nivel de nodo como
la primera columna: Breath First
Indexado
13© 2007 Solid Quality Mentors
HierarchyID
• Las filas en el subárbol se guardan cerca unas
de otras
• Todos los empleados que reportan al jefe, se
guardan cerca del nodo de su jefe
Indexado – Depth First
14© 2007 Solid Quality Mentors
HierarchyID
• Las filas de cada nivel de jerarquía se guardan
cerca unas de otras
– Los datos de empleados que directamente reportan
al mismo jefe se guardan cerca unos de otros
Indexado – Breadth First
15© 2007 Solid Quality Mentors
HierarchyID
• Escenario de tipo de índice:
– Depth-first: los índices son eficientes para responder
consultas sobre sub-árboles, como “busca todos los
archivos en este directorio y sus subdirectorios”
– Breadth-first: Los índices son eficientes para
responder consultas sobre hijos inmediatos, del estilo
“encuentra todos los empleados que reportan
directamente a este jefe”
Indexado
16© 2007 Solid Quality Mentors
HierarchyID
• Es tarea de la aplicación, manejar la
concurrencia en la generación y asignación de
valores jerárquicos
– No se garantiza que los valores hierarchyid en una
columna sean únicos
• Utiliza la restricción UNIQUE para ello
• Una columna de tipo hierarchyid no representa
automáticamente un árbol
– Es tarea de la aplicación generar y asignar valores
hiearchyid de la forma en la que las filas tengan que
relacionarse
Notas
18© 2007 Solid Quality Mentors
HierarchyID
• Las relaciones jerárquicas representados por
valores hierarchyid no están reforzadas por
claves ajenas
– Es posible tener una relación jerárquica donde A
tiene un hijo B y que se borre A dejando B con una
relación inexistente
• Si este comportamiento no es aceptable, la aplicación ha de
consultar por los hijos antes de borrar los padres
Notas
19© 2007 Solid Quality Mentors
HierarchyID
• La conversión de hiearchyid a XML no está
soportada
• El método ToString() convierte el valor
hiearchyid en su representación lógica como un
tipo de datos varchar(4000)
• Utiliza los métodos Read() y Write() para
convertir hierarchyid a varbinary.
– Solo internamente
Notas
20© 2007 Solid Quality Mentors
HierarchyID
• GetAncestor
• GetDescendant
• GetLevel
• GetRoot
• IsDescendant
• Parse
• Read
• Reparent
• ToString
• Write
Métodos
21© 2007 Solid Quality Mentors
HierarchyID
• La invocación es CASE SENSITIVE!
• GetRoot es “static” o “shared”
– Devuelve la raíz de la jerarquía
• Utilizando los métodos del tipo de datos, se
puede actualizar los datos hiearchyid de varias
formas
– Ej.: Usando el método GetDescendant , siempre será
posible generar un hermano a la derecha de
cualquier nodo, a la izquierda de cualquier nodo, o
entre cualquiera de dos hermanos
Métodos
22© 2007 Solid Quality Mentors
Actualizando a SQL 2008
• Cuando una BBDD se actualiza a SQL Server
2008, se instalan automáticamente el nuevo
ensamblado, y el tipo de datos hierarchyid
– Las reglas de “Upgrade advisor” detectan tipos de
datos o ensamblados que tenga conflicto de nombres
– Upgrade advisor advierte del re-nombramiento de
cualquier ensamblado conflictivo y permite
renombrarlo o utilizar una nomenclatura de dos
partes para referirse al tipo de datos pre-existente
24© 2007 Solid Quality Mentors
Actualizando a SQL 2008
• Si una actualización de BBDD detecta un
ensamblado conflictivo, se renombra
automáticamente y se pone la BBDD en estado
“suspect”
• Si un tipo de usuario con conflicto existe durante
la actualización, no se sigue ningún paso
especial
– Después de la actualización, ambos dos existirán. El
tipo de datos de usuario pre-existente, solo estará
presente a través de una nomenclatura en dos partes
25© 2007 Solid Quality Mentors
Alternativas
• Padre/hijo
• XML
• hierarchyid es por lo general superior a estas
alternativas
Vistazo
26© 2007 Solid Quality Mentors
Alternativas
• Padre/hijo
– Consultas a sub-árboles son significativamente mas
rápidas con hierarchyid
– Consultas directamente descendentes son levemente
mas lentas con hierarchyid.
– Inserción y movimiento de nodos son
considerablemente mas lentas con hierarchyid.
Padre/hijo
27© 2007 Solid Quality Mentors
Alternativas
• Es mas óptimo utilizar XML cuando estas reglas
se cumplen:
– La jerarquía completa siempre se guarda y se
consulta
– Los datos se consumen en formato XML por la
aplicación
– Los predicados de las consultas son extremadamente
limitados y no son críticos en rendimiento
• En SQL Server, cuando se crea un índice XML,
los valores hiearchyid se utiliza de forma interna
para representar la posición jerárquica
XML
28© 2007 Solid Quality Mentors
SQL Server 2008 Links
• Site de SQL Server 2008
– http://www.microsoft.com/sql/2008/
• Ejemplos de SQL Server 2008
– http://www.codeplex.com/SqlServerSamples
31© 2007 Solid Quality Mentors