viernes, 17 de agosto de 2012

Indices en SQL Server

El objetivo de un índice es acceder más rápido a los datos. Aparte de los índices que se crean para las llaves primarias se pueden crear otros índices de manera de optimizar consultas sobre campos específicos de las tablas, por ejemplo cuando en un WHERE se considere un campo diferente a la llave primaria.

La sintaxis para crear un índice es la sgte:

create <TIPODEINDICE> index <NOMBREINDICE>
on <TABLA>(<CAMPO(S)>);

El "TIPODEINDICE" indica si es agrupado (clustered) o no agrupado (nonclustered). Si no se especifica se crea uno "No agrupado"
SQL Server crea automáticamente índices cuando se establece una restricción "primary key" o "unique" en una tabla. Al crear una "primary key", si no se especifica, el índice queda como agrupado (clustered) a menos que ya exista un índice agrupado para dicha tabla. Al crear una llave "unique", si no se especifica, el índice será no agrupado (non-clustered).
Los índices clustered son útiles para las columnas que son muy consultadas por algún rango, o accesadas en orden ascendente o descendente.

Consideraciones para usar índices agrupados
  • Columnas selectivas
  • Columnas afectadas en consultas de rangos: BETWEEN, mayor que, menor que, etc.
  • Columnas accedidas "secuencialmente"
  • Columnas implicadas en JOIN, GROUP BY
Los índices nonclustered son útiles cuando se requiere accesar la información de múltiples maneras.

Consideraciones para usar índices no agrupados
  • Columnas con datos muy selectivos
  • Consultas que no devuelven muchas filas.
  • Columnas en WHERE.
  • Evitar acceso a páginas de datos realizando el acceso sólo por el índice.
Luego de crear los índices es necesario revisar que el desempeño de la consulta en cuestión haya mejorado y además ver que otras consultas que se hagan a la tabla no hayan sido afectado negativamente.

Se pueden crear todos los índices que se quieran sobre una tabla, pero se debe tener especial cuidado que eso no haga más lentas las consultas.

Algunas ayudas:
Para obtener la lista de indices de la base de datos:
select name from sysindexes;
 (Al crear los propios índices se puede poner algun prefijo de manera de identificarlos mejor, Ej.: IDX_<NOMBREINDICE>)
Para ver los indices de una tabla:
sp_helpindex <TABLA>;

Fuentes:
http://msdn.microsoft.com/es-es/library/ms345331(v=sql.90).aspx
http://bdatos.wordpress.com/base-de-conocimiento/microsoft-sql-server-perfomance/mssql-una-introduccion-a-los-indices-agrupados-y-no-agrupados-de-estructura-de-datos/
http://www.sqlserverya.com.ar/temarios/descripcion.php?cod=68&punto=62
http://www.zonacodigos.com/index.php/sql/59-creacion-de-indices
http://msdn.microsoft.com/es-es/library/ms130862.aspx

No hay comentarios.: