Dynamics NAV: Wann sollte FIND und wann FINDSET eingesetzt werden?
Ein Diskussionsthema, das ich schon öfters unter C/AL-Programmierern/ Navision-Entwicklern beobachtet habe, war bzw. ist der Einsatz des FINDSET-Befehls.
FINDSET existiert seit Navision 5.0 und wurde eingeführt, um das Lesen von Datensätzen vom SQL Server zu optimieren. Der C/AL-Befehl öffnet einen Stream direkt zum SQL-Server und ließt über diesen die Daten aus. Dadurch ist er schneller als die alten FIND- Befehle, allerdings kann man hierdurch die Datensätze nur vorwärts gewannt durchlaufen, sprich wie der C/AL-Befehl FIND(‚-‚).
IF FIND('-') THEN
REPEAT
// C/AL-Befehle
UNTIL NEXT = 0;
Mit FIND (‚-‚) wird zum ersten Datensatz gesprungen, mit dem NEXT Befehl wird dann zum nächsten Datensatz gesprungen. So durchläuft die REPEAT-UNTIL-Schleife alle Records, bis keiner mehr gefunden wird. FINDSET wird genauso angewendet wie FIND(‚-‚), nur das er im Hintergrund nicht zum ersten Datensatz springen muss, weil er sich beim Stream automatisch dort befindet.
FIND (‚-‚) oder FINDSET?
Die Streitfrage war/ist nun, wann ist welcher Befehl zu nutzen, oder ist etwa FIND(‚-‚) komplett überflüssig geworden?
Viel wurde darüber in Foren und Blogs diskutiert, und manche Entwickler haben sogar Zeiten gemessen, um Klarheit zu verschaffen. Nun liefert uns die aktuelle Online-Hilfe zu Microsoft Dynamics NAV ganz unmissverständlich die Antwort auf diese Frage.
Die Preset Number entscheidet
Da FINDSET nicht weiß viele Datensätze ausgelesen werden, reserviert Microsoft Dynamics NAV sich zunächst Speicher für eine definierte Menge an Datensätzen, der sogenannten Record Set Preset number. Diese beträgt normalerweise 50 Records (bei Navision 5.0 betrug sie noch 500 Datensätze!).
FINDSET arbeitet dann richtig effektiv, wenn die abzurufende Record-Anzahl die der voreingestellten Preset Number nicht übersteigt. Wenn mehr Datensätze abgefragt werden, muss der SQL Server weitere Befehle ausführen, um das Lesen fortführen zu können. Zwar funktioniert der Befehl dann trotzdem, aber nicht mehr so performant.
Anders herum gesagt: Wenn die Anzahl größer als die Preset number ist, dann wählt FIND(‚-‚).
Oder wie die Dynamics NAV Hilfe schreibt:
FIND(‚-‚) is more efficient than FINDSET when there are more records to read than the preset number.
Was ist, wenn man nicht weiß wieviele man erwartet? Das ist eine Abwägungssache, tendenziell würde ich wohl zu FIND(‚-‚) neigen, aber das kommt eben darauf an. Wenn ich weiß, dass ich maximal 10 Datensätze erwarte, dann ist klar, was ich mache.
Preset Number ändern
Ihr könnt die Standard Preset number aber auch ändern. So seit Ihr nicht auf die 50 Records festgenagelt. Dies macht Ihr im Alter Database Fenster über den Record Set- Wert.
Für mehr Infos schaut einfach in die aktuelle Hilfe-Datei von Microsofts Dynamics NAV 2009, die Ihr hier kostenlos herunterladen könnt: Microsoft Dynamics NAV 2009 Developer and IT Pro Help