SQL Server 2008 Bootcamp Día 2 SQL 2008 HierarchyID
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
Agenda HiearchyId HiearchyId Escenarios Propiedades clave Indexación Métodos Actualizando a SQL 2008 3
Escenarios 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 4
Propiedades clave 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 5
DEMO 1 Vistazo al uso de HID 6
Propiedades clave 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 7
Propiedades clave 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 / /1 /2 /3 /1/1 /1/2 /3/1 /3/2 /1/1/1 /1/1/1/1 8
Propiedades clave 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*log A n bits Donde A es el fanout medio 9
Propiedades clave Un nodo en una jerarquía organizacional de 100k elementos con un fanout medio de 6 niveles ocupa sobre 38 bits 6 * log 6 100000 = 38.55 Los 38 bits son redondeados a 5 bytes (40 bits) para el almacenamiento 10
Propiedades clave 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 11
Propiedades clave 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 12
Indexado 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 13
Indexado Depth First 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 14
Indexado Breadth First 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 15
Indexado 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 16
DEMO 2 Índices 17
Notas 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 18
Notas 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 19
Notas 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 20
Métodos GetAncestor GetDescendant GetLevel GetRoot IsDescendant Parse Read Reparent ToString Write 21
Métodos 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 22
DEMO 3 Métodos 23
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
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
Alternativas Vistazo Padre/hijo XML hierarchyid es por lo general superior a estas alternativas 26
Alternativas Padre/hijo 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. 27
Alternativas XML 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 28
DEMO 4 Demo completa 29
Preguntas y respuestas
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