2013-08-14 12 views
17

Sto eseguendo un DTS per preformare le attività nel mio database, in cui inizialmente devo disabilitare gli indici nel database e riattivarli quando il DTS finire il suo lavoro.Disabilitare e riattivare tutti gli indici in un database di SQL Server

C'è un modo per disabilitare tutti gli indici nell'intero database e successivamente riattivarli tutti?

so come disabilitare/abilitare uno per uno, qualcuno mi può aiutare con il modo per abilitare/disabilitare tutto in una volta come un passo in DTS.

risposta

28

Ecco uno script che emetterà le istruzioni ALTER per tutti gli indici non cluster nel database. È possibile modificare facilmente questo per emettere RICOSTRUIRE script e gli script per gli indici cluster

select 'ALTER INDEX ' + I.name + ' ON ' + T.name + ' DISABLE' 
from sys.indexes I 
inner join sys.tables T on I.object_id = T.object_id 
where I.type_desc = 'NONCLUSTERED' 
and I.name is not null 
+2

Probabilmente intendevi REBUILD piuttosto che ENABLE? – bogert

3

Dovrai eseguire uno script che seleziona il metadato per la tabella e l'indice. Poi si può fare una:

ALTER INDEX indexname ON tablename DISABLE; 

Successivamente è possibile eseguire uno script simile per ricostruire:

ALTER INDEX indexname ON tablename REBUILD; 

si possono fare queste uno alla volta, o raccoglierli in un NVARCHAR variabile (MAX) e eseguirli come un singolo batch. Si può vedere il codice di esempio a questa domanda in precedenza:

Disable all non-clustered indexes

2

indici Disabilitare è una buona idea quando si tratta di caricare grandi quantità di dati, ma ... il grosso problema è di tipo cluster indici. Se disabiliti un indice cluster, hai disabilitato l'intera tabella.

Diverse opzioni si suggeriscono e nessuna è semplice.

1) Passare attraverso le viste di sistema (sys.indexes), estrarre la tabella e il nome dell'indice, generare ed eseguire SQL dinamico per disabilitare l'indice. Avere una routine di "annullamento" per riattivarli. (Stai attento, si trattava di un indice univoco o di un vincolo univoco?) Questo, purtroppo, funziona solo se non si utilizzano indici cluster. Buona fortuna.

2) Come per 1, ma salta qualsiasi indice cluster. Quando carichi i dati, assicurati che venga caricato in ordine sequenziale (indice cluster), altrimenti avrai tempi di caricamento scadenti e tabelle frammentate. (Se i provider di dati sono come i miei, buona fortuna anche con quello.)

3) Creare tabelle nel database contenente le definizioni degli indici sulle tabelle di "caricamento". Costruisci una routine che scorre su di loro e elimina tutti gli indici (ultimi indici raggruppati). Questo sarà veloce se si tronchiano prima i tavoli. Carica i tuoi dati, quindi esegui il ciclo e ricrea gli indici da zero (prima il cluster). Utilizza il partizionamento delle tabelle per rendere meno orribile il resto del sistema (ad esempio, fai tutto quanto sopra sulle tabelle di "caricamento", quindi usa il cambio di partizione per spostare i dati caricati nelle tue tabelle "live"). Mi ci è voluto poco tempo per costruire un sistema del genere, ma può funzionare e funzionerà.

+0

Grazie! Stavo ottenendo errori di coerenza DBCC CHECKDB dopo aver riattivato gli indici, prima di rendermi conto che il cluster doveva essere il primo. – mrP

+0

puoi anche abilitare gli indici utilizzando SQL Server Management Studio, consulta qui: http://www.sqlserverlogexplorer.com/enable-and-disable-indexes/ –

5

Al fine di consentire un indice, bisogna ricostruirla. Questo script ricostruirà tutti gli indici disabilitati.

DECLARE @my_sql2 NVARCHAR(200); 

DECLARE cur_rebuild CURSOR FOR 
    SELECT 'ALTER INDEX ' + i.name + ' ON ' + t.name + ' REBUILD' FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id WHERE i.is_disabled = 1 ORDER BY t.name, i.name; 
OPEN cur_rebuild; 
FETCH NEXT FROM cur_rebuild INTO @my_sql2; 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     EXECUTE sp_executesql @my_sql2; 
     FETCH NEXT FROM cur_rebuild INTO @my_sql2; 
    END; 
CLOSE cur_rebuild; 
DEALLOCATE cur_rebuild; 
GO 
19

Questo funziona per SQL Server 2008 e versioni più recenti.Permette diversi schemi e anche nomi che hanno spazi, trattini e altri caratteri speciali che devono essere citati. What is the use of the square brackets [] in sql statements?

Questi script visualizzeranno il codice nella scheda dei risultati. È necessario copiare/incollare nella scheda query ed eseguirli.

copione Disabilita

SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' DISABLE' 
FROM sys.indexes I 
INNER JOIN sys.tables T ON I.object_id = T.object_id 
WHERE I.type_desc = 'NONCLUSTERED' 
AND I.name IS NOT NULL 
AND I.is_disabled = 0 

Abilita copione (Ricostruire)

SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' REBUILD' 
FROM sys.indexes I 
INNER JOIN sys.tables T ON I.object_id = T.object_id 
WHERE I.type_desc = 'NONCLUSTERED' 
AND I.name IS NOT NULL 
AND I.is_disabled = 1 

questo si basa su un'altra risposta qui.

0

Prima di disattivare indice non dovremmo per ottenere qui di seguito:

  1. La disattivazione di un indice cluster non impedisce l'accesso degli utenti all'indice.
  2. La disabilitazione degli indici cluster sulla tabella non elimina i dati ma impedisce l'accesso dell'utente ai dati della tabella sottostante. '
  3. La disabilitazione di un indice non cluster o cluster in una vista elimina fisicamente i dati dell'indice.
  4. L'attivazione dell'indice indica che è necessario ricostruirlo. Non esiste una parola chiave denominata come abilitazione.

---- Disabilitare tutti gli indici ALTER INDEX ALL ON [nome_tabella] disabilitare GO ---- Abilita tutto Indice ALTER INDEX ALL ON [nome_tabella] RICOSTRUZIONE GO

Per dettagli si può riferirsi "How To Disable - Enable Indexes In SQL Server"

9

possiamo usare sotto sacca di disabilitare gli indici

ALTER INDEX ALL ON [TableName] 
DISABLE; 

Inserisci la tua tabella di massa nella tabella e poi esegui lo script di sotto.

ALTER INDEX ALL ON [TableName] 
REBUILD; 
+1

La domanda diceva: * "Disattiva e riattiva tutti gli indici in un database di SQL Server" *. Non per una singola tabella, per l'intero database. –

+0

OOps ... È il mio male. –

+0

Questo dovrebbe essere: "ALTER INDICE ALL ON StorageItem REBUILD;" non "ALTER INDEX ALL ON StorageItem ENABLE;" – Rtype

Problemi correlati