Perché lo stato "DbccFilesCompact" è "Sospeso"?


11

Sto eseguendo il file SHRINK su un file di dati 600G.

Attualmente, lo stato viene segnalato come "sospeso" e sys.dm_exec_requests.percent_completeper i DbccFilesCompactcomandi indica che è in esecuzione (ma molto lentamente)

C'è un modo per verificare perché è stato sospeso e come renderlo più fluido?


Cordiali saluti - Query SQL per il controllo dello stato

select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
       , R.cpu_time, R.total_elapsed_time, R.percent_complete
from   sys.dm_exec_requests R
       cross apply sys.dm_exec_sql_text(R.sql_handle) T
order by Command

Risposte:


10

No, non puoi controllare perché sta funzionando lentamente, ma posso darti alcuni suggerimenti:

1) In SQL 2005, la gestione degli indici non cluster è cambiata dal motore di archiviazione (il mio team) al processore di query. Ciò ha molti effetti collaterali, uno dei quali è la velocità con cui le pagine di dati dell'heap possono essere spostate con una riduzione. Tutti i record di indice non cluster contengono un backlink al record di dati che stanno indicizzando: nel caso di un heap, si tratta di un collegamento fisico a un numero di record in una pagina di dati specifica. Quando una pagina di dati heap viene spostata per compattazione, tutti i record dell'indice non cluster che rimandano ai record in quella pagina devono essere aggiornati con la nuova posizione della pagina. Nel 2000 ciò è stato fatto in modo molto efficiente dal motore di archiviazione stesso. A partire dal 2005, ciò deve essere fatto chiamando il processore di query per aggiornare i record dell'indice non cluster. Questo a volte è fino a 100 volte più lento rispetto al 2000.

2) I valori LOB fuori riga (tipi di dati LOB effettivi o dati di overflow di riga) non contengono un backlink ai dati o al record dell'indice di cui fanno parte. Quando una pagina di record LOB viene spostata, l'intera tabella o indice di cui fanno parte deve essere scansionata per capire quale record di dati / indice punta a loro, in modo che possano essere aggiornati con la nuova posizione. Anche questo è molto, molto lento.

3) Potrebbe esserci un altro processo che utilizza il database che sta causando il blocco della riduzione in attesa dei blocchi necessari per spostare le pagine.

4) È possibile che sia abilitato l'isolamento dello snapshot e la riduzione non può spostare le pagine con collegamenti dell'archivio versione fino al completamento delle transazioni che richiedono quelle versioni precedenti.

5) Il sottosistema I / O potrebbe essere sottodimensionato. Una lunghezza della coda del disco superiore a singole cifre basse indica il sottosistema I / O nel collo di bottiglia.

Uno o tutti questi potrebbero contribuire a rallentare i tempi di riduzione.

In generale, tuttavia, non si desidera eseguire la riduzione. Vedi questo post del blog per i dettagli: Perché non dovresti ridurre i tuoi file di dati .

Spero che sia di aiuto!


1
@Paul Randal: apprezzo il tuo commento e il link al perché il restringimento non dovrebbe essere eseguito se non necessario. Proverò la raccomandazione (spostando i file in diversi filegroup) e vedrò come andrà a finire.
dance2die,

8

Puoi eseguire questo script per verificare la percentuale completata!

SELECT 
    percent_complete, 
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
    --,*
FROM 
    sys.dm_exec_requests
WHERE
    command = 'DbccFilesCompact'

2

Sto restringendo un database in SQL Server 2008 SP1 e un modo in cui posso dire che l'avanzamento del comando Riduci è eseguendo sp_lock spid e per la maggior parte vedo che mette un blocco sul file 1 quindi quando ha posto un bloccare l'ID file 2, e così via e in questo modo posso dire quando sta funzionando sull'ultimo ID file e questa è la mia indicazione che è quasi completa.

Grazie,

Alex Aguilar


Quanto è grande il tuo Db?
John Zabroski,

0

Ho scoperto qual era il problema (nel mio caso) e offro qui la soluzione che ho usato.

Non avevo nulla usando il database e master era il database predefinito nella mia sessione, ho verificato che usando sp_who2. Quindi ho cliccato con il tasto destro sul database, ho selezionato "task" e poi "riduci" e su "ok" la finestra di dialogo. Rivolgendosi nuovamente a sp_who2, lo stato viene "sospeso" di alcuni minuti e successivamente interrotto perché "non è possibile ottenere un blocco esclusivo". Indovina te stesso, ma sono sicuro che il dialogo stesso sia quello che lo provoca.

Quindi ho deciso di passare dalla riga di comando usando:

DBCC SHRINKDATABASE (myDataBase)

(La strega è documentata dappertutto), poi la contrazione ha richiesto solo pochi secondi.


1
DBCC SHRINKDATABASEdovrebbe essere evitato perché ridurrà tutti i file per il database - qualsiasi file di dati e file di registro.
Zac Faragher,

Concordato. Lo usiamo solo in ambienti di sviluppo. Comodo per risparmiare spazio su disco in AWS dove viene misurato il disco.
John Zabroski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.