Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: koehlerbv am 20.12.04 - 16:48:34

Titel: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 20.12.04 - 16:48:34
Komischerweise habe ich mir über dieses Problem noch nie Gedanken gemacht, aber jetzt spielt es eine zeitkritische Rolle:

Ich benötige eine Übersicht über die Namen aller Folder in einer Datenbank. Das Standardverfahren via NotesDatabase.Views und anschliessendem Filtern über NotesView.IsFolder ist im gegebenen Szenario performancemässig untragbar.
Verwende ich Damien Katz's DBDesign Class, kann ich das Procedere schon mal um den Faktor 3 beschleunigen.

Frage: Geht das auch noch schneller ? Beim standardmässigen Öffnen einer DB im Client sind die Folder-Informationen ja auch "sofort" parat. Vielleicht habe ich ja auch nur ein Brett vor'm Kopf ...

Danke im Voraus,
Bernhard
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: Semeaphoros am 20.12.04 - 16:54:32
Naja, der Client greift ja schliesslich via API zu und da ist schonmal mindestens ein Faktor 10 gegenüber LS zu verzeichnen.

Schlechte Karten, ausser mit einer DLL - schätze ich mal.
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: TMC am 20.12.04 - 16:58:46
Bernhard, hast Du es mal mit der NotesNoteCollection-Klasse getestet?

Ich habe keine Ahnung wie das performance-seitig aussieht, aber könnte schnell sein.
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: TMC am 20.12.04 - 17:03:02
2. Idee:
Eine View für Folder.
Also View Selection glaub ich wäre SELECT @Contains($Flags; "F")
Der Name und Alias des Folders steht dann glaub ich im Item $Title.
Weiß aber auch nicht ob das schneller ist.
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: eknori am 20.12.04 - 17:24:34
hier noch etwas in die Richtung, die Matthias vorgeschlagen hat. http://www.dominopower.com/issuesprint/issue199908/design.html
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 20.12.04 - 17:39:50
Merci beaucoup, Jens und Matthias und Ulrich. Ich bin dran an Matthias' Tip mit der NotesNoteCollection, aber bisher sieht es schlechter aus als bei dem API-Verfahren von Damien Katz.

Bernhard
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 20.12.04 - 18:19:51
Jo, ich habe jetzt mal ein wenig getestet mit der NotesNoteCollection. Keine Ahnung, warum ich die nicht eher in Betracht gezogen habe. Das Brett ?

Quick and dirty habe ich mal zum Testen folgendes zusammengeschustert:

Code
	
	Dim session As New NotesSession
	Dim dbMail As New NotesDatabase ("", "")
	Dim nc As NotesNoteCollection
	Dim szNoteID As String
	Dim docDesign As NotesDocument
	Dim iLoop As Integer
	Dim szMessage As String
	
	Dim vStartTime As Variant
	Dim vEndTime As Variant
	
	Call dbMail.OpenMail
	
	vStartTime = Now
	Set nc = dbMail.CreateNoteCollection (False)
	Call nc.SelectAllIndexElements (True)
	nc.SelectFolders = True
	Call nc.BuildCollection
	
	szNoteID = nc.GetFirstNoteId
	For iLoop = 1 To nc.Count
		Set docDesign = dbMail.GetDocumentByID (szNoteID)
		If Instr (docDesign.~$Flags (0), "F") > 0 Then
			szMessage = szMessage & docDesign.~$Title (0) & Chr$ (10)
		End If
		
		szNoteID = nc.GetNextNoteId (szNoteID)
	Next
	
	vEndTime = Now
	Msgbox "Elapsed time: " & Cdat (vEndTime - vStartTime) & " to retrieve " & Cstr (nc.Count) & " elements."
	
	Messagebox szMessage,, "Gefundene Folder"
	

Ich komme jetzt auf Werte, die etwas besser als mit API / Damien Katz' DBDesign Class sind. Hauptsächlich geschuldet ist dies der Tatsache, dass
   nc.SelectFolders = True
   Call nc.BuildCollection
entgegen der Benamsung doch nicht nur Folder zurückgibt, sondern auch Ansichten. Der erste Massage-Kiste im Code gibt daher auch einen Wert aus, der nicht mit der dann angezeigten Anzahl an Folders übereinstimmt.

Ich werde mit also die bereits funktionierende Variante (API) aufheben (wegen der R5-Kompatibilität) und jetzt mal schauen, ob ich das mit der NotesNoteCollection noch verfeinern kann.

Wegen der View mit Design-Elementen: Das kann ich partout nicht einsetzen, da ich von DB A auf beliebige DB B oder C oder ... zugreife und dort das Design nicht beeinflussen kann / will.

Jede weitere Idee ist herzlich willkommen (API ?) ! Und ich werde posten, wenn ich noch eine signifikante Performanceverbesserung hinbekomme.

Bernhard
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: eknori am 20.12.04 - 18:27:17
API habe ich abgecheckt:
in C++ gibt es ein LNDatabase::GetFolder.

C++ ist aber nur der wrapper der C API. Daher müsste man alle Befehle des GetFolder wieder aufdrösels; mit LS wrappen und  .. landet wieder bei Damien Katz' Lösung.

Also von daher sehe ich keine weiter Verbesserungsmöglichkeit.

Ausser, man bildet das als DLL ab.
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: TMC am 20.12.04 - 18:40:39
Evtl. kann man im oben geposteten Script noch andere Schleifen testen.
In der BP-Schleifenkunde wird in einem der letzen Kapitel auf Performance-Tests verwiesen.
Zumindest ein paar Millisekunden könnten drin sein  ;)

Ansonsten:

Vielleicht kann man mit den Methoden der NotesNoteCollection - Klasse noch was optimieren.

Ohne mir das jetzt die Klasse im Detail angesehen zu haben (ehrlich gesagt weiß ich jetzt nicht genau, was SelectAllIndexElements macht):
Zitat
Call nc.SelectAllIndexElements (True)
nc.SelectFolders = True
Call nc.BuildCollection
Wie groß ist da die Collection? Sind da nur noch Folders drin oder alle Designelemente?

Falls alle Designelemente:
Ich machte bisher immer die Auswahl mit 'SelectAllDesignElements'.
Evtl. kann man dann nach und nach den Rest rauswerfen (also z.B. nc.SelectAllFormatElements = False, nc.SelectNavigators = False usw.).
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: Semeaphoros am 20.12.04 - 19:04:45
Also von daher sehe ich keine weiter Verbesserungsmöglichkeit.

Ausser, man bildet das als DLL ab.

Das war, was ich von anfang an befürchtete
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 20.12.04 - 19:08:05
Jo, Matthias, Du hast mir da ein wichtiges Stichwort geliefert.

Ich erreiche nochmals eine Performanceverbesserung von 25% und eine Halbierung der übertragenen Datenmenge, wenn ich die NotesNoteCollection auch korrekt verwende (wie vorhin schon gesagt: Der erste Entwurf war ausdrücklich "quick and dirty" zur Abschätzung der Dimensionen):

Code
	Set nc = dbMail.CreateNoteCollection (False)
	nc.SelectFolders = True
	Call nc.BuildCollection

Dann habe ich (logischerweise) wirklich nur noch die Folders drin.

Hier mal ein paar Zahlen, um die Verfahren besser zu verstehen (ich habe sado-mado-mässig meinem Domino-Server auch eine 22 MBit-WLAN-Karte spendiert, um in meiner Entwicklungsarbeit auch langsame Reaktions- und Übertragungszeiten "simulieren" zu können):

NotesDatabase.Views und Zugriff auf meine Mail-DB: 1,4 MB, 17 Sekunden (incl. Ausfiltern der Views)

Damien Katz' DBDesign: 1,3 MB, 5 Sekunden

NotesNoteCollection: 0,7 MB, 3..4 Sekunden.

Ergo: Wenn es nicht auf R5-Kompatibilität ankommt, ist man mit der NoteDocumentCollection bestens bedient.

@Ulrich: Danke für Deine Bestätigung, dass sich mit der C++-API die Katze letztlich doch wieder in den Schwanz beisst. Dies bestätigte meine Ahnung.

Bernhard
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: eknori am 20.12.04 - 19:08:35
Bernhard: von wie vielen Ordnern ist eigentlich die Rede ?
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 20.12.04 - 19:23:32
Im wahrsten Sinne des Wortes: "Keine Ahnung", Ulrich. Ich kann vorab nicht bestimmen, auf was für DBs bzw. "ordnungswütige" Leute ich da treffe.
In meiner Test-DB sind es 31 Ordner in einer 200 MB-Datei.

Bernhard
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: magic_halli am 13.02.09 - 11:56:39
Hi,

Zitat
Das Standardverfahren via NotesDatabase.Views und anschliessendem Filtern über NotesView.IsFolder ist im gegebenen Szenario performancemässig untragbar.

Das Thema Folderzugriff hat mich auch längere Zeit beschäftigt! Die allseits verbreitete Variante über Views hat mich übers WAN bald WAN-sinnig gemacht!  ;)

@Bernhard
Cool, dass Du das mal so ausführlich getestet hast! Bin (leider) erst jetzt und nicht schon früher auf diesen Post gestoßen...
Ich hab die "Foldersearch" bei mir implementiert und eine hammergeile Performancesteigerung um Faktor 20, was Zeit und Datenmenge angeht, erziehlt!!!  8)

Damit kann ich ab jetzt prima leben.

Daumen hoch für diesen Post!!!


Gruß

Rico.


PS: Sollte diese Thema nicht irgenwo schön sichtbar gepinnt werden?!
Titel: Re: Schneller(er) Zugriff auf Folder möglich ?
Beitrag von: koehlerbv am 13.02.09 - 12:01:53
Dieses Thread (http://atnotes.de/index.php/topic,42082.0.html) hast Du auch gefunden?

Bernhard