Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   PreparedStatement - wie lange gültig? (https://www.delphipraxis.net/172733-preparedstatement-wie-lange-gueltig.html)

romber 19. Jan 2013 16:34

Datenbank: MS SQL Server • Version: 2008 • Zugriff über: UniDAC

PreparedStatement - wie lange gültig?
 
Hallo!

Über eine API erhalte ich sehr viele Daten, die ich in eine Tabelle auf dem SQL Server hinzufügen muss. Die Intensität des Datenstroms ist immer unterschiedlich, es können bis zu 250 Datensätze pro Sekunde sein oder nur 100 pro Stunde. Ich benutze PreparedStatements in Verbindung mit UniDAC, um die Tabelle mit Daten zu befüllen. In einem Datencontainer sammeln sich die Daten, die für den Insert bestimmt sind. Dann prüfe ich mit einem bestimmten Interval, ob irgendwelche Daten da sind, führe ein Prepare-Funktion aus und füge die Datensätze einzeln nacheinander hinzu. Eigentlich funktioniert alles ganz gut und ohne Probleme.

Nun bin ich dabei, die Insertion-Funktion noch ein bisschen zu optimieren. Da habe ich mir überlegt, ob ich die Prepare-Funktion nicht jedesmal vor der Insert-Schreife ausführe, sondern z.B. ein Mal pro Stunde oder sogar nur ein Mal beim Start des Programms. Denn aktuell ist es so, dass durch meine oben beschriebene Vorgehensweise die Prepare-Funktion oft bis zu 50 Mal pro Minute ausgeführt wird, wodurch das Ganze, wenn auch nicht direkt bemerkbar, etwas langsamer wird.

Wie lange ist ein PreparedStatement gültig? Wird es reichen, wenn ich es nur ein Mal beim Start des Programmst ausführe? DB-Dienst und das Programm laufen auf dem selben PC.

mkinzler 19. Jan 2013 17:09

AW: PreparedStatement - wie lange gültig?
 
Da es eine Funktionalität des DBMS ist, vermute ich mal, dass sie für die Sitzung Bestand hat.

Bernhard Geyer 19. Jan 2013 18:02

AW: PreparedStatement - wie lange gültig?
 
Zitat:

Zitat von romber (Beitrag 1199788)
Wie lange ist ein PreparedStatement gültig? Wird es reichen, wenn ich es nur ein Mal beim Start des Programmst ausführe?

Wenn du es nicht wieder unpreparest oder die Db-Connection beendest - ewig.

romber 19. Jan 2013 19:26

AW: PreparedStatement - wie lange gültig?
 
Vielen Dank!

tsteinmaurer 20. Jan 2013 08:29

AW: PreparedStatement - wie lange gültig?
 
SQL Server geht da sogar noch einen Schritt weiter. SQL Server hat selbst auch einen PLAN CACHE, d.h. auch wenn du im Client ein Unprepare machst (oder die Connection schließt), behält sich der SQL Server eine kompilierte Fassung des Statements inkl. Ausführungsplan in seinem Cache für eine spätere Wiederverwendung.

Furtbichler 20. Jan 2013 09:03

AW: PreparedStatement - wie lange gültig?
 
Wenn Du maximale Performance haben willst, dann versuche doch mal die Variante mit 'BULK INSERT'. Dabei erzeugst Du mit deinen Daten eine Text-Datei und lässt den SQL-Server diese dann per o.g. Befehl einlesen. So kommt man schnell auf 10.000 Datensätze pro Sekunde.

Ich hoffe, Du verwendest einen Workerthreadpool, um die Spitzen abzufangen? Denn dann kann es dir ziemlich egal sein, wie schnell deine Daten eintrudeln.

Bernhard Geyer 20. Jan 2013 09:37

AW: PreparedStatement - wie lange gültig?
 
Zitat:

Zitat von Furtbichler (Beitrag 1199850)
Wenn Du maximale Performance haben willst, dann versuche doch mal die Variante mit 'BULK INSERT'. Dabei erzeugst Du mit deinen Daten eine Text-Datei und lässt den SQL-Server diese dann per o.g. Befehl einlesen. So kommt man schnell auf 10.000 Datensätze pro Sekunde.

Die (fast) gleiche Geschwindigkeit erreicht man auch wenn man da prepared Statement auch mit mehreren Inserts (z.B. 100 - je nach anzahl der Parameter des Inserts) aufbaut.

romber 20. Jan 2013 15:19

AW: PreparedStatement - wie lange gültig?
 
Zitat:

Zitat von Furtbichler (Beitrag 1199850)
Ich hoffe, Du verwendest einen Workerthreadpool, um die Spitzen abzufangen? Denn dann kann es dir ziemlich egal sein, wie schnell deine Daten eintrudeln.

Ich weiss nicht mal, was das ist. :oops: Werde mich jetzt schlau machen, auch bezüglich des BULK INSERT. Ich dachte die ganze Zeit, schneller als mit PreparedStatement geht's kaum...

Furtbichler 20. Jan 2013 17:09

AW: PreparedStatement - wie lange gültig?
 
Hi,

Stell Dir vor, Du hast ein Array, in das Du einfach die zu speichernden Daten auf der einen Seite reinstopfst, und auf der anderen Seite sind lauter Threads, die jeweils ein Paket abholen und in die DB speichern.

Dann können punktuell ruhig mal ein paar 1000 Datensätze pro Sekunde reinkommen. Denn es macht ja nichts, wenn dann die Liste kurzzeitig mal wächst, denn auf der anderen Seite hast Du ja deine Threads, die die Daten im Hintergrund abholen, wenn mal weniger zu tun ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 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