Bitte um Tipps zur Optimierung

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Bitte um Tipps zur Optimierung

Beitrag von brandelh »

Hi,

ich arbeite gerne mit Funktionen, die aus Hilfstabellen Werte lesen im RAM zwischenspeichern und den Inhalt zurück geben.
Nun hab ich das mal mit SELECT FROM versucht und da geht es doch viel schneller, aber ich denke Ihr habt noch Optimierungsmöglichkeiten für mich ;-)

Code: Alles auswählen

* Am Anfang bereite ich die Array Variablen für die DatenObjekt vor
   aVOSchl    := {}
   aVASchl    := {}
   aWeKeyInfo := {}

.... für diese einfache Such und Rechenaufgabe ist das besser 
   set exclusive on

... ich öffne eine der Hilfsdateien, und übergebe den Alias, ginge das auch direkt ?

   use VK_Schl alias TMP
   SELECT * FROM TMP INTO OBJECTS aVOSchl
   close TMP

   use VA_Schl alias TMP
   SELECT * FROM TMP INTO OBJECTS aVASchl
   close TMP

   use WeOrtArt alias TMP
   SELECT * FROM TMP INTO OBJECTS aWeKeyInfo // das Schlüsselfeld hier ist KEY => o:KEY machte keine Probleme beim Zugriff !
   close TMP

   ? "Teste die Ausgaben"
   ?
   ? "01Aa:      "
   ? "      Ort: ",LadeInfo("01Aa",aWeKeyInfo,"WO")
   ? "      Art: ",LadeInfo("01Aa",aWeKeyInfo,"WA")
   ?
   ? "020   VK:  ",LadeInfo( "020",aVOSchl   ,"VK")
   ? " 50   VA:  ",LadeInfo(  "50",aVASchl   ,"VA")

**** JA die richtigen Werte werden zurück gegeben
:D
Gruß
Hubert
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Bitte um Tipps zur Optimierung

Beitrag von Marcus Herz »

Hallo Hubert
Ich sehe da kein Optimierungspotential.
Ich bin aber komplett davon abgekommen, irgendwelche Daten im RAM zu halten. (Ich kenne leider die Größe Der Dateien nicht, das mal außen vor).
Mit ADS sowohl Isam, aber vor allem SQL und PostgreSQL sind die Abfragen eigentllich so schnell, das sich das gar nicht lohnt, Daten lokal zu behalten. Schon wegen der Synchronisation.

Nur wenn diese ABSOLUT konstant sind, kann man sich das ins RAM laden. Dann ist das eine gute Wahl mit DataObject Array.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Bitte um Tipps zur Optimierung

Beitrag von Tom »

Hallo, Marcus.

Und wo landet dann bei Dir das Ergebnis eines SELECTs? Was genau ist ein Cursor bei Dir? Und wo und wie wird der repräsentiert?

Die Technik geht weltweit den umgekehrten Weg. Fette, riesige Server nutzen Massenspeicher letztlich nur noch als Backupmedium - und agieren in der Hauptsache auf im RAM gespiegelten Daten. Wenn man nach Möglichkeiten sucht, beispielsweise den MS-SQL-Server im Hinblick auf seine Performance zu optimieren, trifft man vor allem auf die Empfehlung, ihm möglichst viel Hauptspeicher zu geben - mindestens die Hälfte der Größe der physischen Datenbank, empfehlen sogar einige. Unsere dateibasierten "Datenbanken" stochern bei nahezu jedem Navigationsvorgang auf den Massenspeichern herum, aber SQL generiert ein Record Set, das so oder so nicht mehr auf dem Massenspeicher liegt.
Herzlich,
Tom
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Bitte um Tipps zur Optimierung

Beitrag von Marcus Herz »

die aus Hilfstabellen Werte lesen im RAM zwischenspeichern und den Inhalt zurück geben.
Ich habe das so verstanden, dass Hubert 1xig die Daten einliest und als Static oder so für weitere Verwendung im RAM des Clients behält.
Klar ist jedes Ergebnis einer SQL ABfrage oder der Inhalr eines Satzes im RAM. Und nach der Verarbeitung wieder freigegeben/geschlossen.
Und der Server cached die Daten, er hat ja auch die Kontrolle aller Instanzen.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Bitte um Tipps zur Optimierung

Beitrag von Tom »

Hubert meint mit den "Hilfstabellen im RAM" die Arrays aus DataObjects, die als Ergebnisse der SELECTs entstehen. Oder, Hubert?
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Bitte um Tipps zur Optimierung

Beitrag von brandelh »

Genauer gesagt habe ich eine DBF mit 800.000 Datensätzen, die auf 3 Felder gekürzt wurde.

Die Kombination dieser Felder (Key 4 Stellig z.B. "01Aa", VK 3 Stellen und VA 2 Stellen, entstehen, in dem Sachbearbeiter aus VK und VA den KEY bilden.
Ich muss nun daraus eine Summen DBF bauen, die zusätzlich die Klartexte für jede dieser Keys / VK / VA und die Anzahl aus KEY+VK+VA Kombinationen enthält.
Da ich mich mich SQL nicht wirklich auskenne, lade ich zunächst die tatsächlich fixen Texte zu KEY, VK und VA in die obigen Arrays mit Dataobjects.
Ich denke bei 13.000 Ergebnis-Sätzen ist die Array Lösung viel schneller und ich muss mich nicht mit Selects rum ärgern.

Ich durchlaufe die Daten DBF ohne Index genau einmal !

Die Ergebnisse speichere ich auch in einem Array, finde ich eine KEY+VK+VA Kombi, erhöhe ich das Feld Anzahl dieses Array Elementes.
wenn nicht, lege ich die Kombi ( 3 Felder Key, VK, VA und das 4. mit 1 als numerischem Wert an) an.

Wenn ich durch bin, bleiben etwa 13.000 Satze im Array, das nun in die Ziel DBF weg geschrieben wird,
wobei die fixen Infos per Funktion aus den zuvor geladenen Arrays zugespielt werden: Key_Ort, Key_Art, VK_Txt, VA_Txt.

Möglich, dass jemand der sich mit SQL gut auskennt und die Daten eh in einem SQL Server hat, das mit Gruppen und Summen besser und einfacher lösen kann,
aber ich bin nun mal in der DBF Welt zu Hause und so weiß ich, dass das Ergebnis stimmt.

13 min braucht mein i5-2550 mit Samsung SSD für diese Auswertung.

Die Ziel DBF lade ich dann in Excel und speichere als XLSX, formatiere sie noch etwas auf Lesbarkeit und morgen geht das Ganze an die SB damit sie die Ergebnisse auswerten :-)
Gruß
Hubert
Antworten