2013-05-20 12 views
8

Sto provando ad accelerare un carico della tabella dei fatti come parte di un progetto generale di prestazioni. Il tavolo è di circa 120 milioni di righe circa 100k vengono aggiunte ogni sera. Il tavolo è piuttosto pesantemente indicizzato.Quali sono le conseguenze dell'utilizzo dell'opzione Blocco tabella con una destinazione di caricamento veloce?

Attualmente sto utilizzando una destinazione OLE DB di caricamento rapido SSIS e il caricamento delle 100.000 righe richiede circa 15 minuti. Mi è sembrato molto importante inserire 100k righe, quindi ho modificato il pacchetto in modo da scaricare i risultati in una tabella di staging, quindi ho inserito un inserto T-SQL nella tabella dei fatti da quella tabella di staging. L'inserto ora viene eseguito in meno di 1 minuto.

Ho trovato piuttosto strano che un semplice inserto T-SQL vecchio sia più veloce del caricamento rapido SSIS, quindi ho iniziato a controllare quali caselle erano state selezionate sulla destinazione OLEDB. Si scopre che Table Lock NON è stato controllato. Quando ho selezionato questa opzione, il carico di SSIS è ora inferiore a 1 minuto. Le mie domande sono:

  • Quali sono le implicazioni dell'attivazione del blocco tabella?
  • L'istruzione di inserimento T-SQL emette un blocco di tabella per impostazione predefinita ed è per questo che inizialmente era più veloce?

risposta

7

Beh, penso che la spiegazione è semplice (vedi un riferimento più dettagliato here):

Per la vostra prima domanda:

Tabella Blocco - L'impostazione predefinita è selezionata e la raccomandazione deve essere controllata a meno che la stessa tabella sia utilizzata da qualche altro processo contemporaneamente. Specifica che un blocco tabella verrà acquisito nella tabella di destinazione anziché acquisire più blocchi di livello riga , che potrebbero trasformarsi in problemi di escalation dei blocchi.

Come per l'istruzione di inserimento, considerando il numero piuttosto elevato di righe che devono essere inserite, SQL Server molto probabilmente sceglierà di effettuare un blocco di tabella.

Per confermare questo è possibile controllare che tipo di blocchi sono tenuti sul tavolo utilizzando il DMV sys.dm_tran_locks. Ecco alcuni buoni esempi su come interpretare i risultati (e anche una buona lettura sull'escalation dei blocchi): http://aboutsqlserver.com/2012/01/11/locking-in-microsoft-sql-server-part-12-lock-escalation/.

+0

Ah, quindi i blocchi a più livelli di riga spiegherebbero la lentezza. Figo, grazie. – AS2012

+0

@ AS2012: non solo questo, ma anche più blocchi occupano più memoria. Gli articoli a cui mi sono collegato sono molto pertinenti e dettagliati su questo argomento. –

Problemi correlati