Ich arbeite derzeit an einem Projekt, bei dem Massenimportdaten aus Flatfiles (CSV) ungefähr 18 verschiedene Dateien enthalten, die jeweils über eine gespeicherte Prozedur mit einer bestimmten Tabelle verknüpft sind.
Ich habe die Schritte im Handbuch zur Leistung beim Laden von Daten ausgeführt .
Die Datenbank befindet sich im BulkLogged
Wiederherstellungsmodus, um die Protokollierung zu minimieren. Wenn Sie die unten gespeicherte Prozedur in einer Datei mit 600000 Zeilen ausführen, wird eine Fehlermeldung angezeigt
Meldung 9002, Ebene 17, Status 4, Prozedur SP_Import__DeclarationClearanceHistory_FromCSV, Zeile 34
Das Transaktionsprotokoll für die Datenbank ist voll. Informationen dazu, warum Speicherplatz im Protokoll nicht wiederverwendet werden kann, finden Sie in der Spalte log_reuse_wait_desc in sys.databases
(Zu Testzwecken mache ich eine vollständige Sicherung, bevor ich mit dem Import beginne).
Beim Betrachten log_reuse_wait_desc
sehe ich folgendes:
log_reuse_wait_desc
PRÜFPUNKT . Alle anderen Importe werden erfolgreich importiert.
Jeder Beitrag zur Lösung dieses Problems wäre zu begrüßen.
PROCEDURE [dbo].[SP_Import_DeclarationClearanceHistory_FromCSV]
@FilePath [nvarchar](1000)
AS
BEGIN
-- Creating a Temproary Table for importing the data from csv file.
DBCC TRACEON(610)
CREATE TABLE #DeclarationClearanceHistory
(
[ItemID] [int] IDENTITY(1, 1) NOT NULL ,
[CMSDeclarationID] [bigint] NOT NULL ,
[StatusCode] [nvarchar](10) NOT NULL ,
[SubStatus] [nvarchar](10) NULL ,
[DepartmentCode] [nvarchar](10) NULL ,
[StartDate] [datetime] NULL ,
[EndDate] [datetime] NULL ,
PRIMARY KEY CLUSTERED ( [ItemID] ASC )
WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON [PRIMARY]
-- Inserting all the from csv to temproary table using BULK INSERT
EXEC ('BULK INSERT #DeclarationClearanceHistory
FROM ''' + @FilePath + '''
WITH ( FIELDTERMINATOR = ''<,>'', ROWTERMINATOR =''\n'', FIRSTROW = 2, KEEPIDENTITY, CODEPAGE = ''ACP'', ORDER = ''ITEMID ASC'' );') ;
-- By using MERGE statement, inserting the record if not present and updating if exist.
MERGE dbo.DeclarationClearanceHistory AS TargetTable -- Inserting or Updating the table.
USING #DeclarationClearanceHistory AS SourceTable -- Records from the temproary table (records from csv file).
ON ( TargetTable.ItemID = SourceTable.ItemID ) -- Defining condition to decide which records are alredy present
WHEN NOT MATCHED BY TARGET
THEN INSERT (
ItemID ,
CMSDeclarationID ,
StatusCode ,
SubStatus ,
DepartmentCode ,
StartDate ,
EndDate
)
VALUES ( SourceTable.ItemID ,
SourceTable.CMSDeclarationID ,
SourceTable.StatusCode ,
SourceTable.SubStatus ,
SourceTable.DepartmentCode ,
SourceTable.StartDate ,
SourceTable.EndDate
)
WHEN MATCHED -- If matched then UPDATE
THEN UPDATE
SET TargetTable.ItemID = SourceTable.ItemID ,
TargetTable.CMSDeclarationID = SourceTable.CMSDeclarationID ,
TargetTable.StatusCode = SourceTable.StatusCode ,
TargetTable.SubStatus = SourceTable.SubStatus ,
TargetTable.DepartmentCode = SourceTable.DepartmentCode ,
TargetTable.StartDate = SourceTable.StartDate ,
TargetTable.EndDate = SourceTable.EndDate ;
DBCC TRACEOFF(610)
END
Wenn Sie
CHECKPOINT
als log_reuse_wait_desc für diese Datenbank sehen, liegt dies daran, dass seit dem letzten Abschneiden des Protokolls kein Prüfpunkt aufgetreten ist.Sie können dieses Problem beheben, indem Sie einen
CHECKPOINT
Befehl manuell starten .Unterstützende Referenzen :
Faktoren, die die Prüfpunkte für das Abschneiden von Protokollen verzögern können,
und der aktive Teil des Protokolls
quelle