performance - tipos - Clúster frente a clave principal no localizada
que es una clave principal de campo simple (4)
Agrupar la clave principal lo almacena con las filas; esto significa que ocupa menos espacio (ya que no hay bloques de índice separados). Sin embargo, su principal beneficio es que los escaneos en general pueden acceder a las filas que están en el mismo bloque, lo que reduce las operaciones de E / S, lo que se vuelve bastante importante cuando tiene un gran conjunto de datos (no 50k ints).
Creo que 50k ints es un punto de referencia bastante artificial y no uno que te importe en el mundo real.
begin transaction;
create table person_id(person_id integer primary key);
insert into person_id values(1);
... snip ...
insert into person_id values(50000);
commit;
Este código toma aproximadamente 0.9 segundos en mi máquina y crea un archivo db ocupando 392K. Estos números se convierten en 1,4 segundos y 864K si cambio la segunda línea a
create table person_id(person_id integer nonclustered primary key);
¿Por qué es este el caso?
Aleatoricé las instrucciones de inserción y realicé la consulta con valores de uno a medio millón. Curiosamente, tanto los archivos db agrupados como los no agrupados ahora ocupan la cantidad exacta de espacio (hasta el byte). Sin embargo, las inserciones en el db agrupado son aún más rápidas.
Para mí esto es contrario a la intuición. Cuando le digo a la base de datos que agrupa estos valores, le digo a la base de datos ... estos valores estarán mejor en este orden cuando regrese para obtenerlos. Cuando no tengo la especificación, básicamente le estoy diciendo a la DB: mire estos valores y organícelos de la manera que quiera, lo que le haga la vida más fácil.
Teóricamente, esta libertad adicional nunca debería ralentizar las consultas. Tal vez no los acelere todo el tiempo, pero nunca los desacelere. ¿Pensamientos?
Una gran respuesta a esta pregunta está disponible en DBA StackExchange: https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered/7744#7744
[Solo como una idea]
Tal vez cuando especifiques explícitamente tomar columnas enteras como una clave agrupada, hace exactamente eso. Pero cuando le dices que no use tu columna entera, aún crea un índice detrás de las escenas pero elige un tipo de datos diferente para hacer eso, supongo, el doble de grande. Entonces, cada una de esas entradas tiene que hacer referencia a los registros en la tabla y aquí va, el tamaño está explotando.