2008-11-01 20 views

Respuesta

46

En general, int.

bigint si crees que tendrás más filas que átomos en el universo.

uniqueidentifier es útil si necesita a nivel mundial claves únicas (teclas que están garantizados para ser únicos en todas las tablas en el esquema, tal vez incluso único universal (no me acuerdo))

Los otros dos me no usaría no son tipos integrales (tienen fracciones, que simplemente no tienen mucho sentido como claves)

+4

Si elige un identificador único, considere convertirlo en una clave primaria NO CULPABLE, de lo contrario, las inserciones pueden tener problemas de rendimiento. – Brannon

+0

Gracias por la actualización, Brannon. –

+2

int está limitado "solo" a alrededor de 2 mil millones. Ya llegué a este límite con algunas características de registro;) – Mose

2

Una razón importante para no usar GUID para PK es su terrible índice de relleno para páginas de índice: dicho mal uso puede aumentar drásticamente los costos de rendimiento de E/S. Los GUID deben dejarse como AK y, en su lugar, generar consultas con PK derivadas de int, siempre que sea posible.

+7

Eso realmente es un poco inexacto - GUID como PK está bien - GUID ya que CLUSTERING KEY es un desastre. El PK per se no tiene ningún efecto en la organización de datos físicos; ese es el trabajo de la clave de clúster :) –

0

para procesadores de 32 bits, un int es probable que sea el tamaño más eficiente para el procesamiento.

+1

Los límites de palabras son menos relevantes que el espacio ocupado cambiando de Int a BigInt; a menos que espere un recuento de filas en miles de millones, guarde el fila bytes y gastarlos en otro lugar. El costo de E/S es varios pedidos más caros que el acceso a la memoria. – stephbu

+0

De acuerdo, solo estoy agregando otra razón para usar int. – dkretz

20

que realmente necesita para mantener dos cuestiones separadas aparte:

1) la clave primaria es una construcción lógica - uno de los candidatos clave que identifica de forma única y fiable una fila en la tabla. Esto puede ser cualquier cosa, en realidad, una INT, un GUID, una cadena, elija lo que tenga más sentido para su escenario.

2) el principal de cluster (la columna o columnas que definen el "índice clúster" en la tabla) - esto es una cosa de almacenamiento relacionada física , y aquí, un pequeño y estable, cada vez mayor tipo de datos es su mejor opción: INT o BIGINT como su opción predeterminada.

De forma predeterminada, la clave principal en una tabla de SQL Server también se utiliza como la clave de agrupamiento, pero eso no tiene por qué ser así. Personalmente, me parece que las ganancias de rendimiento masivas con el tiempo al dividir la Clave Primaria Clúster basada en GUID anterior en dos claves separadas: la clave primaria (lógica) en el GUID y la clave de agrupamiento (ordenamiento) en una IDENTIDAD INT separada (1 , 1) columna.

La fragmentación del índice se redujo a niveles mínimos y, por lo tanto, el rendimiento de la búsqueda del índice se incrementó: ¡muy recomendable!

Marc

+0

Sí, Marc estuvo totalmente de acuerdo: solo es raro que la gente común vea más allá de las herramientas de diagramación, y es tan fácil hacer clic derecho, establecer PK ... – stephbu

+0

¡Información muy útil, gracias por compartir! – Martin

1

unsigned int de cualquier tamaño que se adapte a sus necesidades particulares

+6

Excepto que el servidor SQL no tiene tipos de datos sin signo. – Joe

Cuestiones relacionadas