ADS Last hoch

Advantage Database Server

Moderator: Moderatoren

Antworten
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

ADS Last hoch

Beitrag von Dominik Krebs »

Hallo,
ich setze von mehreren Klienten aus, in einem separaten Thread, einem Filter auf eine Datenbank. Dieser Thread tickert in einem Intervall von 3 Sekunden immer wieder neu. Ich prüfe damit, ob ein Eintrag in der Datenbank vorhanden ist, der einen bestimmten wert hat, um festzusstellen ob ein neuer Auftrag eingegangen ist.

Dieses Vorgehen erzeugt aber leider eine hohe CPU Last beim ADS selbst, welches sich bei diversen anderen SQL abfragen als hinderlich und Zeitraubend rausstellt.

Welche Wege gibt es um die Serverlast zu senken? Kann ich mich vom ADS über neue Aufträge benachrichtigen lassen?
Gruß Dominik
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von Marcus Herz »

ADS kann Notifications versenden. Diese können z.B. in einem After Insert Trigger erzeugt werden.
- Warum erezugt deine SQL Abfrage eine so hohe AUslastung? Hast du die mal im ARC analysieren lassen?
- Wie leutet das SQL?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Joern
Rookie
Rookie
Beiträge: 10
Registriert: Di, 19. Jul 2011 9:31
Wohnort: Ebensfeld
Hat sich bedankt: 45 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Joern »

Hallo,

ich hatte ein ähnliches Problem(vielleicht das gleiche?) mit AOF-Filtern.
Ich hatte auch mehrere PCs die mehrere Filter erstellten um etwas anzuzeigen, was den Server zum schwitzen brachte.
Da dies in meinem Fall nur zur Anzeige benötigt wird konnte ich mir helfen in dem nur noch 1 PC den Filter aufbaut und das nötige Ergebnis dann in eine Datenbank schreibt.
Die anderen PCs lesen dann nur noch das Ergebnis aus der Datenbank.

Vielleicht hilft der Ansatz bei dir.
Gruß
Joern
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von Marcus Herz »

Ich würd immer die Wurzel des Problems suchen und mir keine Workarounds basteln. Ist fehleranfälliger und mehr Verwaltungsaufwand.
Es muss doch einen Grund geben warum ein AOF Filter so langsam ist oder ob es eine performantere Möglichkeit gibt, deas Ergebnis zu bekommen.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 651
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von nightcrawler »

vielleicht ist es kein AFO - weil clientseitig ausgewertet werden muss?
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Marcus Herz hat geschrieben: Di, 25. Jul 2023 9:41 ADS kann Notifications versenden. Diese können z.B. in einem After Insert Trigger erzeugt werden.
- Warum erezugt deine SQL Abfrage eine so hohe AUslastung? Hast du die mal im ARC analysieren lassen?
- Wie leutet das SQL?
Das mit den Notifications kenne ich tatsächlich noch nicht, habe aber mal davon gehört.
Die SQL abfrage ist nicht das übel.
Wie analysiere ich sowas denn?

Ich muss dazusagen, dass ich mit der Tobax Klasse arbeite:
Zu beginn, setze ich auf eine Tabelle einen Felter

Code: Alles auswählen

::oADAuftrag:SetFilter( ' astand = "9" .AND. aufneu = "2" ' )
::oADAuftrag:GoTop()
In der Eventschleife im Thread, mache ich immer wieder ein GoTop und prüfe in der Methode ::AlarmierungSuchen(), ob der Filter einen RecCount > 0 hat.

Code: Alles auswählen

	 ::nSleep := 300
         DO WHILE ::lRunning
         BEGIN SEQUENCE         
         ::oADAuftrag:GoTop()
         ::AlarmierungSuchen()
         RECOVER
         END SEQUENCE
         Sleep(::nSleep)
         ENDDO

Code: Alles auswählen

         IF ::oADAuftrag:RecCount() > 0 .AND. ::oADAuftrag2:Seek(::oADAuftrag:aufnr:asString)
         oDlgAlarm := PortaAlarmWin():New(,::oOwner,,,,,::oADAuftrag,::oADAuftrag2):CREATE()
         IF Application:ShowModal(oDlgAlarm)
         ...
         ENDIF
         oDlgAlarm:Destroy()         
         ENDIF

Hier öffnet sich dann ein Fenster, welches dem Disponenten signalisier, das ein neuer Auftrag da ist.

Es ist also ein Menachnismus der neue Aufträge signalisieren soll.

Die SQL abfrage hat nichts hiermit zu tun. Man merkt jedoch das SQL deutlich langsamer ist, umso mehr Disponenten den Thread laufen haben.
Wenn ich diese Programmstelle auskommentiere, gibt es keine Last auf dem ADS und SQL ist auch kein Problem mehr.
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Das ist übrigens der SQL Befehl

Code: Alles auswählen

SELECT ad_1.renr,ad_1.datum,ad_1.aufa,f_rech.standfahrzeug,f_rech.standkennz,f_rech.stellplatzname,f_rech.leitzahl,ad_1.auftrag,ad_1.adgrund,ad_1.hname,ad_1.adort,ad_1.ftext1,ad_1.sicherg,ad_1.sichergam,ad_1.standortid,ad_1.vorgangnr,ad_1.merker3 FROM ad_1 INNER JOIN f_rech ON ad_1.renr = f_rech.renr WHERE ad_1.merker3 ='s' AND f_rech.standgeld=true ORDER BY ad_1.datum
Gruß Dominik
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von Marcus Herz »

Seh ich das richtig: ::dbAuftrag ist das Ergebnis des SQL Befehls?
- und du machst eine SetFilter. Ich kenne nicht so genau die Klasse von Gottfried, aber es sollte auch eine Setaof() oder so ähnlich geben. SetAof kann optimiert auf dem Server ausgeführt werden, Setfilter wird wohl auf dem Client ausgeführt (Es sei denn, die Klasse macht intern ein SetAof() draus).
- Falls das ein SQL ist, warum ist dann die Filterbedinguing nicht Teil des Where ...
- Du kannst dir ja mal AdsClass Demo runterladen, dort ist ein Beipiel mit ADS Notification dabei. Ich mach das bei vielen Kunden, wenn irgendwo ein Ereignis auftritt, kann konfigurriert werden, wer eine Benachrichtigung erhält. Klappt prima und ist stabil
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Hallo Marcus,
Marcus Herz hat geschrieben: Mi, 26. Jul 2023 17:24 Seh ich das richtig: ::dbAuftrag ist das Ergebnis des SQL Befehls?
- und du machst eine SetFilter. Ich kenne nicht so genau die Klasse von Gottfried, aber es sollte auch eine Setaof() oder so ähnlich geben. SetAof kann optimiert auf dem Server ausgeführt werden, Setfilter wird wohl auf dem Client ausgeführt (Es sei denn, die Klasse macht intern ein SetAof() draus).
- Falls das ein SQL ist, warum ist dann die Filterbedinguing nicht Teil des Where ...
- Du kannst dir ja mal AdsClass Demo runterladen, dort ist ein Beipiel mit ADS Notification dabei. Ich mach das bei vielen Kunden, wenn irgendwo ein Ereignis auftritt, kann konfigurriert werden, wer eine Benachrichtigung erhält. Klappt prima und ist stabil
nein, das stimmt so nicht. Der SQL Befehl hat mit der Programmstelle die ich gepostet habe nichts zu tun.
Er wird an anderer Stelle im Programm ausgeführt, dauert aber bei der Serverlast die durch den/die Filter entsteht deutlich länger, da meines Erachtens nach nicht genügend Rechenleistung vorhanden ist.

Mit Gottfried meinst du wahrscheinlich Friedhelm :D :D
Ich habe den Source von Ihm. Ich schaue mal nach ob es SetAof ist.

Die AdsClass lade ich mir gerne mal runter, danke für die Info.

Apropos ADS: Gibt es in diesem Thema mit SAP eigentlich irgendwas neues ?
Gruß Dominik
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 651
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von nightcrawler »

Dominik Krebs hat geschrieben: Do, 27. Jul 2023 14:55 Apropos ADS: Gibt es in diesem Thema mit SAP eigentlich irgendwas neues ?
nope
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Unglaublich...
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Marcus Herz hat geschrieben: Mi, 26. Jul 2023 17:24 Seh ich das richtig: ::dbAuftrag ist das Ergebnis des SQL Befehls?
- und du machst eine SetFilter. Ich kenne nicht so genau die Klasse von Gottfried, aber es sollte auch eine Setaof() oder so ähnlich geben. SetAof kann optimiert auf dem Server ausgeführt werden, Setfilter wird wohl auf dem Client ausgeführt (Es sei denn, die Klasse macht intern ein SetAof() draus).
- Falls das ein SQL ist, warum ist dann die Filterbedinguing nicht Teil des Where ...
- Du kannst dir ja mal AdsClass Demo runterladen, dort ist ein Beipiel mit ADS Notification dabei. Ich mach das bei vielen Kunden, wenn irgendwo ein Ereignis auftritt, kann konfigurriert werden, wer eine Benachrichtigung erhält. Klappt prima und ist stabil
Also ja, ist bereits SetAOF
Gruß Dominik
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: ADS Last hoch

Beitrag von Marcus Herz »

Mit Gottfried meinst du wahrscheinlich Friedhelm :D :D
Hoffentlich hat Friedhelm das nicht gelesen, entschuldige mich dafür, hab auch lange nichts mehr von ihm gehört
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 200
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: ADS Last hoch

Beitrag von Dominik Krebs »

Ich habe Jahresanfang öfters mal mit Ihm telefoniert. Damals war er wieder mehr in die Firma eingebunden...
Gruß Dominik
Antworten