Come posso sapere PERCHÉ un inserimento su una determinata tabella è lento?


29

So che un INSERT su una tabella SQL può essere lento per qualsiasi numero di motivi:

  • Esistenza di INSERTI GRILLETTI sul tavolo
  • Molti vincoli forzati che devono essere controllati (di solito chiavi esterne)
  • La pagina si divide nell'indice cluster quando una riga viene inserita al centro della tabella
  • Aggiornamento di tutti gli indici non cluster correlati
  • Blocco da altre attività sul tavolo
  • Tempo di risposta in scrittura IO scadente
  • ... qualcosa che mi mancava?

Come posso sapere qual è il responsabile nel mio caso specifico? Come posso misurare l'impatto delle suddivisioni di pagina rispetto agli aggiornamenti dell'indice non cluster rispetto a tutto il resto?

Ho un proc memorizzato che inserisce circa 10.000 righe alla volta (da una tabella temporanea), che richiede circa 90 secondi per 10k righe. È inaccettabilmente lento, poiché provoca il timeout di altri spid.

Ho esaminato il piano di esecuzione e vedo l'attività INSERISCI INDICE CLUSTERATO e tutti i RICERCHE INDICE delle ricerche FK, ma non mi viene ancora detto con certezza perché ci vuole così tanto tempo. Nessun trigger, ma la tabella ha una manciata di FKeys (che sembrano essere correttamente indicizzati).

Questo è un database SQL 2000.


Autoexpand è abilitato sui tuoi file di dati? Ciò può causare problemi di prestazioni con la configurazione predefinita.
Larry Coleman,

Stiamo parlando dell'utilizzo di un profiler? msdn.microsoft.com/en-us/library/ms187929.aspx
Incognito

@Larry: i file di dati hanno un notevole spazio libero, quindi non credo che la crescita dei file di dati sia un problema. Buono però da aggiungere all'elenco "cose ​​da controllare".
BradC,

@ user210: La profilatura del completamento dell'istruzione mi mostra che ci sono voluti 90 secondi, non mi dice PERCHÉ. A meno che non ci siano altri eventi che ritieni possano essere più significativi.
BradC,

Risposte:


10

Alcune cose che puoi guardare ...

Riduci la dimensione del batch da 10000 a qualcosa di più piccolo, come 2000 o 1000 (non hai detto quanto è grande la dimensione della riga).

Prova ad attivare IO Statistiche per vedere quanto IO sta eseguendo le ricerche FK.

Qual è l'attesa causata da quando si verifica l'inserimento (master.dbo.sysprocesses)?

Cominciamo da qui e vediamo dove andiamo.


2
Ridurre la dimensione del batch aiuta (1000 record impiegano ~ 25 secondi). È probabile che sia la nostra attuale "soluzione alternativa". Vedrò se posso determinare IO Statistics e attese (il lavoro viene eseguito su richiesta dal client quando hanno un file da elaborare, quindi non posso sempre prevedere quando verrà effettivamente eseguito il lavoro).
BradC,

7

Brad,

È necessario esaminare le statistiche di attesa per la query. Con SQL2000 è possibile utilizzare la sintassi DBCC SQLPERF ("waitstats") per ottenere tali dettagli.


6

Posso dire cosa sto cercando durante l'analisi delle prestazioni di una query. Forse aiuta.

  • analizzare il piano di esecuzione delle query e verificare scansioni dell'indice, scansioni delle tabelle, utilizzo delle funzioni convert_implicit per tipi di dati sql, parallelismo.
  • eseguire la query con SET STATISTICS IO ON e SET STATISTICS TIME ON per visualizzare il tempo di esecuzione e leggere / scrivere io per ciascun inserto.
  • controlla il tempo di attesa da sysprocesses per lo spid di sessione.
  • esegui profiler e seleziona modello standard. selezionare quanto segue: Statistiche sulle prestazioni (se ripetute, il piano viene compilato più volte - non va bene), RPC: completato, SQL: compilato in batch e SQL: batchstarting. Aggiungi a loro i conteggi delle colonne per vedere esattamente il numero di righe nel batch. Filtra i risultati per vedere solo la tua query.
  • infine raccogliere il contatore delle aspettative di durata della pagina da perfmon di Windows e se è inferiore a 300 (5 min), l'SQL ha memoria insufficiente. Raccogli anche contatori di dischi: lunghezza della coda del disco , Tempo del disco (unità dei file di dati), Tempo del disco (unità dei file di registro) per vedere se c'è pressione sui dischi.

5

Prova a usare:

SET STATISTICS IO ON

e

SET STATISTICS PROFILE ON

STATISTICA IO

Può essere utile per dirti quali tabelle sta eseguendo la maggior quantità di scansioni di tabelle, letture logiche e letture fisiche (io uso questi tre per concentrarmi su quale parte del piano di query ha bisogno della maggior regolazione)

PROFILO STATISTICO

Restituirà principalmente il piano di query in un formato tabulare, quindi puoi guardare le colonne IO e CPU per ciò che costa la maggior parte della query (è la scansione della tabella sulla tabella temporanea rispetto al tipo che inserisce nel tuo chiave cluster, ecc ...)

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.