2012-03-19 22 views
34

Tengo un índice UNIQUE, NON CLUSTERED en una tabla que actualmente utiliza 4 columnas para el índice.SQL Server: ¿cómo escribir una declaración de índice alter para agregar una columna al índice único?

Quiero crear una secuencia de comandos alter que simplemente puede agregar otra columna a este índice. El nuevo tipo de columna es varchar.

La base de datos es SQL Server 2005.

Gracias de antemano.

+2

Estoy seguro de que me falta algo pero ¿por qué no puedes usar 'DROP INDEX Table. ; CREAR UN ÍNDICE ÚNICO EN LA Tabla (Col1, Col2, Col3, Col4) ' –

+0

@Lieven, estaba pensando en esto también. ¿Es posible DROP con seguridad y luego CREAR el índice con los datos existentes en la tabla? –

+1

Sí. Puede soltar y crear índices a voluntad. Todo lo que puede notar es un descenso en el rendimiento al ejecutar consultas mientras los índices se han ido, pero cayendo y creando un índice (sin agrupar) tiene ** impacto ** en absoluto sobre los datos reales almacenados en sus tablas * (Crear un índice agrupado impacta el ordenamiento físico de sus datos, pero de nuevo, los datos ** no ** se pierden) * –

Respuesta

63

No se puede alterar un índice - todo lo que puede hacer es

  1. caer el índice antiguo (DROP INDEX (indexname) ON (tablename))
  2. volver a crear el nuevo índice de la columna adicional en ella:

    CREATE UNIQUE NONCLUSTERED INDEX (indexname) 
        ON dbo.YourTableName(columns to include) 
    

La instrucción ALTER INDEX en SQL Server está disponible para alterar ciertas propiedades (propiedades de almacenamiento, etc.) de un existente g índice, pero no permite cambios en las columnas que componen el índice.

+1

Gracias Marc, su solución propuesta funcionó, y el script aprobado por los DBA en nuestro equipo. –

+35

Ahora me tienes perplejo ... ¿por qué hacer la pregunta si tienes DBA's en tu equipo? –

+3

Mire en DROP_EXISTING en la página Crear índice en MSDN. Con ciertas restricciones, puede modificar un índice. Vea la respuesta de Paul White aquí. http://www.sqlservercentral.com/Forums/Topic913722-391-1.aspx – Gabe

3

Si la nueva columna que está agregando al índice está al final de la lista de columnas; en otras palabras, si la lista de columnas del índice anterior es un prefijo de la lista de columnas del nuevo índice, entonces las filas que están ordenados por las columnas antiguas seguirán ordenándose según las nuevas columnas. En Sybase SQL Server y quizás versiones anteriores de Microsoft SQL Server, había una opción with sorted_data que le permitía declarar que las filas ya estaban ordenadas. Pero en MSSQL 2008 R2 parece no tener ningún efecto; la opción es aceptada pero ignorada en silencio. En cualquier caso, creo que la opción fue más útil con los índices agrupados.

Otros mencionaron with drop_existing, que suena genial, pero es solo para versiones más caras de MSSQL.

+1

¿De dónde sacas 'con sorted_data'? No veo 'sorted_data' enumerado como' con', también conocido como "relational_index_option", de la declaración 'create index' en los documentos de SQL Server 2008+ para esa declaración (en: [link] (https: // docs. microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql)). – Tom

+1

'con sorted_data' es algo que recuerdo de los viejos tiempos de Sybase SQL Server. Microsoft ha eliminado algunas de las funky opciones de creación de índices que Sybase admite, pero no esta. Sin embargo, un experimento rápido en MSSQL 2008 R2 muestra que ahora puede ser no operativa; no se da error si los datos en la tabla no están ordenados. Entonces revisaré mi respuesta. –

+0

Una búsqueda rápida muestra que la opción fue documentada para MSSQL 2000. –

Cuestiones relacionadas