Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : schreiben einer Tabelle beschleunigen ? (SQL)



hunter
24-09-2003, 12:50
Ich arbeite zur Zeit an einem VB.NET Programm, das Daten auslesen, soritieren und in Tabellen schreiben soll. Mein eigentliches Problem ist aber SQL, weshalb ich es hier mal poste.

Ich habe Daten aus einer Datenbank ausgelesen und sortiert. Diese Daten liegen nun in einer DataTable, was letztendlich ein mehrdimensionales Array ist. Darin liegen die Daten nun korrekt in den richtigen Zeilen und Spalten vor.

Diese Daten müssen nun in eine Excel Tabelle pbertragen werden, wofür ich aber über eine Schnittstelle gehe und die Tabelle wie eine Datenbank behandel. Das übergeben der Daten erfolgt dann zeilenweise per SQL Anweisungen.


For i = 0 To (tabelle.Rows.Count - 1)

'Abweichungen berechnen
[...]
'Korrekturschleife, damit an leeren Stellen
'das Schlüsselwort 'NULL' eingesetzt wird
[...]
'Tag und Monat bestimmen
[...]


'SQL Kommando zum zeilenweisen einfügen von Daten
cmd.CommandText = "INSERT INTO Daten2 (Zeit, Sensor1A, Sensor2A, Sensor1B, Sensor2B," + _
" Tag, Monat, Abweichung1, Abweichung2) values" + _
"('" + _
(tabelle.Rows(i).Item(0)).ToString + _
"', " + _
(tabelle.Rows(i).Item(1)).ToString + _
", " + _
(tabelle.Rows(i).Item(2)).ToString + _
", " + _
(tabelle.Rows(i).Item(3)).ToString + _
", " + _
(tabelle.Rows(i).Item(4)).ToString + _
", " + _
tag + _
", " + _
monat + _
", " + _
(tabelle.Rows(i).Item(5)).ToString + _
", " + _
(tabelle.Rows(i).Item(6)).ToString + _
")"

cmd.ExecuteNonQuery()
Next

Wie man sieht lasse ich den Index von 0 bis Anzahl Zeilen - 1 laufen und übertrage alle Daten per SQL. Das ganze dauert etwas über 2 Sekunden, was schon 2/3 der Gesamtlaufzeit das Programms ausmacht.

Daher meine Frage: Gibts irgendeine Möglichkeit das zu beschleunigen, indem man es vieleicht etwas anders angeht ?

Christoph
25-09-2003, 10:48
Vermutlich wirst Du mit deinem "von-hinten-durch-die-Brust-ins-Auge" Verfahren
es kaum schneller hinkriegen (tatsächlich wundere ich mich, dass dein Code *nur* 2 Sekunden braucht).

Versuchs mal mit anderen Verfahren, Daten mit Excel auszutauschen (DDE oder OLE).
Aber auch diese Umgebungen sind sehr schwerfällig.

Wirklich schnell ginge es nur, wenn Du direkt Excel-Dateien schreiben könntest,
aber das geht meines Wissens nicht (oder gibt es da z.B. ein Perl-Modul für?).

hunter
25-09-2003, 12:26
Hmm. Also ich kann Excel im Hintergrund öffnen und dann direkt Daten schreiben, aber das ist noch erheblich langsamer.

mehlvogel
25-09-2003, 15:04
eine erste beschleunigung wäre, wenn du es in einen QUERY packst, also nur ein SQL Statement ausführt, imho sieht ein entsprechendes INSERT statement so aus:



INSERT spalte1, spalte2, etc.. VALUES (wert1a, wert2a, ...) VALUES (wert1b, wert2b, ...)


Was Christoph sagte halte ich aber für genauso richtig, diese Methode ist Umständlich wie sonst nix - und dazu recht unperformant. Es wäre wesentlich schneller, wenn dein Programm die Datei generieren würde, nicht Werte in die Datei einfügt. (Ich hoffe das ist verständlich) Soweit ich weis geht das aber wirklich nicht, weil das Excel Format ja nicht offen ist :( (OOo kann z.B. Excel zwar lesen, aber auch nicht schreiben).

hunter
25-09-2003, 17:56
Nee. Das ist eine Vorlage mit Diagrammen usw. Würde ich das alles selbst erzeugen, wäre das gesamte Programm letztendlich viel langsamer.

Ich versteh aber noch nicht so ganz wie ich ein einzelnes SQL Statement hinbekommen soll. Ich mein, es handelt sich um über 4 x 700 Werte. Alle mit Wert und Komma reinschreiben lassen ?

Christoph
01-10-2003, 09:20
Ich versteh aber noch nicht so ganz wie ich ein einzelnes SQL Statement hinbekommen soll. Ich mein, es handelt sich um über 4 x 700 Werte. Alle mit Wert und Komma reinschreiben lassen ?
SQL bietet -begrenzte- Möglichkeiten mehrere Statements zusammenzufassen, z.B. UNIONs oder das Anlegen von VIEWs.

Ansonsten kannst Du jede Abfrage mit einem Statement realisieren, wenn Du auf stored Procedures zurückgreifst, z.B. in PostgreSQL


creat procedure blabla as '
-- procedure code mit SQL-Staetements, Schleifen und rosa Rüschen
' language plpgsql
select blabla();

Geht mit anderen Datenbanken (Oracle, Interbase...) natürlich auch.