post icon

Diferencias entre Indices Clustered y Non-Clustered en SQL Server

Si bien este es un tema que todo DBA debe conocer obligatoriamente para poder realizar el tunning de su base de datos quiero usarlo para explicar algunos conceptos básico para los siguientes artículos que estoy preparando sobre optimización del rendimiento de los querys SQL y comprensión de los planes de ejecución.

Lo que veremos aplica a las versiones 2005 y 2008 de SQL Server, aunque una gran parte también para la versión 2000. De hecho que varios de los conceptos también aplica a otros motores del mercado, unos con menos y otros con más opciones de tunning.

No quiero dar muchos rodeos en el concepto general de lo que es un índice, pero en modo general son objetos del servidor que van asociadas a las tablas, ya sea por una o más columnas de la misma. Las mismas están constituidas por estructuras de árboles para agilizar el acceso a los datos (existen muchos tipos como lo son los árboles binarios, B, B+, etc) Cada punto se llama nodo, y estos nodos tienen a su vez nodos hijos que terminan en nodos hojas (leaf level) y los índices están repartidos en los nodos, sería algo así

Se preguntarán y como entran aquí los Clustered y Non-Clustered Index. Y que diferencia hay entre ellos? Los Non-Clustered normalmente son índices que ocupan menos espacio ya que ellos almacenan un puntero a la página que contiene los datos en sí, en cambio los índices Clustered en vez de almacenar un puntero tiene la página de datos en él. A la hora de acceder a los datos ésta diferencia es muy importante, porque nos ahorra tiempo y cantidad de acceso (Bookmark lookup).

También vale la pena saber que los índices Clustered son utilizados para ordenar de manera física la tabla en el disco, es decir, que si a una consulta no le aplicamos la cláusula ORDER BY será ordenada por su Clustered Index por defecto. Lo que quiere decir que sólo puede existir un sólo índice de éste tipo por razones más que obvias -fisicamente es posible ordenar de un sólo modo-. Así que deben “quemar este cartucho” de la manera más eficiente posible. La cuestión queda en ¿cómo saber cuando usar un índice Clustered? Normalmente el mejor candidatos suele ser la clave primaria autonumeradas, pero no siempre es así. Tampoco es muy recomendable que se lo utilice en claves compuestas, pero lo que más debemos tener en cuenta que se debe aplicar sobre el campo que más utilizado es en las cláusulas WHERE, GROUP BY, ORDER BY. 

Comentarios desde Facebook:

  1. avatar
    david COLOMBIA Internet Explorer Windows
    28 julio 2011 at 17:20 #

    Si vas a hablar de optimización te recomiendo esta herramienta
    http://www.sqlsentry.net/plan-explorer/sql-server-query-view.asp

Trackbacks/Pingbacks

  1. Tutorial básico para interpretar el plan de ejecución de SQL Server | DevTroce.com UNITED STATES WordPress - 4 agosto 2011

    […] esta sección y las que vienen más abajo hace unos días escribí un artículo que les ayudará a diferenciar entre un Indice Agrupado y uno No-Agrupado. Aunque muchas veces suele ser síntoma de un mal uso de los índices, también aparece cuando […]

Responder