lunes, 17 de diciembre de 2012

SQL Server: Cómo saber si hay tablas sin índice cluster en una base de datos

Si habitualmente realizas trabajos de DBA sobre una base de datos SQL Server con un número de tablas considerable y no eres el único que realiza este tipo de trabajos seguro que te has preguntado alguna vez, ¿todas mis tablas tienen definido un índice cluster?

Lo primero, recordar qué es un índice cluster (o agrupado), es un índice que almacenan ordenadas las filas de una tabla de acuerdo a los valores de la clave del índice. Varias consideraciones sobre los índices cluster:
  1. Sólo puede haber como máximo un índice cluster por tabla ya que las filas de una tabla sólo pueden almacenarse ordenadas de una única forma.

  2. Normalmente y salvo excepciones todas las tablas que definamos en una base de datos deberían incluir un índice clúster.

  3. En SQL Server cuando se crea una restricción PRIMARY KEY se crea automáticamente un índice único en las columnas de ésta. De forma predeterminada, este índice es cluster pero puede cambiarse a no cluster al crear la restricción.

  4. Es habitual que las columnas sobre las que se define un índice cluster participen en cláusulas JOIN, ORDER BY o GROUP BY. En el caso de las cláusulas ORDER BY o GROUP BY puede evitar que el motor de base de datos ordene los datos ya que las filas ya se encuentran ordenadas, por tanto, el rendimiento de las consultas aumenta.

  5. La estructura que SQL Server utiliza para construir y gestionar los índices son los árboles balanceados (balanced tree, B-tree). Quizás en un próximo artículo hable sobre este tema, de momento no entraremos en más detalle.

Bien, ahora que ya hemos refrescado el concepto de índice cluster vamos al tema, la siguiente consulta nos indica las tablas sin índice cluster que hay en una base de datos:

-- Buscar tablas sin índice cluster en base de datos
SELECT OBJECT_NAME(OBJECT_ID) as TableName
FROM SYS.INDEXES
WHERE INDEX_ID = 0
AND OBJECTPROPERTY(OBJECT_ID,'IsUserTable') = 1
ORDER BY TableName

A continuación os detallo cómo se ha construido la consulta anterior:
  • La instrucción OBJECT_NAME de Transact SQL devuelve el nombre del objeto para los objetos de ámbito de esquema a partir de un identificador proporcionado. Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_NAME).

  • La instrucción OBJECT_ID de Transact SQL devuelve el número de identificador de un objeto de ámbito de esquema.Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_ID).

  • La vista SYS.INDEXES contiene una fila para cada índice cluster, para cada índice no cluster y para cada tabla que no tiene definido un índice cluster. Es recomendable utilizar esta vista en lugar de la tabla SYS.SYSINDEXES que se mantiene por compatibilidad con SQL Server 2000 pero que desaparecerá en futuras versiones de SQL Server. Podéis encontrar más información sobre este tema en el siguiente enlace del MSDN (SYS.INDEXES).

  • La columna "INDEX_ID" de la vista SYS.INDEXES contiene los valores 0 (tabla sin índice cluster), 1 (índice cluster) y > 1 (índice no cluster). Cambiando el valor de este campo se puede obtener distinta información, no sólo las tablas sin índice cluster, interesante.

  • La instrucción OBJECTPROPERTY de Transact SQL devuelve información acerca de los objetos de ámbito de esquema. Para obtener el nombre del esquema en la consulta anterior necesitaremos utilizar la propiedad "SchemaId". Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECTPROPERTY).

Espero que el artículo os haya sido interesante, dentro de

areaTIC

puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

No hay comentarios:

Publicar un comentario en la entrada