Grimpi IT Blog

febrero 2, 2011

Diferencias entre Unique Index vs Unique Constraint

Filed under: SQL Server — grimpi @ 3:30 pm

La otra vez tuve una discusión con un cliente que me inspiró a hacer este post. ¿Cual es la diferencia entre una constraint UNIQUE y un índice único? Pregunta bastante común para los iniciados en bases de datos.
Y la respuesta a esta pregunta, es que en el 90% de los casos, a efectos prácticos, es lo mismo. La diferencia es más conceptual que técnica.
Tanto una constraint de este tipo como un índice único, restringen los valores de una o varias columnas, impidiendo que se repitan valores. Cuando creamos una UNIQUE constraint, internamente se crea un índice sobre esa columna.
Veamos el siguiente ejemplo:

CREATE TABLE Emp (Id int, Name varchar(20), Email varchar(50))
GO

ALTER TABLE Emp ADD CONSTRAINT IX_Emp UNIQUE (Name)
GO

Ahora consultemos a las vistas de sistema para ver que pasó.

SELECT * FROM sys.indexes WHERE name = ‘IX_Emp’
GO
 
  

 

 

 

Vea que SQL Server crea automáticamente este índice nonclustered. Está marcado como unique constraint y se le da el mismo nombre que a nuestra constraint de la tabla.

El tema es que una constraint es vista como un elemento y requisito del negocio plasmado en la tabla, mientras que un índice único es una característica interna del motor de bases de datos, pero externa a las reglas de negocio de la aplicación. La diferencia es conceptual, a nivel técnico y de performance es lo mismo, pero hace mas clara la auto documentación de la bases de datos, definir una constraint por sobre un índice único.

Sin embargo, hay una diferencia teoría técnica fundamental. Una constraint de tipo UNIQUE sobre una o varias columnas, es una restricción que aplica a toda la tabla. En cambio, un índice único, la restricción aplica solamente sobre el conjunto de registros implicados en el índice. Como en la mayoría de los casos, siempre creamos índices sobre toda la tabla, no hay diferencias, pero hay varias situaciones particulares, donde no es lo mismo:

  • Foreign key: Puedo definir una constraint UNIQUE sobre una columna y usar esa columna como foreign key de otra tabla. Pero no se puede hacer lo mismo con un índice único.
  • Índices filtrados: A partir de SQL Server 2008, es posible definir un índice no por toda la tabla, sino por un conjunto restringido de registros. Si definimos a ese índice como único, esta restricción aplicaría entonces solamente al conjunto de registros implicados en el índice, no a toda la tabla.
    Esta opción nos podría ayudar a resolver la limitación de SQL Server de que solo podamos tener una clave NULL en una restricción de unicidad.
  • Vistas indexadas: Es una situación parecida a la del índice filtrado. Podría darse el caso de tener columnas cuyos valores se repiten, una está dentro de la vista y la otra no, por lo tanto, no se podría usar una constraint única.
    También podría darse el caso de que queremos unicidad en una columna dentro de un conjunto de varias tablas.
    Podríamos crear un índice único sobre una vista que agrupe a esas tablas. Con una constraint no podríamos hacerlo, porque la restriccion solo aplica a una sola tabla.
  • Performance: También hay cuestiones de performance muy finas que en situaciones particulares, hacen más conveniente usar un índice sobre una constraint.
    Por ejemplo, si bien, como ya dijimos antes, cuando creamos una UNIQUE, se crea un índice, este índice es interno, y las posibilidades de asignarle opciones del índice cuando es creado son mucho mas limitada. Podemos decirle con que FILLFACTOR debe ser creado ese índice pero por ejemplo, no podemos crear una constraint UNIQUE cuyo índice tenga la opción INCLUDE COLUMN habilitada. También cuando crea una restricción única, no hay forma de especificar que el índice creado para soportarlo sea ascendente o descendente. Existen algunas (extrañas) situaciones, donde esto podría interesarnos.

Ejemplo:
 
 CREATE TABLE Emp (Id int, Name varchar(20))
 GO

 ALTER TABLE Emp
  ADD CONSTRAINT IX_Emp UNIQUE (Name) WITH (FILLFACTOR = 20) INCLUDE (Email);
 GO 

Si corremos este script, nos va a tirar error. Ya que SQL Server no permite la opcion INCLUDE cuando creamos una UNIQUE constraint.

Resumiendo:
En la mayoría de los casos es lo mismo usar una u otra. Pero es preferible usar una constraint por sobre un índice, porque ayuda a documentar mejor las reglas de negocio de la base, pero por otro lado, usar un índice único nos permite hacer un tunning mas fino sobre la tabla.

30 comentarios »

  1. como puedo hacer el constraint de Unicidad que haga la descripción de la Categoría Única?

    Comentario por Anónimo — octubre 18, 2013 @ 1:12 pm

  2. bobo hpta es que no vez o que ?

    Comentario por Anónimo — octubre 18, 2013 @ 1:23 pm

    • lo que sea malparido hptaaa

      Comentario por Anónimo — octubre 18, 2013 @ 1:25 pm

  3. lo que sea hpta decime dond nos vemos para darte en esa cara pirobo

    Comentario por Anónimo — octubre 18, 2013 @ 1:26 pm

    • hagale gonorrea catre triple hptaa malparido maricon te gusta que te den por ese culo perraaa

      Comentario por Anónimo — octubre 18, 2013 @ 1:28 pm

    • hagale catre triple hpta maricon
      que te dan por ese culo perra
      diga cuando y donde

      Comentario por Anónimo — octubre 18, 2013 @ 1:30 pm

  4. hagale catre triple hptaa malparido maricon que te dan por ese culo perraa diga cuando y donde

    Comentario por Anónimo — octubre 18, 2013 @ 1:29 pm

  5. aahh sikas estas toda tirada a loca porq estas lejos hpta!!! soy de cali y lo que sea .|.

    Comentario por Anónimo — octubre 18, 2013 @ 1:35 pm

  6. aaahh hagale gonorreaa que yo tambien soy de cali y vivo en las montañas de siloe
    no te pongas arisco que te puedo es estar quebrando

    Comentario por Anónimo — octubre 18, 2013 @ 1:38 pm

    • hagale hpta estoy en tequendama llegue pa partirle esa cara gonorrea!!!

      Comentario por Anónimo — octubre 18, 2013 @ 1:44 pm

  7. hagale hpta estoy en tequendama llegame hpta pa partirte esa cara gonorrea

    Comentario por Anónimo — octubre 18, 2013 @ 1:42 pm

  8. hagale hpta estoy en tequendama llegue pa partirle esa cara gonorrea

    Comentario por Anónimo — octubre 18, 2013 @ 1:43 pm

  9. hagale hpta estoy en tequendama llegue pa partirle esa cara gonorrea!!

    Comentario por Anónimo — octubre 18, 2013 @ 1:43 pm

  10. breve sapo hptaa ya le llego diga en donde vas a estar como estas vestido y a que horas sucia

    Comentario por Anónimo — octubre 18, 2013 @ 1:48 pm

  11. breve hpta estoy de sapote pirobo
    como te llamas vz perra

    Comentario por Anónimo — octubre 18, 2013 @ 1:54 pm

  12. breve hpta estoy de sapote pirobo
    como te llamas vz perra!

    Comentario por Anónimo — octubre 18, 2013 @ 1:56 pm

  13. a voz que te importa como me llamo
    te voy a quebrar hpta
    al primer hpta de sapote que vea le voy es a dar duro gonorreaa

    Comentario por Anónimo — octubre 18, 2013 @ 1:58 pm

  14. jajaja pobre hpta como te llamas v perra ?

    Comentario por Anónimo — octubre 18, 2013 @ 2:03 pm

  15. me llamo Benito Camelo y lo que sea suciaa

    Comentario por Anónimo — octubre 18, 2013 @ 2:15 pm

  16. UUYYY aleme pri bn o q
    yo soy Pedrito Caballo (Y)

    Comentario por Anónimo — octubre 18, 2013 @ 2:16 pm

  17. jajajaja sapo hptaaa
    va a chupar o que?

    Comentario por Anónimo — octubre 18, 2013 @ 2:17 pm

  18. hagale hpta

    Comentario por Anónimo — octubre 18, 2013 @ 2:23 pm

  19. breve papi ya le saque mi berga chupemela ps

    Comentario por Anónimo — octubre 18, 2013 @ 2:24 pm

  20. chupando chupando jaja

    Comentario por Anónimo — octubre 18, 2013 @ 3:14 pm

  21. donde quiere que se la heche??

    Comentario por Anónimo — octubre 18, 2013 @ 3:31 pm

  22. jajaja que cago de risa con la pelea de esos dos, que malotes!

    Comentario por Anónimo — noviembre 16, 2013 @ 4:38 am

  23. pierden la cabeza por tonterias, peor que animales

    Comentario por Anónimo — noviembre 16, 2013 @ 4:39 am

  24. Muy bueno su artículo me fue de gran utilidad.

    Medellín, Colombia

    Comentario por Anónimo — enero 18, 2016 @ 12:54 pm

  25. Conque instrucción SQL identifico las tablas que tienen definido UNIQUE INDICE
    Medellín, Colombia

    Comentario por Anónimo — enero 18, 2016 @ 12:55 pm

  26. Cual es la vista que guarda los campos UNIQUE INDICE

    Comentario por Anónimo — enero 18, 2016 @ 12:56 pm


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: