Autor Thema: Agent mit vielen Datenbank-Zugriffen - Performance Problem  (Gelesen 4300 mal)

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Hi zusammen,

Ich arbeite aktuell an einer universellen Taskliste für die Nutzer. Dazu soll ein Agent aus einigen Datenbanken Informationen abgreifen, wie viele ToDo's für jeden einzelnen Nutzer vorliegen.

Dazu wird folgender Code genutzt:

Code
	Set doc = dc.GetFirstDocument
	
	While Not doc Is Nothing
		NotesName = doc.NotesName(0)
		Print NotesName
		'Call logAgent.logAction("Zugriff auf DBs für " + NotesName)
		doc.CtAPW = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\VUN\\VUN.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtFremdMAToGo = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\VUN\\VUN.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtBEWERB = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "ESG\\Mail-In\\Bewerber.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtCar = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "IntroProd\\ESGCAR2.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtKantine = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\Kantine\\Kantine_Appl.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtPA = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\PA\\Personal.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtReise = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\Reise\\ReiseSap.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtUSA = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\Überstunden\\Überstundenantrag.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtWB = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\Weiterbildung\\wbildzwfappl.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		doc.CtSWG = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ;  "LNS001DB" : "Workflow\\SoftwareGenehmigung\\Software.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
		
		Call doc.Save (True, False)
		Set doc = dc.Getnextdocument(doc)
	Wend

Der Agent läuft in der selben Datenbank, in der der Code liegt und es gibt ca. 1700 Dokumente (also Nutzer). Es wird dann für jeden Nutezr in die Datenbanken auf eine spezielle Ansicht zugegriffen und für den Nutzer wird die Anzahl der Elemente abgefragt. Die Ansicht in der jeweiligen Datenbank ist schon so konfiguriert, dass dort eine derartige Anfrage genutzt werden kann und die Informationen ansich bekomme ich auch.

Was jetzt mein Problem ist, ist die Performance (wie man sich das vllt denken kann). Starte ich den Agenten auf dem gleichen Server, dauert die Abfrage 2:30 Minuten (variiert natürlich, aber wäre ok). Der Agent soll aber ca. alle 10 Minuten laufen um die Daten stets aktuell zu halten. Daher hat unser Admin die Datenbank inkl. Agent auf einen anderen Server verschoben. Dort dauert die Abfrage aber leider weit über 10 Minuten, da hier über das Netzwerk auf den anderen Server zugegriffen werden muss.

Daher nun zwei Fragen nach Ideen:
  • Kennt jemand eine andere Lösung als mit so einem DBLookup an die gewünschten Infos zu kommen?
  • Mal abgesehen davon, dass die Leitung zwischen den beiden Server langsam sein kann - welche Möglichkeiten habe ich, vom anderen Server aus zu prüfen, warum das so langsam ist?

Vielen Dank für Tipps!

Grüße,
Mathias


Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #1 am: 11.01.12 - 14:37:35 »
Mach nicht 10 Lookups sondern reduzier die Anzahl, indem du mehrere Werte mit Trennzeichen in eine Spalte schreibst und nach dem Lookup trennst du das wieder auf

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #2 am: 11.01.12 - 14:59:48 »
Ich geh aber mit jedem Lookup in eine andere Datenbank. Dann geht das doch nicht oder?

Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #3 am: 11.01.12 - 15:03:22 »
oh richtig, ich hab nur gesehen, dass die ersten beiden Lookups auf die gleiche DB gehen. Da hab ich wohl etwas zu schnell gelesen

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #4 am: 11.01.12 - 16:23:18 »
Evaluate ist in dem Sinn sicher die schlechteste Lösung was Performance angeht...

Da es wohl nur um Anzahl Dokumente geht würde ich folgendes Machen:

In den Zieldatenbanken Ansichten erstellen, die Kategorisiert sind nach Notes- Name und in der zweiten Spalte eine "1" haben, und die Option "Summe".

Dann sieht die Ansicht (Teilweise aufgeklappt) so aus:

\/Heike Herrlich     5
                             1
                             1
                             1
                             1
                             1
>Tido Test          10

Dann würde ich über die Ansicht per NotesViewNavigator gehen und über
getFirstCategory und getNextCategory alle NotesViewEntries holen, die den Kategorien entsprechen und dann eine Liste mit Werten bilden:

Dim myList List as Integer

myList( viewEntry.ColumnValues(0) ) = viewEntry.ColumnValues(1)

Erst dann würde ich die Dokumente durchlaufen und einfach
doc.CtAPW = myList( NotesName ) machen...

Wenn die Anzahl der docs wesentlich geringer ist als die Anzahl der Kategorien in den Ansichten, dann würde ich ggf. anstatt die Liste zu bilden direkt über NotesViewEntry.GetDocumentByKey( ) oder über NotesView.CreateViewNavFromCategory() den Eintrag holen...

Das sollte von der Performance wesentlich besser sein...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #5 am: 12.01.12 - 07:26:49 »
... mit NotesView.GetAllDocumentsByKey(NotesName , True) erhälst du eine Collection und hast dann mit Collection.Count die Anzahl der gefundenen Dokumnente - das wäre ein weiterer Weg...

Toni
Grüßle Toni :)

Offline it898ur

  • Senior Mitglied
  • ****
  • Beiträge: 478
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #6 am: 12.01.12 - 08:45:46 »
Hallo,

ich denke das Evaluate ist gar nicht das Problem, da Formelcode sehr effizient und schnell ist. Das Problem ist eher das "NoCache", was dazu führt, dass bei jedem Zugriff, d. h. für jeden User, die Ansicht aktualisiert wird.

Hier würde vielleicht schon eine Umstellung auf "ReCache" oder ein erstmaliges Refreshen der Ansichten , gefolgt von einem Lookup mit Cache die Abfrage drastisch beschleunigen.

Gruß

André

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #7 am: 12.01.12 - 09:04:43 »
Der Zugriff erfolgt auf unterschiedliche Datenbanken - das hilft hier nur einmal, bei den beiden ersten Zugriffen...
Grüßle Toni :)

Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #8 am: 12.01.12 - 09:20:18 »
Es werden allerdings 1700Lookups pro Datenbank gemacht. Dann sollte "Cache" doch was bringen, oder?

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #9 am: 12.01.12 - 09:25:39 »
@ Andre: Danke für den Tipp, ich habs sowohl mit ReCache, mit "" als auch mit NoCache probiert ohne einen merklichen Unterschied. Also das scheint leider nichts zu bringen.

@Toni: Danke! Probier ich mal aus.

@Torsten: Danke! Auch das probier ich mal aus.

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #10 am: 12.01.12 - 09:25:52 »
Hi

Ich würde jetzt probieren, ob das ersetzen der Evaluates etwas bringt.
Zuerst die 10 Ansichten in LS initialisieren ( vor dem Loop) und dann mit mit dem Tipp von Tode weitermachen.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #11 am: 12.01.12 - 10:17:55 »
So erste Tests gemacht, erstmal mit der Lösung von Toni. Jetzige Dauer: 17 Sekunden (zweiter Lauf: 26 Sekunden)

Ich würde mal sagen, das ist doch eine deutliche Verbesserung :)

Ich teste noch etwas, aber das scheint mir auf jeden Fall der richtige Weg:

Code
	Set viewAPW = dbAPW.GetView("MyActivities")
	Set viewFremdMA = dbAPW.GetView("MyLeavingFremdMA")
	Set vieweUAN = dbeUAN.GetView("MyActivities")
	Set viewCar = dbCar.GetView("MyActivities")
	Set viewKantine = dbKantine.GetView("MyActivities")
	Set viewPA = dbPA.GetView("MyActivities")
	Set viewReise = dbReise.GetView("MyActivities")
	Set viewUSA = dbUSA.GetView("MyActivities")
	Set viewWB = dbWB.GetView("MyActivities")
	Set viewSWG = dbSWG.GetView("MyActivities")
		
	'Soll die Standardwerte in den Dokumente aktualisieren um für jeden User die offenen Tasks berechnen zu können
	Set doc = dc.GetFirstDocument
	While Not doc Is Nothing
		NotesName = doc.NotesName(0)
		doc.CtAPW = viewAPW.GetAllDocumentsByKey(NotesName).Count
		doc.CtFremdMAToGo = viewAPW.GetAllDocumentsByKey(NotesName).Count
		doc.CteUAN = vieweUAN.GetAllDocumentsByKey(NotesName).Count
		doc.CtCar = viewCar.GetAllDocumentsByKey(NotesName).Count
		doc.CtKantine = viewKantine.GetAllDocumentsByKey(NotesName).Count
		doc.CtPA = viewPA.GetAllDocumentsByKey(NotesName).Count
		doc.CtReise = viewReise.GetAllDocumentsByKey(NotesName).Count
		doc.CtUSA = viewUSA.GetAllDocumentsByKey(NotesName).Count
		doc.CtWB = viewWB.GetAllDocumentsByKey(NotesName).Count		
		doc.CtSWG = viewSWG.GetAllDocumentsByKey(NotesName).Count
	
		Call doc.Save (True, False)
		Set doc = dc.Getnextdocument(doc)
	Wend

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #12 am: 12.01.12 - 10:33:33 »
... vielleicht gehts mit der Variante getAllEntriesByKey noch etwas schneller, wenn die Ansicht entsprechend aufgebaut ist ?

Es dürfen dann keine zusätzlichen Kategorien unterhalb der ersten Kategorie stehen.
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #13 am: 12.01.12 - 11:05:38 »
@Marco: Ja das ist auch noch recht performant, dauert ungefähr immer so 22-28 Sekunden

Die andere Variante liegt aber immer um ein paar wenige Sekunden darunter. Trotzdem danke! :)

Offline DaHias

  • Aktives Mitglied
  • ***
  • Beiträge: 132
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #14 am: 12.01.12 - 12:32:07 »
So, Agent läuft jetzt periodisch alle 10 Minuten auf dem produktiven Server und benötigt ca. 1-2 Sekunden

Ein besseres Ergebnis kann man nun wirklich nicht erwarten!

Vielen Dank für die Unterstützung, die Lösung aus meinem vorletzten Post hat das Problem gelöst

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Agent mit vielen Datenbank-Zugriffen - Performance Problem
« Antwort #15 am: 12.01.12 - 15:42:27 »
.... dann bin ich ja beruhigt ...  ;)
Grüßle Toni :)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz