2011-11-15 15 views
6

Ho una tabella molto grande (circa 13 milioni di righe) e voglio impostare la chiave primaria per le tabelle. Il problema è che, date le grandi dimensioni del database, il mio computer si blocca quando provo a impostare la chiave primaria per una tabella.Imposta chiave primaria nel database molto grande

Suppongo che SQL Server tenti di impostare questa chiave in ogni riga trovata, quindi il consumo di memoria raggiunge il limite del mio computer (6 GB di memoria). C'è un modo efficace e alternativo per impostare la chiave primaria senza questi problemi?

+2

Qual è il tipo di colonna: numerico o stringa? –

+1

Stai aggiungendo una nuova colonna come chiave primaria o stai utilizzando una colonna esistente come PK? Se stai usando un esistente, come sai che è unico? – Maess

+0

Suppongo che stiate aggiungendo una sorta di chiave di numerazione automatica. Ti interessa l'ordine delle righe? Ad esempio, a quali file viene assegnato il numero o non importa? – Tony

risposta

6

Qui ci sono un paio di opzioni che potrebbe funzionare:

  1. Creare una nuova tabella con le stesse colonne e una chiave primaria, e selezionare in esso dalla tabella.
  2. creare uno script cambiamento e e disattivare il timeout di esecuzione in SSMS

Ecco uno script cambiamento per puntare nella giusta direzione:

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

+1: opterei per l'opzione 1 se lo spazio su disco non è un problema, che non dovrebbe essere con una tabella così piccola;) – Tony

+0

+1 per l'opzione 1. In ogni caso, la tabella dovrà essere ricreata. L'opzione 1 può essere registrata minimamente (in attesa che vengano soddisfatti i requisiti). – brian

0

Un'altra opzione è quella di creare una nuova tabella con la chiave primaria appropriata. Script tutte le relazioni oltre alla struttura di base della tabella sulla tabella iniziale. Imposta la base dati in modalità utente singolo (in modo che nessuno possa modificare i record mentre sei in procinto di trasferirli) dopo esserti assicurato di avere un backup corrente.

Quindi inserire record dalla tabella precedente in bathes di dire 10000 alla volta. Ci vorrà più tempo di un inserto basato su set, ma molto meno probabilità di timeout. Potrebbe essere necessario sperimentare per trovare la dimensione del lotto ottimale. Dopo aver terminato, rilascia la vecchia tabella, rinomina la nuova tabella e imposta nuovamente le relazioni pk/fk. Quindi uscire dalla modalità utente singolo.

Questa è un'attività che deve essere eseguita solo in produzione durante le ore non occupate e come attività di manutenzione del database, a nessun altro deve essere consentito di accedere al database mentre si verifica.

Nota è possibile che non si disponga di informazioni univoche sulla chiave naturale del tavolo. In questo caso si potrebbe avere un problema se lo si utilizza come pk e potrebbe essere necessario spostare alcuni record in una tabella di eccezioni da correggere. Anche se stai usando una chiave surogata come nuovo PK, ti consiglio caldamente un indice univoco sulla chiave naturale del tavolo, se possibile.

0

Uno dei motivi per cui ho visto questo è la quantità di memoria che SQL Server può allocare è molto più grande di ciò che la macchina è disposta a dare e quindi si finisce per bloccarlo. Provare a cambiare la memoria allocata su SQL Server su una memoria di memoria più piccola e vedere se questa è la causa. SQL Server dovrebbe essere in grado di gestire molti record, ma se tenta di caricarli tutti in memoria contemporaneamente per eseguire il lavoro che potrebbe causare il problema.

Problemi correlati