{"id":268,"date":"2008-06-04T20:36:48","date_gmt":"2008-06-04T18:36:48","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=268"},"modified":"2008-06-04T15:25:45","modified_gmt":"2008-06-04T13:25:45","slug":"sql-fehlermeldung-der-abfrageprozessor-hatte-waehrend-der-abfrageoptimierung-zu-wenig-stapelspeicherplatz-vereinfachen-sie-die-abfrage","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/06\/04\/sql-fehlermeldung-der-abfrageprozessor-hatte-waehrend-der-abfrageoptimierung-zu-wenig-stapelspeicherplatz-vereinfachen-sie-die-abfrage\/","title":{"rendered":"SQL-Fehlermeldung: Der Abfrageprozessor hatte w\u00e4hrend der Abfrageoptimierung zu wenig Stapelspeicherplatz. Vereinfachen Sie die Abfrage."},"content":{"rendered":"<p>Auf einer Datenbank in einem MS-SQL 2005 Server (32bit)\u00a0verursachte ein simpler <em>DETETE FROM tbl&#8230; <\/em>in einem meiner Programme die folgende Fehlemeldung:<\/p>\n<blockquote><p>Der Abfrageprozessor hatte w\u00e4hrend der Abfrageoptimierung zu wenig Stapelspeicherplatz. Vereinfachen Sie die Abfrage.<\/p><\/blockquote>\n<p>Das Ganze war etwas mysteri\u00f6s, und auch in den Newsgroups und im Netz gab es keine vern\u00fcnftige Antwort. Also habe ich kurzerhand eine Supportanfrage an Microsoft gestellt.<\/p>\n<p>Hier in Kurzform die Problematik:<\/p>\n<ul>\n<li>Wir haben eine sehr komplexe Datenstruktur, die der Anwender mit der Hilfe eines Tabellen-Generators selbst manipulieren und definieren kann. Die Folge in einem Fall:<br \/>\nEs gab zu einer Tabelle \u00fcber 400 Fremdschl\u00fcssel.<\/li>\n<li>Besagte Fremdschl\u00fcssel sollten garantieren, dass aus dieser Tabelle, die f\u00fcr Datensatz Klassifikationen verwendet wurde, keine verwendeten Datens\u00e4tze gel\u00f6scht werden k\u00f6nnen.\u00a0<\/li>\n<li>An dem Statement selbst gab es nichts zu optimieren, das war wirklich nur ein einfaches Statement im Stile von <em>DELETE FROM tbl WHERE Id=4711<\/em><\/li>\n<\/ul>\n<p>In Kurzform die Antwort von Microsoft:<\/p>\n<ul>\n<li>Das Problem ist nachvollziehbar.<\/li>\n<li>Das Problem ist hausgemacht und liegt an der Anzahl der Fremdschl\u00fcssel.<\/li>\n<li>Einen Fix bzw. eine \u00c4nderung oder Parameter mit denen man das Verhalten \u00e4ndern, oder erweitern kann, gibt es nicht und ist nicht geplant.<\/li>\n<li>Der Speicherblock, der hier zu klein wird, ist bei einem MS SQL-2005 Server in der 32bit Version 512KB gro\u00df, auf einer 64bit Installation ist besagter Speicherblock viermal so gro\u00df, d.h. 2MB!<br \/>\nDer Fehler tritt auf einem 64bit Server und der gleichen DB-Struktur nicht auf, daf\u00fcr aber sp\u00e4ter \ud83d\ude09 , wenn noch mehr Schl\u00fcssel verwendet werden.<\/li>\n<\/ul>\n<p>Einen kleinen bissigen Kommentar kann ich mir hierzu aber nicht verkneifen, denn ganz blind bin ich in dieses Problem nicht hinein gelaufen \ud83d\ude08<\/p>\n<p>Hier der entsprechende Link zu <a href=\"http:\/\/msdn.microsoft.com\/de-de\/library\/ms143432.aspx\">Spezifikationen der maximalen Kapazit\u00e4t f\u00fcr SQL Server 2005<\/a>, und dort lesen wir folgendes:<\/p>\n<blockquote><p><strong>Verweise auf Fremdschl\u00fcsseltabellen pro Tabelle\u00a0253<\/strong><\/p>\n<p>&#8211; und in der-<\/p>\n<p>Fu\u00dfnote 4:<br \/>\nAuch wenn <strong>eine Tabelle eine unbeschr\u00e4nkte Anzahl von FOREIGN KEY-Beschr\u00e4nkungen enthalten kann<\/strong>, betr\u00e4gt das empfohlene Maximum 253. In Abh\u00e4ngigkeit von der Hardwarekonfiguration, die SQL Server hostet, kann das Angeben weiterer Fremdschl\u00fcssel den Abfrageoptimierer bei der Verarbeitung stark beanspruchen.<\/p><\/blockquote>\n<p>Diese Information deckt sich mit der <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms143432.aspx\">englischen Dokumentation<\/a>.<\/p>\n<p>Meine Interpretation dazu ist die folgende:<br \/>\nEs kann <em>den Abfrageoptimierer stark beanspruchen <\/em>wenn man so einen Konstrukt baut, allerdings war und ist mir das egal. Von mir aus kann die Ausf\u00fchrung Minuten dauern. Der Fall des L\u00f6schens in dieser Tabelle ist die seltene Ausnahme. Das Problem ist hier, dass die Ausf\u00fchrung gar nicht m\u00f6glich ist. Hier steht nicht, dass ich nicht mehr als 253 Schl\u00fcssel verwenden darf! Wenn dem so ist, m\u00fcsste dieser Satz klar umformuliert werden, oder es m\u00fcsste bereits beim Anlegen eines weiteren Fremdschl\u00fcsselverweises eine Fehlermeldung kommen.<br \/>\nDe facto steht hier: <em>&#8222;Auch wenn eine Tabelle eine unbeschr\u00e4nkte Anzahl&#8230;&#8220;<br \/>\n<\/em>Die Operation sollte fehlerfrei durchgef\u00fchrt werden k\u00f6nnen, was aber nicht so ist.<\/p>\n<p>Besagte Supportanfrage wurde geschlossen \u2757<\/p>\n<p>Bleibt noch Abschlie\u00dfendes hinzuzuf\u00fcgen:<\/p>\n<ul>\n<li>Auch der MS-SQL Server 2008 zeigt das gleiche Verhalten.<\/li>\n<li>Man erh\u00e4lt den selben Fehler auch im MS-SQL 2000, dort hei\u00dft er dann<br \/>\n<em>Interner Fehler des Abfrageprozessors: Im Abfrageprozessor wurde bei der Ausf\u00fchrung ein unerwarteter Fehler festgestellt.<\/em><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Auf einer Datenbank in einem MS-SQL 2005 Server (32bit)\u00a0verursachte ein simpler DETETE FROM tbl&#8230; in einem meiner Programme die folgende Fehlemeldung: Der Abfrageprozessor hatte w\u00e4hrend der Abfrageoptimierung zu wenig Stapelspeicherplatz. Vereinfachen Sie die Abfrage. Das Ganze war etwas mysteri\u00f6s, und auch in den Newsgroups und im Netz gab es keine vern\u00fcnftige Antwort. Also habe ich &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/06\/04\/sql-fehlermeldung-der-abfrageprozessor-hatte-waehrend-der-abfrageoptimierung-zu-wenig-stapelspeicherplatz-vereinfachen-sie-die-abfrage\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSQL-Fehlermeldung: Der Abfrageprozessor hatte w\u00e4hrend der Abfrageoptimierung zu wenig Stapelspeicherplatz. Vereinfachen Sie die Abfrage.\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,15],"tags":[359,107],"class_list":["post-268","post","type-post","status-publish","format-standard","hentry","category-programmieren","category-sql","tag-sql","tag-sql-2005"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/268","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=268"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/268\/revisions"}],"predecessor-version":[{"id":340,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/268\/revisions\/340"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=268"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}