Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   wie am besten viele Daten schnell in SQL Einfügen mit Delphi (https://www.delphipraxis.net/211141-wie-am-besten-viele-daten-schnell-sql-einfuegen-mit-delphi.html)

LoZe 2. Aug 2022 14:50

Datenbank: MSSQL • Version: 2018 • Zugriff über: sa

wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Hallo,

ich hab ein kleines Problem mit der ADO SQL Insert Geschwindigkeit.

Ich habe eine Datensatz der ca. 800.000 Daten beinhaltet dieser wird via Delphi aufgearbeitet und ist in einer TObjectList<TData>.

Bisher hatte ich für SQL Inserts immer eine Stored Procedure via TAdoStoredProc realisiert, aber bei dieser Datenmasse ist das zu langsam.

Wenn ein Neuer Datensatz da ist werden die besehenden Daten aus der Tabelle erst gelöscht und dann die neuen Daten befüllt.

Die Datenstruktur:
Delphi-Quellcode:
  TData = class
    FID: string;
    FText: String;
    FOrt: string;
    FValue: Extended;
Die Tabelle sieht so aus:
Code:
ID   nvarchar(12)   
Text   nvarchar(255)   
Ort   nvarchar(10)   
Value   float
Mein Insert bisher (in der SP ist nur der eigentlicher Insert drin).
Delphi-Quellcode:
For Data in ObjList do
begin
  ADOSP_T_SP.Active := false;
  ADOSP_T_SP.Parameters.ParamByName('@ID').Value := Data.FID;
  ADOSP_T_SP.Parameters.ParamByName('@Text').Value := Data.FText;
  ADOSP_T_SP.Parameters.ParamByName('@Ort').Value := Data.FOrt;
  ADOSP_T_SP.Parameters.ParamByName('@Value').Value := Data.FValue;
  ADOSP_T_SP.Active := true;
end;
welche Möglichkeiten gib es sonst noch? TAdoTable, TAdoCommand....
was eignet sich am besten bei so einer Datenmenge?

Edit: Server ist ein MSSQL 2017 v14.0

Uwe Raabe 2. Aug 2022 15:09

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Wenn es wirklich schnell gehen soll würde ich BULK INSERT verwenden: https://www.mssqltips.com/sqlservert...to-sql-server/

Papaschlumpf73 2. Aug 2022 15:21

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Mit einem SQL-Server 2018 wird das aber schwierig werden. So einen gibts doch gar nicht. :-D

Papaschlumpf73 2. Aug 2022 15:30

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1509665)
Wenn es wirklich schnell gehen soll würde ich BULK INSERT verwenden: https://www.mssqltips.com/sqlservert...to-sql-server/

Und so geht das mit Delphi: https://www.delphipraxis.net/209140-...m-schnell.html

haentschman 2. Aug 2022 17:17

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Moin...8-)
Zitat:

aber bei dieser Datenmasse ist das zu langsam
...immer wieder die Frage...welche Zeitvorstellung hast du bei 800000 Inserts? :stupid:
PS:
Nur das Insert oder auch das Laden?
PS:
ADO: Hängt ein Control an der Query welche die Daten lädt? Info: https://www.delphipraxis.net/192080-ado-langsam.html

LoZe 2. Aug 2022 20:18

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1509665)
Wenn es wirklich schnell gehen soll würde ich BULK INSERT verwenden

Vielen Dank für den Tipp ich werde mich da mal einlesen und versuchen das so einzubinden.

Zitat:

Zitat von Papaschlumpf73 (Beitrag 1509667)
Mit einem SQL-Server 2018 wird das aber schwierig werden. So einen gibts doch gar nicht. :-D

oh Stimmt hatte irgendwie einen Dreher Drin, ich habe eine MSSQL Server 2017 (v14.0.) und nutze die SSMS 18.
Danke für den Hinweis ich schau es mir auch mal an.

Zitat:

Zitat von haentschman (Beitrag 1509672)
Moin...8-)
...immer wieder die Frage...welche Zeitvorstellung hast du bei 800000 Inserts? :stupid:
PS:
Nur das Insert oder auch das Laden?

ich hatte es versucht und nach 10 Minuten Abgebrochen und es waren noch keine 100.000 Daten drin.
also kleiner 10 Minuten wäre schon wünschenswert für ca 800.000 Daten

nur Insert mach Probleme bei der Datenmenge bisher hatte ich noch nie den fall so viele Daten auf einmal einzufügen,
beim Laden mach ich mir keine Sorgen ich hab schon öfter große Datenmengen geladen und die Zeit war angemessen.

Papaschlumpf73 2. Aug 2022 20:57

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Die Inserts mit Datasets oder gespeicherten Prozeduren sind immer ziemlich langsam. Es kann ja immer nur ein einziger Datensatz gesendet, auf dem Server eingefügt und bestätigt werden, bevor der nächste Datensatz geschickt werden kann. Das kostet Zeit.

Die zweitschnellste Methode nach BULK INSERT / BULK COPY ist m.E., wenn du 1000, 5000 oder 10000 reine INSERT-Befehle in ein einziges Kommando packst und direkt per ADOConnection.Execute('deine 10000 Inserts...') zum Server schickst. Einfach mal ausprobieren, mit wieviel 1000 Datensätzen am Stück die besten Ergebnisse erziehlt werden.

LoZe 2. Aug 2022 21:25

AW: wie am besten viele Daten schnell in SQL Einfügen mit Delphi
 
Okay ich habe jetzt das mit dem BulkCopy eingefügt.
Keine 10 Sekunden, Wahnsinn.

Vielen Dank an Uwe Raabe und Papaschlumpf73


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz