¿Es 'Evitar crear un índice agrupado basado en una clave incremental' un mito de los días de SQL Server 2000?


22

Nuestras bases de datos consisten en muchas tablas, la mayoría de ellas utilizando una clave sustituta entera como clave principal. Aproximadamente la mitad de estas claves primarias están en columnas de identidad.

El desarrollo de la base de datos comenzó en los días de SQL Server 6.0.

Una de las reglas que se siguieron desde el principio fue: Evite crear un índice agrupado basado en una clave incremental , como se encuentra en estos Consejos para la optimización del índice .

Ahora, usando SQL Server 2005 y SQL Server 2008, tengo la fuerte impresión de que las circunstancias cambiaron. Mientras tanto, estas columnas de clave principal son los primeros candidatos perfectos para el índice agrupado de la tabla.

Respuestas:


34

El mito se remonta a antes de SQL Server 6.5, que agregaba bloqueo de nivel de fila . E insinuado aquí por Kalen Delaney .

Tenía que ver con los "puntos críticos" del uso de la página de datos y el hecho de que una página completa de 2k (SQL Server 7 y superior usa páginas de 8k) estaba bloqueada, en lugar de una fila insertada Editar, febrero de 2012

Artículo autorizado encontrado por Kimberly L. Tripp

"El debate del índice agrupado continúa ..."

Los puntos calientes fueron algo que intentamos evitar antes de SQL Server 7.0 debido al bloqueo de nivel de página (y aquí es donde el término zona activa se convirtió en un término negativo). De hecho, no tiene que ser un término negativo. Sin embargo, dado que el motor de almacenamiento fue rediseñado / rediseñado (en SQL Server 7.0) y ahora incluye un verdadero bloqueo de nivel de fila, esta motivación (para evitar puntos calientes) ya no existe.

Editar, mayo de 2013

El enlace en la respuesta de lucky7_2000 parece decir que los puntos de acceso pueden existir y causar problemas. Sin embargo, el artículo utiliza un índice agrupado no único en TranTime. Esto requiere que se agregue un uniquifier. Lo que significa que el índice no aumenta estrictamente monotónicamente (y es demasiado amplio). El enlace en esa respuesta no contradice esta respuesta o mis enlaces

A nivel personal, he trabajado en bases de datos donde inserté decenas de miles de filas por segundo en una tabla que tiene una columna de IDENTIDAD bigint como la PK agrupada.


23

Para resumir, en las versiones modernas de SQL Server, una clave en clúster en una columna de identidad es la opción preferida en estos días.


Corto, simple, hasta el punto, así que esto obtiene mi +1. Asegúrese de revisar el enlace a SQLSkills ya que hay una gran cantidad de buena información allí.
AndrewSQL

12
Esto suena como un comando. No hay explicación o lógica sobre por qué deberíamos ...
gbn

No solo suena como un comando, también está mal. Cualquier base de datos que tome una cantidad muy alta de inserciones / segundo tendrá problemas de zona activa si usa claves secuenciales.
Thomas Kejser

1
Dije preferido, no requerido. Para aplicaciones normales que constituyen el 98% de las bases de datos en el mundo, una clave agrupada en una columna de identidad funciona bien.
mrdenny


4

mira esta publicación:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/monotonically-increasing-clustered-index-keys-can-cause-latch-contention.aspx

crear un índice agrupado basado en una clave incremental puede crear puntos críticos que son malos para el rendimiento ...


1
+1 por dar ese enlace. Hay algunas sugerencias interesantes allí. Pero creo que el resultado sería mucho más convincente, si hubiera comparado el escenario dado con uno con crear índice no agrupado cidx_trantime en tblTransactions (TranTime) o alguna otra alternativa. Recuerde que cuando genera tantos datos debe haber formas eficientes de recuperar los datos, no puede simplemente tirar todo a un montón.
bernd_k

@bernd_k: este es un enlace de ejemplo deficiente. La tabla secundaria tiene una clave agrupada no única incorrecta que requiere un uniquifier interno
gbn

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.