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?
Esiste un guru delle prestazioni del database SQL di Azure che può aiutarmi con questo? – RJBreneman
Non pubblicare il problema eliminare – Paparazzi