2016-12-23 7 views
0

Ich habe Abfragen wie unten, die ich mehr als 50.000 habe. Wenn ich diese Abfragen auf einmal starte, dauert es sehr lange.SQL Server: Ausführen Löschen einer großen Anzahl von Abfragen

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId=1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01' 

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' 

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId = 1 AND EmployeeId = 4 AND Entry_Date = '2016-12-01' 

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 AND EmployeeId = 4 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' 

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId = 1 AND EmployeeId = 6 AND Entry_Date = '2016-12-01' 

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 AND EmployeeId = 6 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' 

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId = 1 AND EmployeeId = 7 AND Entry_Date = '2016-12-01' 

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 AND EmployeeId = 7 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' 

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId = 1 AND EmployeeId = 14 AND Entry_Date = '2016-12-01' 

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 AND EmployeeId = 14 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' 

ich nicht viel Hände auf SQL Server haben, können Sie mich leiten, wie dies eine andere Art und Weise in etwas zu tun, so dass die Leistung erhöht.

Antwort

1

Wie pro Ihre Beispielabfragen, wenn man bedenkt CompanyId und Entry_Date gleiche gilt für die alle EmployeeId's

DELETE FROM [dbo].[WrongEntry] 
WHERE CompanyId = 1 
     AND EmployeeId in (3 ,4 , 6, 7, 14) 
     AND Entry_Date = '2016-12-01' 

Für die oben Delete, könnte das unter nicht gruppierte Index Erstellen der delete

CREATE NONCLUSTERED INDEX IX_WrongEntry 
    ON WrongEntry (CompanyId,EmployeeId,Entry_Date); 

beschleunigen Wie bei Ihren Beispielabfragen unter Berücksichtigung von CompanyId, Entry_Method und Entry_Date gleiche für alle EmployeeId's

DELETE FROM [dbo].[Entry] 
WHERE CompanyId = 1 
     AND EmployeeId in (3 ,4 , 6, 7, 14) 
     AND Entry_Date = '2016-12-01' 
     AND Entry_Method = 'I' 

Für die oben Delete, die unter nicht gruppierte Index erstellen konnte die delete

CREATE NONCLUSTERED INDEX IX_Entry 
    ON Entry (CompanyId,EmployeeId,Entry_Date,Entry_Method); 

beschleunigen Wenn Sie verschiedene Termine haben kann für jeden Mitarbeiter dann die Werte hinzufügen Temp-Tabelle und beizutreten, um die Datensätze wie Gordans Antwort zu löschen

+0

Ich bekomme alle diese Abfragen von meinem mvc-Anwendungscode, so dass es keinen Bereich gibt, diese Abfragen zu ändern. – Anup

+0

@Anup - Ich weiß nicht über 'mvc', aber wenn Sie verbessern wollen, dann müssen Sie es ändern. Übrigens, haben Sie einen Index für beide Tabellen? –

+0

Ich habe einen Index für die Entry-Tabelle am Entry_Date erstellt. Wo sonst sollte ich Index erstellen. Ich habe keine Kenntnis des Index, also bitte leiten Sie mich auf welche Art von Index & auf welchen Spalten. – Anup

0

Die Löschungen sind sehr spezifisch, ich würde in einen Index erstellen, um diese Funktion zu beschleunigen.

Hier ist eine kostenlose Ressource von einem gut bekannten SQL Resource Guru, die Ihnen helfen kann, fehlende Indizes zu identifizieren und welche Sie implementieren sollten.

Haben Sie zusätzlich die Partitionierung der Tabelle abhängig von der Version Ihres SQL Servers untersucht? Partitionierung basierend auf dem Datumsstempel kann die Leistung Ihrer SQL-Datenbank drastisch erhöhen, ist jedoch eine größere Architekturänderung.

SP_BlitzIndex

Ozar on speeding up deletes

0

Doing 50.000 löscht wird ein wenig Zeit in Anspruch nehmen würde. Eine Sache, die sie schneller machen könnte, ist ein Index auf (CompanyId, EmployeeId, Entry_Date) in beiden Tabellen.

Eine zweite Sache wäre es, die Werte für diese Spalten in eine temporäre Tabelle zu setzen und eine join für das Löschen verwenden:

delete we 
    from wrong_entry we join 
     #todelete d 
     on we.companyid = d.companyid and 
      we.employeeid = d.employeeid and 
      we.entry_date = d.entry_date; 

Sie noch die Indizes für diese schnell sein wollen. Darüber hinaus werden jedoch alle Löschvorgänge in dieselbe Transaktion eingefügt, wodurch der Transaktionsaufwand reduziert wird.

Eigentlich könnten Sie Ihre Löschungen in eine Transaktion umbrechen, und das könnte Ihren Code beschleunigen.

1

Begrenzen Sie die Anzahl der Datensätze in einem einzigen gelöscht werden Transaktion:

DECLARE @RowCount INT = 1 

WHILE @RowCount > 0 BEGIN 

DELETE TOP(500) FROM [dbo].[WrongEntry] 
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14) 
    AND Entry_Date = '2016-12-01' 

SELECT @RowCount = @@ROWCOUNT 

END 

SELECT @RowCount = 1 

WHILE @RowCount > 0 BEGIN 

DELETE TOP(500) FROM [dbo].[Entry] 
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14) 
    AND Entry_Date = '2016-12-01' 
    AND Entry_Method = 'I' 

SELECT @RowCount = @@ROWCOUNT 

END 
Verwandte Themen