2011-11-15 13 views
6

Tengo una tabla muy grande (alrededor de 13 millones de filas) y quiero establecer la clave primaria para las tablas. El problema es que dado el gran tamaño de la base de datos, mi computadora falla cuando intento establecer la clave primaria para una tabla.Establecer la clave principal en una base de datos muy grande

Supongo que SQL Server intenta establecer esta clave en cada fila que encuentra, por lo que el consumo de memoria alcanza el límite de mi computadora (6 gb de memoria). ¿Hay alguna forma efectiva y alternativa para establecer la clave principal sin tener estos problemas?

+2

¿Cuál es el tipo de la columna: numérica o cadena? –

+1

¿Está agregando una nueva columna como clave principal o está utilizando una columna existente como PK? Si está utilizando un existente, ¿cómo sabe que es único? – Maess

+0

Supongo que está agregando algún tipo de clave de numeración automática. ¿Te importa el orden de las filas? es decir, a qué filas se le asigna qué número o ¿eso no importa? – Tony

Respuesta

6

Aquí hay un par de opciones que podría funcionar:

  1. crear una nueva tabla con las mismas columnas y una clave principal, y seleccione en él desde la otra mesa.
  2. crear una secuencia de cambio y y desactivar el tiempo de espera de ejecución en SSMS

Aquí hay un script cambio de apuntar en la dirección correcta:

ALTER TABLE tableName WITH NOCHECK 
ADD CONSTRAINT PK_tableName PRIMARY KEY CLUSTERED (columnName) 
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON) 
+0

+1: Optaría por la opción 1 si el espacio en disco no es un problema, que no debería ser con una tabla tan pequeña;) – Tony

+0

+1 para la opción 1. De cualquier manera, la tabla tendrá que volver a crearse. La opción 1 puede registrarse mínimamente (mientras se cumplan los requisitos). – brian

0

Otra opción es crear una nueva tabla con el clave primaria apropiada. Script de todas las relaciones además de la estructura de tabla básica en la tabla inicial. Establezca la base de datos en el modo de usuario único (para que nadie pueda cambiar los registros mientras está en proceso de transferirlos) después de asegurarse de tener una copia de seguridad actual.

Luego inserte registros de la tabla anterior en baños de, por ejemplo, 10000 a la vez. Llevará más tiempo que una inserción basada en conjunto, pero será mucho menos probable que se agote el tiempo de espera. Es posible que tenga que experimentar para encontrar el tamaño de lote óptimo. Después de que haya terminado, suelte la tabla anterior, cambie el nombre de la nueva tabla y configure cualquier relación pk/fk nuevamente. Luego salga del modo de usuario único.

Esta es una tarea que solo debe realizarse en producción durante horas no ocupadas y como una tarea de mantenimiento de la base de datos, nadie más debe tener acceso a la base de datos mientras se produce.

Nota: es posible que no tenga información exclusiva sobre la clave natural de la tabla. En este caso, podría tener un problema si está usando eso como el pk y puede necesitar mover algunos registros a una tabla de excepciones para corregirlos. Incluso si está utilizando una clave surogate como la nueva PK, le recomiendo un índice único en la clave natural de la tabla si es posible.

0

Una de las razones que he visto para esto es la cantidad de memoria que SQL Server puede asignar es mucho más grande de lo que su máquina está dispuesta a dar y así termina chocando. Intente cambiar la memoria asignada a SQL Server a una huella de memoria más pequeña y vea si esa es la causa. SQL Server debería ser capaz de manejar tantos registros, pero si intenta cargarlos todos en la memoria al mismo tiempo para hacer el trabajo que podría causar su problema.

Cuestiones relacionadas