{"id":311,"date":"2007-06-03T11:28:10","date_gmt":"2007-06-03T09:28:10","guid":{"rendered":"http:\/\/www.navision-blog.de\/2007\/06\/03\/navision-performance-optimierung-auf-dem-sql-server\/"},"modified":"2011-11-04T08:18:33","modified_gmt":"2011-11-04T08:18:33","slug":"navision-performance-optimierung-auf-dem-sql-server","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2007\/06\/03\/navision-performance-optimierung-auf-dem-sql-server\/","title":{"rendered":"Navision Performance-Optimierung auf dem SQL-Server"},"content":{"rendered":"<p>Seit Microsoft das SP1 f&#252;r Dynamics Nav 4 heraus gebracht hat, gibt es neue C\/AL-Befehle zur schnelleren SQL-Server-Abfrage. Da immer wieder Fragen dazu auftauchen, hier eine kleine Zusammenfassung.<\/p>\n<p><!--more--><\/p>\n<h5>ISEMPTY<\/h5>\n<p>Diesen Befehl\u00a0existiert zwar schon l&#228;nger, wird immer noch nicht durchg&#228;ngig verwendet. Man benutzt ISEMPTY um heraus zu finden, ob die gefilterte Menge einen Datensatz enth&#228;lt. Die Funktion liefert dabei nur TRUE oder FALSE zur&#252;ck. Das hei&#223;t selbst wenn ein Datensatz gefunden wurde, wird dieser nicht in den entsprechenden Record kopiert.<\/p>\n<p><script src=\"https:\/\/gist.github.com\/1338894.js?file=gistfile1.pas\"><\/script><\/p>\n<h5>FINDFIRST<\/h5>\n<p>FINDFIRST wird verwendet, wenn man explizit nur mit dem ersten Datensatz der gefilterten Menge arbeiten m&#246;chte. Durch die Angabe dieser Information\u00a0braucht der SQL-Server nur einen ServerTrip und kann so einige Roundtrips sparen.<\/p>\n<p><script src=\"https:\/\/gist.github.com\/1338900.js?file=gistfile1.pas\"><\/script><\/p>\n<h5>FINDLAST<\/h5>\n<p>FINDLAST verh&#228;lt sich analog zu zu FINDFIRST &#8211; mit dem Unterschied, dass hier der letzte Datensatz der gefilterten Menge zur&#252;ck gegeben wird.<\/p>\n<p><script src=\"https:\/\/gist.github.com\/1338903.js?file=gistfile1.pas\"><\/script><\/p>\n<h5>FINDSET([ForUpdate][, UpdateKey])<\/h5>\n<p>FINDSET wird immer dann benutzt, wenn man mit der gesamten gefilterten Menge <em>in aufsteigender Ordnung<\/em> arbeiten m&#246;chte.<\/p>\n<p>Die Standardwerte f&#252;r die Parameter ForUpdate und UpdateKey sind FALSE. Wenn man also keine Daten &#228;ndern m&#246;chte, dann benutzt man FINDSET auf folgende Weise:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/1338905.js?file=gistfile1.pas\"><\/script><\/p>\n<p>Hierzu wird kein Datenbank-Cursor ben&#246;tigt.<br \/>\nM&#246;chte man Daten &#228;ndern, so sollte man ForUpdate auf TRUE setzen. Dann wird zwar ein dynamischer Cursor verwendet, aber eben nur dann.<\/p>\n<p><script src=\"https:\/\/gist.github.com\/1338906.js?file=gistfile1.pas\"><\/script><\/p>\n<p>Hierzu wird ein &#8220;dynamic\u00a0cursor&#8221; angelegt. Und die Tabelle sofort gesperrt.<br \/>\nM&#246;chte man sogar Schl&#252;sselfelder &#228;ndern, sollte FINDSET(TRUE,TRUE) benutzt werden.<\/p>\n<h5>Schlu&#223;folgerung<\/h5>\n<p>Man sollte sich auf jeden Fall etwas Zeit nehmen und <strong>alle<\/strong> Find(Which)-Anweisungen der eigenen\u00a0Software gegen die 4 &#8220;neuen&#8221; Befehle austauschen. Das wird die Performance der Anwendung in vielen F&#228;llen drastisch erh&#246;hen &#8211; zumindest an den Stellen, wo der dynamische Cursor weggelassen werden kann.<\/p>\n<p>Weitere Informationen:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.msdynamics.de\/viewtopic.php?p=12588#12588\" target=\"_blank\">Optimizing Dynamics NAV on SQL-Server<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Seit Microsoft das SP1 f&#252;r Dynamics Nav 4 heraus gebracht hat, gibt es neue C\/AL-Befehle zur schnelleren SQL-Server-Abfrage. Da immer wieder Fragen dazu auftauchen, hier eine kleine Zusammenfassung.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[31,5,16],"tags":[148,52,72,635,150,149,644],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/311"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=311"}],"version-history":[{"count":5,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/311\/revisions"}],"predecessor-version":[{"id":1103,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/311\/revisions\/1103"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}