2015-09-28 3 views
7

Possiedo un database Azure Sql con dimensioni di circa 9 GB. Serve un'app Web che gestisce circa 135.000 richieste all'ora. La maggior parte dei dati è transitoria, vive nel database da pochi minuti a cinque giorni e viene cancellata. Circa 10 GB si muove attraverso il database al giorno.Perché il mio database SQL di Azure elimina le prestazioni della query in modo lento?

Ho provato a eseguire una query di eliminazione su una tabella per eliminare circa 250.000 record su 350.000 record totali. Circa il 10 percento dei record ha uno o due valori nvarchar (massimo) abbastanza grandi da essere archiviati nella memoria LOB.

Durante il fine settimana, ho provato a eliminarli tutti in una volta. Ha funzionato per quattro ore prima che cancellassi la query, poi si stava ritirando per altre 8 ore - brutta mossa. Davvero non mi aspettavo che fosse così male.

Quindi ho provato un altro approccio. Questo batch veniva eseguito di notte quando l'app Web gestiva circa 100.000 richieste all'ora. Il campo ID tblJobs è un identificatore univoco che è la chiave primaria.

insert @tableIds select Id from dbo.tblJobs with(nolock) 
where (datediff(day, SchedDate, getDate()) > 60) 
    or (datediff(day, ModifiedDate, getDate()) > 3 and ToBeRemoved = 1) 

set @maintLogStr = 'uspMaintenance [tblJobs] Obsolete J records count @tableIds: ' + convert(nvarchar(12), (select count(1) from @tableIds)) 
insert dbo.admin_MaintenanceLog(LogEntry) values(@maintLogStr) 

set @maintLogId = newid() 
set @maintLogStr = 'uspMaintenance [tblJobs] Obsolete J records beginning loop...' 
insert dbo.admin_MaintenanceLog(Id, LogEntry) values(@maintLogId, @maintLogStr) 

while exists(select * from @tableIds) 
begin 
    delete @tableIdsTmp 
    begin transaction 
     insert @tableIdsTmp select top 1000 id from @tableIds 
     delete p from @tableIdsTmp i join dbo.tblJobs p on i.id = p.Id 
     delete x from @tableIdsTmp t join @tableIds x on t.id = x.id 
     set @maintLogStr = 'uspMaintenance [tblJobs] Obsolete J records remaining count @tableIds: ' + convert(nvarchar(12), (select count(1) from @tableIds)) 
     update dbo.admin_MaintenanceLog set LogEntry = @maintLogStr, RecordCreated = getdate() where Id = @maintLogId 
    commit transaction 
    if @dowaits = 1 WAITFOR DELAY '00:00:01.000' 
end 

SchedDate, ModifiedDate e ToBeRemoved non vengono indicizzati in modo da raccogliere le Ids in @tableIds sono voluti circa 3 minuti - non male.

Quindi, dalle voci di registro, sono occorsi 1 ora e 55 minuti per eliminare 11.000 record da tblJobs a quando è scaduto il lavoro richiamato da una macchina remota.

Perché ci vuole così tanto tempo? Cosa posso fare per accelerarlo?

+0

Esiste un guru delle prestazioni del database SQL di Azure che può aiutarmi con questo? – RJBreneman

+0

Non pubblicare il problema eliminare – Paparazzi

risposta

0

L'IT dipende dal DTU (livello di prestazioni) del database. Controllare il consumo di risorse del database durante il tempo di esecuzione della query per verificare se si stanno raggiungendo limiti di risorse. Inoltre, in futuro, suddividere la query in più transazioni durante l'emissione dell'eliminazione. Questo aiuta nella situazione in cui la transazione deve effettuare il rollback (ad esempio gli aggiornamenti a SQL DB) o transitori della rete dal tuo terminale che si connette al db

+1

Il database è V12, livello S2. Il grafico delle percentuali DTU indica circa il 95% durante questo periodo di tempo, senza tempi prolungati al 100% - Ho un avviso su> = 100% per 5 minuti che non si è mai attivato. Non sono sicuro di cosa intendi suddividendo l'eliminazione in più transazioni. Sta emettendo 1000 alla volta. – RJBreneman

0

Come soluzione veloce/hack, in SSMS ho fatto clic con il tasto destro sul database e poi scelto Genera script e nelle opzioni avanzate, ho scelto di creare script DROP ONLY. Da lì metto quello in una nuova finestra di query e ho fatto una ricerca e sostituzione per cambiare DROP TABLE a DELETE FROM. Aveva ancora alcuni problemi nel metterli nell'ordine sbagliato per le dipendenze da chiavi esterne, ma dopo alcune modifiche, sono stato in grado di eliminare rapidamente tutti i miei tavoli.