Preguntas y respuestas acerca de SQLÍndices no clúster y retención de permisos

Saleem Hakani and Dan Carollo

Índices no clúster y sus usos

P: ¿Qué son los índices no clúster y cuáles son los pros y los contras de usarlos?

R: Un índice no clúster es similar al tipo de índice que normalmente se encuentra al final de un libro. Toda la información que contiene el libro se representa en el índice por tema y hay punteros en forma de números de página que le indican dónde encontrar la información, tal vez en varias áreas del libro. Además, los datos de un índice de libro no se enumeran en el mismo orden que aparecen en el texto del libro. Lo mismo sucede con los índices no clúster. Si tiene un índice no clúster en una tabla, puede especificar cuál será el orden los elementos. De lo contrario, no hay forma de estar seguro de cuál será el orden.

Además, los índices no clúster tienen dos limitaciones: sólo se pueden incluir 16 columnas en el índice y el tamaño máximo de la clave de índice no puede superar los 900 bytes. ¿Qué significa eso? Veamos lo que sucede si desea indizar las siguientes columnas de la tabla Movie de la base de datos MovieList de ejemplo: MovieTitle NVarchar(50), DirectorName NVarchar(50), ShortStory NVarchar(400).

Suponga que usa la siguiente instrucción para crear la tabla:

Use MovieList;
CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName, ShortStory); 

Se generará el siguiente mensaje de error: "Advertencia: la máxima longitud de clave es de 900 bytes. El índice 'Movie_IDX' tiene una longitud máxima de 1000 bytes. Para algunas combinaciones de valores grandes, la operación de inserción o actualización no funcionará correctamente." El mensaje anterior aparece porque el tipo de datos "nvarchar" consume 2 bytes por cada carácter. Un índice que contenga las tres columnas anteriores excederá el límite de tamaño de 900 bytes.

Con el lanzamiento de SQL Server® 2005, dispone de la oportunidad de solucionar este problema si agrega las columnas a la cláusula INCLUDE. Es una característica muy útil si desea superar las limitaciones de tamaño y de columnas. Puede hacerlo si ejecuta la siguiente instrucción:

CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName) INCLUDE (ShortStory);

Es importante observar que al usar la cláusula INCLUDE durante la creación del índice, el motor de base de datos no tiene en cuenta las columnas que no son clave al calcular el número de columnas de clave de índice o el tamaño de clave de índice.

Para obtener más información acerca de los índices no clúster, visite "Índices no clúster" en msdn2.microsoft.com/aa174537 y "Uso de índices no clúster" en msdn2.microsoft.com/aa933130. Para obtener sugerencias acerca de la optimización de índices, consulte sql-server-performance.com/optimizing_ indexes.asp.

Conservación de los datos de permisos

P: ¿Cómo puedo evitar la pérdida de permisos cuando se reinicializa una suscripción? El problema se ha producido varias veces al reinicializar una instantánea, que pierde todos los permisos concedidos.

R: De forma predeterminada, todos los objetos de la base de datos de suscripciones se anulan y se vuelven a crear siempre que se reinicializa una suscripción. Pero hay dos formas en que puede tratar esta situación.

En primer lugar, puede volver a aplicar todos los permisos después de la reinicialización. Al configurar los permisos manualmente, debe incluir en el script todos los permisos de nivel de objeto/instrucción y almacenarlos de forma independiente para poder usarlos inmediatamente después de reinicializar la suscripción.

En segundo lugar, puede configurar la suscripción de modo que no anule ningún objeto siempre que reinicialice la suscripción. Para ello, puede usar el procedimiento almacenado de sistema SP_CHANGEARTICLE para configurar el valor de PRE_CREATION_CMD para el parámetro @PROPERTY y un valor de NONE, DELETE o TRUNCATE para el parámetro @Value.

Además, en el cuadro de diálogo Propiedades del artículo, seleccione los valores "Mantener el objeto existente sin cambios. Eliminar datos. Si el artículo tiene un filtro de fila, eliminar sólo los datos que coincidan con el filtro. Truncar todos los datos del objeto existente." Asegúrese de intentarlo en su entorno de prueba y, si necesita más ayuda, consulte la última versión de los Libros en pantalla de SQL Server para obtener información actualizada.

Saleem Hakani es ingeniero jefe de base de datos, ingeniero jefe de solución de problemas y director de la comunidad de Microsoft SQL Server en todo el mundo con 14 años de experiencia en sistemas de bases de datos. Dirige el sitio web externo de la comunidad de SQL Server sqlcommunity.com y puede ponerse en contacto con él en la dirección Saleem@sqlcommunity.com.

Dan Carollo es ingeniero de operaciones y administrador de bases de datos de SQL que trabaja con el equipo de investigación y respuesta antimalware de Windows en Microsoft. Tiene el certificado MCT en SQL Server.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.