PDA

Vollständige Version anzeigen : allgemeines zum Laufzeit optimieren


biaaas
06.08.2003, 12:32
Ich arbeite gerade an einer Bilanz-Datenbank, da dort in den Tabellen bis zu mehreren 10-tausende Datensätze vorkommen und diese sehr oft mit einander verrechnet und verglichen werden, wollte ich mal nachfragen was man beim programieren beachten sollte damit die Laufzeit erträglich bleibt. Also wie man schnell große Anzahlen von Datensätzen abarbeiten kann.

MRR
06.08.2003, 12:34
Na, das hängt ganz davon ab, was Du mit den Daten machst... Ich habe eine DB in Arbeit, die in 7 Tabellen insgesamt ca. 140.000 DS hat. Eine einfache Auswertung einzelner Tabellen geht ratz-fatz. Aber wenn ich die dann über Beziehungen in einer Abfrage verknüpfe, diverse Kriterien setze, gruppiere und Zusammenfassungsfunktionen anwende und auf dieser Abfrage dann weitere aufbauen - dann dauert es schon mal seine Zeit...

Kannst Du ein paar nähere Infos geben?

biaaas
06.08.2003, 13:05
Das Ganze besteht aus drei Datenbanken einmal Stammdaten diese enthält statische Daten (Bilanzformblatt, Konten- u. Positionsplan, Stammdaten von Mietern und Zahlungsempfängern usw.) , des Weiteren gibt es die Bilanzdatenbank in der ca. 10 Tabellen mit Buchungen, Erträgen, Tilgungen.... etc. die für jeden Monat eingelesen und in der Tabelle mit dem Vormonat verrechnet werden müssen. Außerdem müssen die einzelne Konten mit den Stammdaten Verglichenwerden, um Multiplikatoren zu holen und die Stammdaten auf Aktualität zu prüfen.
Die letzte und umfangreichste Datenbank sind dann die Bewegungsdaten die Aufgaben sind ähnlich wie in der Bilanz-DB, nur hier sind mehr Daten (ca. 30 Tabellen).

Das ganze soll als Schnittstelle zwischen der Outsourcing-Software der Firma, die die Daten für die DB's als Textdateien liefert, und einer professionell Bilanzdatenbank dienen.

Mir geht es vor allem darum wie ich effizient die einzelnen Datensätze durcharbeiten kann.

BodoM
06.08.2003, 13:11
Hallo,

es ist schon schwierig so pauschal zu sagen, wie die Performance gesteigert werden kann. Es hängt ist Wesentlichen von der Struktur der Abfragen ab und wie sie verschachtelt sind.

Aber einen Tipp habe ich. Verwende nach Möglichkeit Abfragen und keine Recordsets, da Recordsets immer erst noch kompiliert werden müssen.


Gruß Bodo

biaaas
06.08.2003, 14:01
Ich benutze fast nur Recordsets und kann mir gerade nicht richtig vorstellen wie ich Abfragen benutzen soll. Ich geb euch mal ein Beispiel für eine Funtion:Function abr76Umonatssaldo()

Dim rst1 As Recordset
Dim rst2 As Recordset
Dim kto As String
Dim monat As Integer
Dim monat2 As String

Set rst1 = CurrentDb.OpenRecordset("Select * from ABR76U where (ABR76U.kontroll=0)order by Datum")

rst1.MoveFirst
While rst1.EOF = False

kto = rst1!kto
monat = CInt(Mid(rst1!stichtag, 3, 2))
If monat = 1 Then
rst1.Edit
rst1![Umlage 1] = rst1![KUmlage 1]
rst1![Umlage 2] = rst1![KUmlage 2]
rst1![Umlage 3] = rst1![KUmlage 3]
rst1!Kontroll = 1
rst1.Update
Else
If monat < 11 Then monat2 = "0" & CStr(monat - 1) & Right(rst1!stichtag, 4) Else monat2 = CStr(monat - 1) & Right(rst1!stichtag, 4)

Set rst2 = CurrentDb.OpenRecordset("Select * from ABR76U where ((ABR76U.kontroll=1 and right(ABR76U.stichtag,6)='" & monat2 & "'))")

If rst2.RecordCount = 0 Then
MsgBox Left(monat2, 2) & "/" & Right(monat2, 4) & " ist noch nicht eingelesen!", vbExclamation + vbOKOnly
GoTo ende
End If
Set rst2 = CurrentDb.OpenRecordset("Select * from ABR76U where ((ABR76U.kontroll=1 and right(ABR76U.stichtag,6)='" & monat2 & "' and ABR76U.kto='" & kto & "'))")
If rst2.RecordCount = 0 Then
With rst1
.Edit
![Umlage 1] = ![KUmlage 1]
![Umlage 2] = ![KUmlage 2]
![Umlage 3] = ![KUmlage 3]
!Kontroll = 1
.Update
End With
Else
With rst1
.Edit
![Umlage 1] = Round(![KUmlage 1] - rst2![KUmlage 1], 2)
![Umlage 2] = Round(![KUmlage 2] - rst2![KUmlage 1], 2)
![Umlage 3] = Round(![KUmlage 3] - rst2![KUmlage 1], 2)
!Kontroll = 1
.Update
End With
End If

End If
rst1.MoveNext
Wend

ende:

End Function


Das Ganze soll in einer Tabelle die Buchungen für die einzelnen Konten (rst1) mit denen des Vormonats(rst2) in der gleichen Tabelle verrechnen. Januar und Konten die im Vormonat nicht bebucht worden bekommen eine Sonderbehandlung.

Die meisten anderen Aufgaben sind ähnlich, hauptsächlich Datensätze synchronisieren und verrechnen.

WMS
06.08.2003, 14:40
Aber einen Tipp habe ich. Verwende nach Möglichkeit Abfragen und keine Recordsets, da Recordsets immer erst noch kompiliert werden müssen.


... das kann ich Bodo nur bestätigen. Ich arbeite auch nur mit Sql-Abfragen! :confused: :)

Karlheinz
06.08.2003, 14:52
Hallo,

mich würde interessieren was du unter Sql Abfragen meinst.

Gruß karlheinz

WMS
06.08.2003, 15:00
@ Karlheinz: meine Sql-Strings

z.B.:

Static SqlStr$
SqlStr = "INSERT INTO tmp_tblKunden ( Kunde, Artikel, Preis, feld, Dat ) "
SqlStr = SqlStr & "SELECT tblKunden.Kunde, tblKunden.Artikel, tblKunden.Preis, tblKunden.feld, tblKunden.Dat "
SqlStr = SqlStr & "FROM tblKunden "
SqlStr = SqlStr & "WHERE (((tblKunden.id)=" & id & "))"
DoCmd.SetWarnings False
DoCmd.RunSQL SqlStr
DoCmd.SetWarnings True
Forms!frm_Kunden.frm_tmpUKunden.Form.Requery

Kurt aus Kienitz
06.08.2003, 15:36
<font face="Comic Sans MS">Hallo miteinander,

Na, da bin ich mal gespannt, wie man mit einem DoCmd.RunSQL die Varbeitung aus biaaas Funktion hinbekommt ;)

Spaß bei Seite, hast Du einen Index auf dem Feld <b>kotroll</b> gesetzt ?
Das sollte eigentlich was bringen.
Dann solltest Du mal überlegen, ob die Sortierung nach Datum unbedingt erforderlich ist.
Eine Denormalisierung des Stichtages (neues Feld für den Monat des Stichtages) würde dafür sorgen, daß Du nicht bei jeden Datensatz die Funktion <b>right()</b> ausführen musst.

HTH
Grüße Kurt

biaaas
06.08.2003, 15:48
Am Feld Stichtag lässt sich nicht rütteln der muss so bleiben wie er ist (als string TTMMJJJJ), er wird für den Import in die professionielle Buchhaltungs-Datenbank gebraucht. Indizieren kann ich auch nichts weil ich für jeden Monat die Datensätze einlese. Die Funktion soll die frisch eingelesene Datensätze mit denen vom Vormonat (hier zählt stichtag bzw. Datum) verrechnen, das feld kontroll soll nur die schon bearbeiteten Datensätze markieren.
Wenn nicht nach Datum sortiere erwische ich nicht alle Datensätze.

Kurt aus Kienitz
07.08.2003, 08:15
<font face="Comic Sans MS">Hallo nochmal,

Am Feld Stichtag lässt sich nicht rütteln der muss so bleiben wie er ist (als string TTMMJJJJ),

Der Stichtag soll ja nicht verändert werden. Es soll ein zusätzliches Feld <b>StichtagMonat</b> eingefügt werden, in welches die Monatsangabe des Stichtages angegeben wird.
Dann kannst Du anstelle von

Select * from ABR76U where ((ABR76U.kontroll=1 and right(ABR76U.stichtag,6)='" & monat2 & "'))"

sowas verwenden

Select * from ABR76U where ((ABR76U.kontroll=1 and StichtagMonat='" & monat2 & "'))")

Indizieren kann ich auch nichts weil ich für jeden Monat die Datensätze einlese.
Das hat nichts miteinander zu tun. Du kannst einen Index auf <b>kontroll</b> legen und trotzdem jeden Monat Datensätze einlesen.
So ein Index hilft der Datenbank lediglich dabei, die gesuchten Datensätze schneller zu finden.

Wenn nicht nach Datum sortiere erwische ich nicht alle Datensätze
Du meinst sicherlich, daß Du die Datensätze dann nicht in der richtigen Reihenfolge erwischt ;)

Grüße Kurt

biaaas
07.08.2003, 08:40
Hallo,
danke für die Hinweise.
Gibt es einen Unterschied zwischen ADO und DAO was die Laufzeit angeht?

biaaas
07.08.2003, 10:05
@Kurt:
Durch deine Hinweise ist die ist die Zeit schon um die Hälfte geschrumpft. Danke.

@alle:

Ist da noch mehr drin? Das ganze dauert auf dem schnellsten rechner hier (Pentium 4 2,4GHz mit 512Mb DDR) immer noch 2min.

biaaas
08.08.2003, 07:08
Ich muss nochmal nach fragen, da mit steigender Anzahl der Datensätze das ganze ziemlich unerträglich wird.
Gibts noch irgenwelche möglichkeiten?

Kurt aus Kienitz
08.08.2003, 07:26
<font face="Comic Sans MS">Hallo nochmal,

Ändert sich das Laufzeitverhalten, wenn Du die DB zwischdruch mal kompremierst und reparierst ?

Grüße Kurt

biaaas
08.08.2003, 07:35
Ich komprimiere immer regelmäßig, und hab dabei keinen oder nur unwesentlichen unterschied gemerkt.
Noch mal die Frage von oben gibt es eine Unterschied (Laufzeit) zwischen ADO und DAO?