Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOQuery: Timeout abgelaufen beim Insert??? (https://www.delphipraxis.net/148308-tadoquery-timeout-abgelaufen-beim-insert.html)

romber 27. Feb 2010 09:35

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

TADOQuery: Timeout abgelaufen beim Insert???
 
Hallo!

Ich erhalte über einen Webservice große Mengen an Daten, die ich anschließend bearbeite und einer Tabelle auf dem lokalen MS SQL Server hinzufüge. Manchmal sind es mehrere hundert Datensätze pro Minute. Einmal pro Tag führt SQL-Agent einen SQL-Script zum Löschen der älteren Datensätze aus. Derzeit sind in der Tabelle ca. 1,5 Mio. Datensätze drin.

Beim Hinzufügen erhalte ich immer öffter die Meldung von der DB-Engine "Timeout abgelaufen".
Was bedeuted diese Meldung genau?
Kann ich grundsätzlich die Tabelle irgendwie optimieren, damit Inserts schneller ausgeführt werden?

Bernhard Geyer 27. Feb 2010 10:04

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von romber
Beim Hinzufügen erhalte ich immer öffter die Meldung von der DB-Engine "Timeout abgelaufen".
Was bedeuted diese Meldung genau?

Die aktionen dauerten länger als die eingestellte Timeout-Zeit

Zitat:

Zitat von romber
Kann ich grundsätzlich die Tabelle irgendwie optimieren, damit Inserts schneller ausgeführt werden?

Ja. genügend HW-Performance und Speicher zur verfügung stellen. Bulk-Inserts und Prepared Statements verwenden.

romber 27. Feb 2010 10:10

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Vielen Dank für die schnelle Antwort!

Zitat:

Zitat von Bernhard Geyer
Ja. genügend HW-Performance und Speicher zur verfügung stellen. Bulk-Inserts und Prepared Statements verwenden.

Wir haben da 8 Gb Arbeitsspeicher und MS SQL Server 2008 Enterprise. An der Speichermangel kann es nicht liegen, denke ich.
Was sind Bulk-Inserts genau?

Bernhard Geyer 27. Feb 2010 10:13

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von romber
Was sind Bulk-Inserts genau?

BULK INSERT

Sir Rufo 27. Feb 2010 12:39

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von romber
Wir haben da 8 Gb Arbeitsspeicher und MS SQL Server 2008 Enterprise. An der Speichermangel kann es nicht liegen, denke ich.

Warum nicht?
Ein Polo mit 200PS ist ein Rakete, ein Mercedes G mit 200PS bewegt sich.

Es kommt nicht drauf wieviel Speicher drin ist, sondern ob ausreichend Speicher vorhanden ist.

Weiterhin kommt es auch darauf an, ob auf die Tabelle von anderer Stelle auch noch zugegriffen wird,
und damit das Schreiben in die Tabelle verzögert wird.

Bernhard Geyer 27. Feb 2010 15:56

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Ich würde einfach mal den SQL Profiler vom SQL Management Studio anschmeißen und schauen was so die Inserts/Deletes/... für eine Last verursachen. Dann noch schauen was bei deiner DB für Indexgrößen in MB/GB vorhanden ist. Fast nichts ist performancefressender wenn Indizes nicht komplett in den Speicher passen und permanent von Festplatte als Teile geladen werden müssen.

Und 8GB: Wieviel davon darf sich der MS SQL Server denn genehmigen? Evtl. ist das kein dedizierter DB-Server und das DBMS ist auf 2 GB limitiert.

romber 27. Feb 2010 16:30

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von Bernhard Geyer
8GB: Wieviel davon darf sich der MS SQL Server denn genehmigen? Evtl. ist das kein dedizierter DB-Server und das DBMS ist auf 2 GB limitiert.

Es ist doch ein dedizierter Server. Es sind insgesamt 12 GB Speicher vorhanden, soweit ich weiss darf SQL-Server 8 GB davon beanspruchen. Auf die Tabelle wird nur lokal zugegriffen und alle Zugriffe erfolgen von einer einzigen Anwendung.

Mit Bulk-Inserts habe ich es noch nicht ganz verstanden, bin aber dabei. Prepared Statenents hört sich viel besser an. Ich google gerade nach Prepared Statements, finde aber nur diverse Java- und PHP-Tutorials. Wie erstellen ich ein Prepared Statement?

alzaimar 27. Feb 2010 17:13

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Also: Ich bekomme 80-150 INSERTs pro Sekunde hin. Wenn ich meinen kleinen Server mal richtig stressen will, baue ich mir eine kleine EXE, die über eine Verbindung einfach mal Daten in den Server bläst. Das auf ein paar PCs verteilt und dann schaff ich diese Performance. Ist auch kein Ding, eigentlich.

Ach, und der Server ist eine 1GHz Single CPU Krücke mit 1 oder 2GB RAM.

Ich denke also, das der Fehler woanders liegt.

Hast Du uns schon erzählt, wie viele Spalten die Tabelle hat? Ist es nur eine Tabelle? Sind BLOBs dabei? Indexe? Ach, und wie groß sind denn die INSERT-Befehle? Ich habe gute Erfahrungen gemacht, die INSERT-Befehle in eine Stringlist zu schreiben und wenn so zusammen 1000-2000 Zeichen zusammen sind, alles mit einem TADOConnection.Execute mal in den Server pusten. Ich hatte damit noch nie Probleme.

Bernhard Geyer 27. Feb 2010 18:19

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von alzaimar
Ich habe gute Erfahrungen gemacht, die INSERT-Befehle in eine Stringlist zu schreiben und wenn so zusammen 1000-2000 Zeichen zusammen sind, alles mit einem TADOConnection.Execute mal in den Server pusten.

Wäre dann ein "händischer" BULK-Insert :-)

Unser App auf Arbeit macht das auch noch zusammen mit prepared Statements - Mann will sich doch kein SQL-Injection leisten :-)

romber 27. Feb 2010 20:39

Re: TADOQuery: Timeout abgelaufen beim Insert???
 
Zitat:

Zitat von alzaimar
Hast Du uns schon erzählt, wie viele Spalten die Tabelle hat? Ist es nur eine Tabelle? Sind BLOBs dabei? Indexe? Ach, und wie groß sind denn die INSERT-Befehle?

Es ist nur eine Tabelle. Die Tabelle hat 115 Spalten, keine Blobs und erstmal keine Indexe. Die Insert-Befehle sind 1500-5000 Zeichen groß.

Liegt mein Problem vielleicht daran, dass ich es mir einfach gemacht habe und die Daten mit ADOQuery.Insert -> ADOQuery.FieldByName().Value -> ADOQuery.Post hinzufüge? Ist ein generiertes SQL-Statement die Lösung?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 Uhr.
Seite 1 von 2  1 2      

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