<?xml version="1.0" encoding="utf-8"?><!-- generator="b2evolution/6.11.7-stable" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Uwe Ricken - Kategorie: "Level 300"</title>
		<link>https://www.insidesql.org/blogs/uricken/</link>
		<atom:link rel="self" type="application/rss+xml" href="https://www.insidesql.org/blogs/uricken/?tempskin=_rss2" />
		<description>InsideSQL.org Blogs - Blogs über SQL Server</description>
		<language>de-DE</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=6.11.7-stable"/>
		<ttl>60</ttl>
				<item>
			<title>Verwendung von Variablen statt Literalen</title>
			<link>https://www.insidesql.org/blogs/uricken/2014/07/20/verwendung-von-variablen-statt-literalen</link>
			<pubDate>Sun, 20 Jul 2014 16:18:00 +0000</pubDate>			<dc:creator>Uwe Ricken</dc:creator>
			<category domain="alt">Tipps und Tricks</category>
<category domain="alt">Optimierung / Performance</category>
<category domain="main">Level 300</category>			<guid isPermaLink="false">3701@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://db-berater.blogspot.de/2014/07/verwendung-von-variablen-statt-literalen.html&quot;&gt;http://db-berater.blogspot.de/2014/07/verwendung-von-variablen-statt-literalen.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Im Forum eines von mir sehr geschätzten MVP-Kollegen wurde eine Frage bezüglich der Verwendung von Variablen anstelle von Literalen gestellt (&lt;a href=&quot;http://www.donkarl.com/forum/forums/thread-view.asp?tid=1088&amp;amp;mid=3107#M3107&quot; target=&quot;_blank&quot;&gt;hier&lt;/a&gt;). Das Problem war, dass die Abfrage sich deutlich verlangsamte, wenn Variablen statt Literale verwendet wurden. Warum dieses Verhalten für Microsoft SQL Server jedoch korrekt ist, soll der folgende Artikel zeigen.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;a href=&quot;https://www.insidesql.org/blogs/uricken/2014/07/20/verwendung-von-variablen-statt-literalen#more3701&quot;&gt;Ganze Geschichte &amp;raquo;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://db-berater.blogspot.de/2014/07/verwendung-von-variablen-statt-literalen.html">http://db-berater.blogspot.de/2014/07/verwendung-von-variablen-statt-literalen.html</a></p><p>Im Forum eines von mir sehr geschätzten MVP-Kollegen wurde eine Frage bezüglich der Verwendung von Variablen anstelle von Literalen gestellt (<a href="http://www.donkarl.com/forum/forums/thread-view.asp?tid=1088&amp;mid=3107#M3107" target="_blank">hier</a>). Das Problem war, dass die Abfrage sich deutlich verlangsamte, wenn Variablen statt Literale verwendet wurden. Warum dieses Verhalten für Microsoft SQL Server jedoch korrekt ist, soll der folgende Artikel zeigen.</p>
<p></p><a href="https://www.insidesql.org/blogs/uricken/2014/07/20/verwendung-von-variablen-statt-literalen#more3701">Ganze Geschichte &raquo;</a>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/uricken/2014/07/20/verwendung-von-variablen-statt-literalen#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3701</wfw:commentRss>
		</item>
				<item>
			<title>Warum korrekte Datentypen für WHERE-Klauseln wichtig sind</title>
			<link>https://www.insidesql.org/blogs/uricken/2014/05/25/warum-korrekte-datentypen-fuer-where</link>
			<pubDate>Sun, 25 May 2014 15:38:00 +0000</pubDate>			<dc:creator>Uwe Ricken</dc:creator>
			<category domain="alt">Tipps und Tricks</category>
<category domain="main">Optimierung / Performance</category>
<category domain="alt">Level 300</category>			<guid isPermaLink="false">3686@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://db-berater.blogspot.de/2014/05/warum-korrekte-datentypen-fur-where.html&quot;&gt;http://db-berater.blogspot.de/2014/05/warum-korrekte-datentypen-fur-where.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In einer Anfrage in den Microsoft Foren (&lt;a href=&quot;http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4ba53981-dc00-41ef-93a7-f6006c966ae2/sp-reads?forum=sqldatabaseengine&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt;) ging es darum, warum Microsoft SQL Server trotz einer SEEK-Operation alle Datenseiten einer Tabelle durchsucht hat. Tatsächlich kann eine SEEK-Operation die vollständige Tabelle betreffen, wenn bestimmte Voraussetzungen nicht erfüllt sind. Wie wichtig zum Beispiel die korrekte Verwendung von Datentypen bei Einschränkungen sind, zeigt der nachfolgende Artikel.&lt;/p&gt;&lt;a href=&quot;https://www.insidesql.org/blogs/uricken/2014/05/25/warum-korrekte-datentypen-fuer-where#more3686&quot;&gt;Ganze Geschichte &amp;raquo;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://db-berater.blogspot.de/2014/05/warum-korrekte-datentypen-fur-where.html">http://db-berater.blogspot.de/2014/05/warum-korrekte-datentypen-fur-where.html</a></p><p>In einer Anfrage in den Microsoft Foren (<a href="http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4ba53981-dc00-41ef-93a7-f6006c966ae2/sp-reads?forum=sqldatabaseengine" target="_blank">link</a>) ging es darum, warum Microsoft SQL Server trotz einer SEEK-Operation alle Datenseiten einer Tabelle durchsucht hat. Tatsächlich kann eine SEEK-Operation die vollständige Tabelle betreffen, wenn bestimmte Voraussetzungen nicht erfüllt sind. Wie wichtig zum Beispiel die korrekte Verwendung von Datentypen bei Einschränkungen sind, zeigt der nachfolgende Artikel.</p><a href="https://www.insidesql.org/blogs/uricken/2014/05/25/warum-korrekte-datentypen-fuer-where#more3686">Ganze Geschichte &raquo;</a>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/uricken/2014/05/25/warum-korrekte-datentypen-fuer-where#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3686</wfw:commentRss>
		</item>
				<item>
			<title>Löschen von Daten aus Heap gibt Datenseiten nicht frei</title>
			<link>https://www.insidesql.org/blogs/uricken/2014/04/07/loeschen-von-daten-aus-heap</link>
			<pubDate>Mon, 07 Apr 2014 18:29:00 +0000</pubDate>			<dc:creator>Uwe Ricken</dc:creator>
			<category domain="alt">Tipps und Tricks</category>
<category domain="alt">Level 300</category>
<category domain="main">Storage Engine</category>			<guid isPermaLink="false">3668@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://db-berater.blogspot.de/2014/04/loschen-von-daten-aus-heap-gibt.html&quot;&gt;http://db-berater.blogspot.de/2014/04/loschen-von-daten-aus-heap-gibt.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Wenn alle Datensätze aus einem Heap gelöscht werden, mag man meinen, dass Microsoft SQL Server nach dem Löschvorgang auch die allozierten Datenseiten wieder frei gibt. Das macht der Microsoft SQL Server jedoch nur, wenn bestimmte Voraussetzungen vorhanden sind wie der nachfolgende Artikel zeigt.&lt;/p&gt;
&lt;div id=&quot;extendedEntryBreak&quot;&gt;&lt;/div&gt;&lt;a href=&quot;https://www.insidesql.org/blogs/uricken/2014/04/07/loeschen-von-daten-aus-heap#more3668&quot;&gt;Ganze Geschichte &amp;raquo;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://db-berater.blogspot.de/2014/04/loschen-von-daten-aus-heap-gibt.html">http://db-berater.blogspot.de/2014/04/loschen-von-daten-aus-heap-gibt.html</a></p><p>Wenn alle Datensätze aus einem Heap gelöscht werden, mag man meinen, dass Microsoft SQL Server nach dem Löschvorgang auch die allozierten Datenseiten wieder frei gibt. Das macht der Microsoft SQL Server jedoch nur, wenn bestimmte Voraussetzungen vorhanden sind wie der nachfolgende Artikel zeigt.</p>
<div id="extendedEntryBreak"></div><a href="https://www.insidesql.org/blogs/uricken/2014/04/07/loeschen-von-daten-aus-heap#more3668">Ganze Geschichte &raquo;</a>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/uricken/2014/04/07/loeschen-von-daten-aus-heap#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3668</wfw:commentRss>
		</item>
				<item>
			<title>Wie Fremdschlüssel-Einschränkungen Ausführungspläne beeinflussen</title>
			<link>https://www.insidesql.org/blogs/uricken/2013/12/06/wie-fremdschluessel-einschraenkungen-ausfuehrungsplaene-beeinflussen</link>
			<pubDate>Fri, 06 Dec 2013 10:31:00 +0000</pubDate>			<dc:creator>Uwe Ricken</dc:creator>
			<category domain="alt">Tipps und Tricks</category>
<category domain="alt">Optimierung / Performance</category>
<category domain="main">Level 300</category>			<guid isPermaLink="false">3617@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://db-berater.blogspot.de/2013/12/wie-fremdschlussel-einschrankungen.html&quot;&gt;http://db-berater.blogspot.de/2013/12/wie-fremdschlussel-einschrankungen.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Für viele Kollegen und Freunde, mit denen ich über Fremdschlüssel und deren Bedeutung für Datenbanken spreche, steht im Vordergrund, dass ein Fremdschlüssel sicherstellt, nur Werte aus einer referenzierten Tabelle zuzulassen. Diese Aussage ist nur bedingt richtig – vielmehr spielt eine Fremdschlüsselbeziehung auch bei Abfragen eine wichtige Rolle, wenn der Abfrage Optimierer seine Arbeit verrichtet.&lt;/p&gt;
&lt;h1&gt;Was ist eine Fremdschlüssel-Einschränkung?&lt;/h1&gt;
&lt;p&gt;Unter einer Fremdschlüssel-Einschränkung (Foreign Key Constraint) versteht man eine Kombination von Attributen in einer Tabelle, mit deren Hilfe eine Verknüpfung zwischen den Daten zweier Tabellen erzwungen wird. In einem sogenannten Fremdschlüsselverweis besteht zwischen zwei Tabellen eine Verknüpfung, wenn eine oder mehrere Attribute einer Tabelle (Detailtabelle) auf ein oder mehrere Attribute einer anderen Tabelle (Mastertabelle) verweisen.&lt;/p&gt;
&lt;p&gt;Klassische Fremdschlüsselbeziehungen sind z. B. in einem Auftragssystem zu finden, in dem zu Auftragsdetails (Detailtabelle) immer ein Auftragskopf (Mastertabelle) enthalten sein muss. In einer solchen Konstruktion wird das Primärattribut der Mastertabelle (z. B. Auftrag_Id) zum Fremdschlüssel in der Detailtabelle. Neben der erwähnten Durchsetzung von Datenintegritätsregeln kann aber Microsoft SQL Server Fremdschlüssel auch ideal für die Optimierung von Abfragen verwenden, wie die nachfolgende Demonstration zeigt.&lt;/p&gt;
&lt;h1&gt;Testumgebung für Demonstration&lt;/h1&gt;
&lt;p&gt;Welche Einflüsse eine Fremdschlüssel-Einschränkung auf die Ausführung von Abfragen haben kann, soll mit dem folgenden Datenmodell demonstriert werden (SQL Server 2012).&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/Datenmodell_01.png?mtime=1386325823&quot;&gt;&lt;img src=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/Datenmodell_01.png?mtime=1386325823&quot; alt=&quot;&quot; width=&quot;547&quot; height=&quot;494&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Zu verschiedenen Projekten ([dbo].[Projects]) gibt es eine Vielzahl von Projektmitgliedern ([dbo].[ProjectMembers]). Beide Tabellen stehen in einer 1:n-Abhängigkeit zueinander. Damit in die Tabelle [dbo].[ProjectMembers] keine Projektnummern eingetragen werden können, die nicht in [dbo].[Projects] existieren, wird eine Fremdschlüssel-Beziehung zwischen beiden Tabellen implementiert. Gleiches gilt für die Tabelle [dbo].[Employees]. Das anschließende T-SQL-Script erzeugt die oben beschriebene Struktur.&lt;/p&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;-- Mitarbeiter&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;TABLE&lt;/span&gt; dbo.Employees&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;(&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    Id         &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;IDENTITY&lt;/span&gt; (1, 1),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    FirstName  &lt;span style=&quot;color: #0000ff;&quot;&gt;varchar&lt;/span&gt;(64) &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    LastName   &lt;span style=&quot;color: #0000ff;&quot;&gt;varchar&lt;/span&gt;(64) &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    HiredAt    &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    FiredAt    &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; pk_Employees_Id &lt;span style=&quot;color: #0000ff;&quot;&gt;PRIMARY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;CLUSTERED&lt;/span&gt; (Id)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;-- Projekte&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;TABLE&lt;/span&gt; dbo.Projects&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;(&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    Id             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;IDENTITY&lt;/span&gt;(1, 1),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    ProjectName    &lt;span style=&quot;color: #0000ff;&quot;&gt;varchar&lt;/span&gt;(64) &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    ProjectStart   &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULl&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;DEFAULT&lt;/span&gt; (getdate()),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    ProjectFinish  &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    ProjectLead    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; pk_Projects_Id &lt;span style=&quot;color: #0000ff;&quot;&gt;PRIMARY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;CLUSTERED&lt;/span&gt; (Id),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; fk_Projects_ProjectLead &lt;span style=&quot;color: #0000ff;&quot;&gt;FOREIGN&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; (ProjectLead)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;REFERENCES&lt;/span&gt; dbo.Employees (Id)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;-- Projektmitarbeiter&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;TABLE&lt;/span&gt; dbo.ProjectMembers&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;(&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    Project_Id  &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    Employee_Id &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    StartDate   &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    FinishDate  &lt;span style=&quot;color: #0000ff;&quot;&gt;date&lt;/span&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; pk_ProjectMembers &lt;span style=&quot;color: #0000ff;&quot;&gt;PRIMARY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;CLUSTERED&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    (&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;        Project_Id,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;        Employee_Id&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    ),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; fk_ProjectMembers_Project_Id &lt;span style=&quot;color: #0000ff;&quot;&gt;FOREIGN&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; (Project_Id)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;REFERENCES&lt;/span&gt; dbo.Projects (Id),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; fk_ProjectMembers_Employee_Id &lt;span style=&quot;color: #0000ff;&quot;&gt;FOREIGN&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;KEY&lt;/span&gt; (Employee_Id)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;REFERENCES&lt;/span&gt; dbo.Employees (Id)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;h1&gt;Demonstration&lt;/h1&gt;
&lt;p&gt;Der Ausführungsplan der folgenden Abfrage zeigt, wie “optimal” Microsoft SQL Server Ermittlung von geeigneten Ausführungsplänen vorgeht:&lt;/p&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;SELECT&lt;/span&gt;  p.Id,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;        p.ProjectName,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;        p.ProjectStart      &lt;span style=&quot;color: #0000ff;&quot;&gt;AS&lt;/span&gt;    Project_StartDate,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;        p.ProjectFinish     &lt;span style=&quot;color: #0000ff;&quot;&gt;AS&lt;/span&gt;    Project_Finish,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;        pm.StartDate        &lt;span style=&quot;color: #0000ff;&quot;&gt;AS&lt;/span&gt;    Employee_StartDate,&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;        pm.FinishDate       &lt;span style=&quot;color: #0000ff;&quot;&gt;AS&lt;/span&gt;    Employee_FinishDate&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;FROM&lt;/span&gt;    dbo.Projects p &lt;span style=&quot;color: #0000ff;&quot;&gt;INNER&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;JOIN&lt;/span&gt; dbo.ProjectMembers pm&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;ON&lt;/span&gt; (p.Id = pm.Project_Id) &lt;span style=&quot;color: #0000ff;&quot;&gt;INNER&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;JOIN&lt;/span&gt; dbo.Employees e&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;ON&lt;/span&gt; (pm.Employee_Id = e.Id);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;p&gt;Die Abfrage ermittelt neben den Projektdaten (Name, Start und Ende) ebenfalls die Start- und Endzeiten für die einzelnen Mitarbeiter. Die Abfrage selbst verwendet alle drei Tabellen, die in einer unmittelbaren Abhängigkeit zueinander stehen. Der Ausführungsplan für diese Abfrage gestaltet sich aber überraschender Weise wie folgt:&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_01.png?mtime=1386325830&quot;&gt;&lt;img src=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_01.png?mtime=1386325830&quot; alt=&quot;&quot; width=&quot;573&quot; height=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Obwohl in der auszuführenden Abfrage drei Tabellen verwendet werden, nimmt Microsoft SQL Server ausschließlich die Tabellen [dbo].[Projects] und [dbo].[ProjectMembers] für die Ausführung der Abfrage. Grund für dieses Ergebnis ist ein Prozessschritt innerhalb der Optimierungsphasen von Microsoft SQL Server bei der Suche nach einem optimalen Ausführungsplan – Simplification!&lt;/p&gt;
&lt;p&gt;Bei “Simplification” versucht Microsoft SQL Server, den “Query Tree” auf einfache Formen zu reduzieren. um den Optimierungsprozess als solchen zu vereinfachen. Beispielsweise werden Subqueries in JOINS gewandelt oder redundante JOINS werden entfernt; widersprüchliche Anweisungen werden entfernt, …! Wer sich tiefer mit dieser Materie beschäftigen möchte, dem sei das Buch “&lt;a href=&quot;http://www.red-gate.com/community/books/inside-sql-server-query-optimizer&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: #2288bb;&quot;&gt;Inside the SQL Server Query Optimizer&lt;/span&gt;&lt;/a&gt;” von Benjamin Nevarez sehr ans Herz gelegt.&lt;/p&gt;
&lt;p&gt;Im Ergebnis der Abfrage werden Attribute der Tabellen [dbo].[Projects] und [dbo].[ProjectMembers] ausgegeben. Warum also sollte Microsoft SQL Server eine Prüfung der Daten aus [dbo].[Employees] vornehmen? Eine Prüfung ist obsolet, da beide Relationen durch eine Fremdschlüssel-Einschränkung miteinander in Beziehung stehen. Durch die Fremdschlüsselbeziehung wird gewährleistet, dass sich im Attribut [Employee_Id] von [dbo].[ProjectMembers] keine Daten befinden können, die nicht in [dbo].[Employees] existieren.&lt;/p&gt;
&lt;h1&gt;Gleiche Abfrage – keine Fremdschlüssel-Einschränkung&lt;/h1&gt;
&lt;p&gt;Um den – gravierenden - Unterschied zu zeigen, wird die Fremdschlüssel-Einschränkung vor der nächsten Ausführung der Abfrage deaktiviert.&lt;/p&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;ALTER&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;TABLE&lt;/span&gt; dbo.ProjectMembers &lt;span style=&quot;color: #0000ff;&quot;&gt;NOCHECK&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;CONSTRAINT&lt;/span&gt; fk_ProjectMembers_Employee_Id;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;p&gt;Nach der Ausführung der Abfrage ergibt sich für die Ausführung ein vollständig neues Bild.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_02.png?mtime=1386325837&quot;&gt;&lt;img src=&quot;/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_02.png?mtime=1386325837&quot; alt=&quot;&quot; width=&quot;738&quot; height=&quot;285&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Microsoft SQL Server muss nun alle in die Abfrage involvierten Relationen prüfen. Zunächst wird eine Ergebnismenge der beiden Relationen [dbo].[Employees] und [dbo].[ProjectMembers] mittels eines – teuren – Hash Match gebildet; anschließend wird diese Ergebnismenge mit [dbo].[Projects] verbunden und das Ergebnis an den Client geschickt. Statt eines – effektiveren – Merge Join muss ein – teurer – Hash Join verwendet werden, da Schlüsselattribute innerhalb der Abfrage nicht sortiert vorliegen. Weitere Informationen zu den physikalischen Operatoren für JOINS kann man im Buch “SQL Server Execution Plans” von Grant Fritchey nachlesen. Die unterschiedlichen Ausführungspläne machen sich natürlich auch im I/O bemerkbar, das durch die Abfragen generiert werden.&lt;/p&gt;
&lt;h3&gt;I/O mit Fremdschlüssel&lt;/h3&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;ProjectMembers-Tabelle. Scananzahl 1, logische Lesevorgänge 34, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;Projects-Tabelle. Scananzahl 1, logische Lesevorgänge 2, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;h3&gt;I/O ohne Fremdschlüssel&lt;/h3&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;Worktable-Tabelle. Scananzahl 0, logische Lesevorgänge 0, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;ProjectMembers-Tabelle. Scananzahl 1, logische Lesevorgänge 34, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: white;&quot;&gt;Employees-Tabelle. Scananzahl 1, logische Lesevorgänge 4, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: &#039;Courier New&#039;, courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;&quot;&gt;Projects-Tabelle. Scananzahl 1, logische Lesevorgänge 2, ...&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;h1&gt;Zusammenfassung&lt;/h1&gt;
&lt;p&gt;Microsoft SQL Server kann jede Art der “Unterstützung” gebrauchen, um optimale Ausführungspläne zu erstellen. Sicherlich ist die primäre Aufgabe einer Fremdschlüssel-Einschränkung nicht die Optimierung von Ausführungsplänen sondern die Durchsetzung von Datenintegrität; dennoch ist es bemerkenswert, dass Microsoft SQL Server basierend auf solchen Regeln Ausführungen von Abfragen vereinfachen und damit auch optimieren kann.&lt;/p&gt;
&lt;p&gt;Herzlichen Dank fürs Lesen!&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://db-berater.blogspot.de/2013/12/wie-fremdschlussel-einschrankungen.html">http://db-berater.blogspot.de/2013/12/wie-fremdschlussel-einschrankungen.html</a></p><p>Für viele Kollegen und Freunde, mit denen ich über Fremdschlüssel und deren Bedeutung für Datenbanken spreche, steht im Vordergrund, dass ein Fremdschlüssel sicherstellt, nur Werte aus einer referenzierten Tabelle zuzulassen. Diese Aussage ist nur bedingt richtig – vielmehr spielt eine Fremdschlüsselbeziehung auch bei Abfragen eine wichtige Rolle, wenn der Abfrage Optimierer seine Arbeit verrichtet.</p>
<h1>Was ist eine Fremdschlüssel-Einschränkung?</h1>
<p>Unter einer Fremdschlüssel-Einschränkung (Foreign Key Constraint) versteht man eine Kombination von Attributen in einer Tabelle, mit deren Hilfe eine Verknüpfung zwischen den Daten zweier Tabellen erzwungen wird. In einem sogenannten Fremdschlüsselverweis besteht zwischen zwei Tabellen eine Verknüpfung, wenn eine oder mehrere Attribute einer Tabelle (Detailtabelle) auf ein oder mehrere Attribute einer anderen Tabelle (Mastertabelle) verweisen.</p>
<p>Klassische Fremdschlüsselbeziehungen sind z. B. in einem Auftragssystem zu finden, in dem zu Auftragsdetails (Detailtabelle) immer ein Auftragskopf (Mastertabelle) enthalten sein muss. In einer solchen Konstruktion wird das Primärattribut der Mastertabelle (z. B. Auftrag_Id) zum Fremdschlüssel in der Detailtabelle. Neben der erwähnten Durchsetzung von Datenintegritätsregeln kann aber Microsoft SQL Server Fremdschlüssel auch ideal für die Optimierung von Abfragen verwenden, wie die nachfolgende Demonstration zeigt.</p>
<h1>Testumgebung für Demonstration</h1>
<p>Welche Einflüsse eine Fremdschlüssel-Einschränkung auf die Ausführung von Abfragen haben kann, soll mit dem folgenden Datenmodell demonstriert werden (SQL Server 2012).</p>
<div class="image_block"><a href="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/Datenmodell_01.png?mtime=1386325823"><img src="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/Datenmodell_01.png?mtime=1386325823" alt="" width="547" height="494" /></a></div>
<p>Zu verschiedenen Projekten ([dbo].[Projects]) gibt es eine Vielzahl von Projektmitgliedern ([dbo].[ProjectMembers]). Beide Tabellen stehen in einer 1:n-Abhängigkeit zueinander. Damit in die Tabelle [dbo].[ProjectMembers] keine Projektnummern eingetragen werden können, die nicht in [dbo].[Projects] existieren, wird eine Fremdschlüssel-Beziehung zwischen beiden Tabellen implementiert. Gleiches gilt für die Tabelle [dbo].[Employees]. Das anschließende T-SQL-Script erzeugt die oben beschriebene Struktur.</p>
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #008000;">-- Mitarbeiter</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.Employees</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">(</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    Id         <span style="color: #0000ff;">int</span>         <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>    <span style="color: #0000ff;">IDENTITY</span> (1, 1),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    FirstName  <span style="color: #0000ff;">varchar</span>(64) <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    LastName   <span style="color: #0000ff;">varchar</span>(64) <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    HiredAt    <span style="color: #0000ff;">date</span>        <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    FiredAt    <span style="color: #0000ff;">date</span>        <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    <span style="color: #0000ff;">CONSTRAINT</span> pk_Employees_Id <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span style="color: #0000ff;">CLUSTERED</span> (Id)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #008000;">-- Projekte</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.Projects</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">(</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    Id             <span style="color: #0000ff;">int</span>         <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>    <span style="color: #0000ff;">IDENTITY</span>(1, 1),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    ProjectName    <span style="color: #0000ff;">varchar</span>(64) <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    ProjectStart   <span style="color: #0000ff;">date</span>        <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULl</span>    <span style="color: #0000ff;">DEFAULT</span> (getdate()),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    ProjectFinish  <span style="color: #0000ff;">date</span>        <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    ProjectLead    <span style="color: #0000ff;">int</span>         <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    <span style="color: #0000ff;">CONSTRAINT</span> pk_Projects_Id <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span style="color: #0000ff;">CLUSTERED</span> (Id),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    <span style="color: #0000ff;">CONSTRAINT</span> fk_Projects_ProjectLead <span style="color: #0000ff;">FOREIGN</span> <span style="color: #0000ff;">KEY</span> (ProjectLead)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    <span style="color: #0000ff;">REFERENCES</span> dbo.Employees (Id)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #008000;">-- Projektmitarbeiter</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.ProjectMembers</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">(</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    Project_Id  <span style="color: #0000ff;">int</span>    <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    Employee_Id <span style="color: #0000ff;">int</span>    <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    StartDate   <span style="color: #0000ff;">date</span>   <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    FinishDate  <span style="color: #0000ff;">date</span>   <span style="color: #0000ff;">NULL</span>,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    <span style="color: #0000ff;">CONSTRAINT</span> pk_ProjectMembers <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span style="color: #0000ff;">CLUSTERED</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    (</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">        Project_Id,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">        Employee_Id</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    ),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    <span style="color: #0000ff;">CONSTRAINT</span> fk_ProjectMembers_Project_Id <span style="color: #0000ff;">FOREIGN</span> <span style="color: #0000ff;">KEY</span> (Project_Id)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    <span style="color: #0000ff;">REFERENCES</span> dbo.Projects (Id),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">    <span style="color: #0000ff;">CONSTRAINT</span> fk_ProjectMembers_Employee_Id <span style="color: #0000ff;">FOREIGN</span> <span style="color: #0000ff;">KEY</span> (Employee_Id)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">    <span style="color: #0000ff;">REFERENCES</span> dbo.Employees (Id)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">);</pre>
<!--CRLF--></div>
<h1>Demonstration</h1>
<p>Der Ausführungsplan der folgenden Abfrage zeigt, wie “optimal” Microsoft SQL Server Ermittlung von geeigneten Ausführungsplänen vorgeht:</p>
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #0000ff;">SELECT</span>  p.Id,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">        p.ProjectName,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">        p.ProjectStart      <span style="color: #0000ff;">AS</span>    Project_StartDate,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">        p.ProjectFinish     <span style="color: #0000ff;">AS</span>    Project_Finish,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">        pm.StartDate        <span style="color: #0000ff;">AS</span>    Employee_StartDate,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">        pm.FinishDate       <span style="color: #0000ff;">AS</span>    Employee_FinishDate</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #0000ff;">FROM</span>    dbo.Projects p <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.ProjectMembers pm</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">        <span style="color: #0000ff;">ON</span> (p.Id = pm.Project_Id) <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.Employees e</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">        <span style="color: #0000ff;">ON</span> (pm.Employee_Id = e.Id);</pre>
<!--CRLF--></div>
<p>Die Abfrage ermittelt neben den Projektdaten (Name, Start und Ende) ebenfalls die Start- und Endzeiten für die einzelnen Mitarbeiter. Die Abfrage selbst verwendet alle drei Tabellen, die in einer unmittelbaren Abhängigkeit zueinander stehen. Der Ausführungsplan für diese Abfrage gestaltet sich aber überraschender Weise wie folgt:</p>
<div class="image_block"><a href="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_01.png?mtime=1386325830"><img src="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_01.png?mtime=1386325830" alt="" width="573" height="213" /></a></div>
<p>Obwohl in der auszuführenden Abfrage drei Tabellen verwendet werden, nimmt Microsoft SQL Server ausschließlich die Tabellen [dbo].[Projects] und [dbo].[ProjectMembers] für die Ausführung der Abfrage. Grund für dieses Ergebnis ist ein Prozessschritt innerhalb der Optimierungsphasen von Microsoft SQL Server bei der Suche nach einem optimalen Ausführungsplan – Simplification!</p>
<p>Bei “Simplification” versucht Microsoft SQL Server, den “Query Tree” auf einfache Formen zu reduzieren. um den Optimierungsprozess als solchen zu vereinfachen. Beispielsweise werden Subqueries in JOINS gewandelt oder redundante JOINS werden entfernt; widersprüchliche Anweisungen werden entfernt, …! Wer sich tiefer mit dieser Materie beschäftigen möchte, dem sei das Buch “<a href="http://www.red-gate.com/community/books/inside-sql-server-query-optimizer" target="_blank"><span style="color: #2288bb;">Inside the SQL Server Query Optimizer</span></a>” von Benjamin Nevarez sehr ans Herz gelegt.</p>
<p>Im Ergebnis der Abfrage werden Attribute der Tabellen [dbo].[Projects] und [dbo].[ProjectMembers] ausgegeben. Warum also sollte Microsoft SQL Server eine Prüfung der Daten aus [dbo].[Employees] vornehmen? Eine Prüfung ist obsolet, da beide Relationen durch eine Fremdschlüssel-Einschränkung miteinander in Beziehung stehen. Durch die Fremdschlüsselbeziehung wird gewährleistet, dass sich im Attribut [Employee_Id] von [dbo].[ProjectMembers] keine Daten befinden können, die nicht in [dbo].[Employees] existieren.</p>
<h1>Gleiche Abfrage – keine Fremdschlüssel-Einschränkung</h1>
<p>Um den – gravierenden - Unterschied zu zeigen, wird die Fremdschlüssel-Einschränkung vor der nächsten Ausführung der Abfrage deaktiviert.</p>
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span style="color: #0000ff;">ALTER</span> <span style="color: #0000ff;">TABLE</span> dbo.ProjectMembers <span style="color: #0000ff;">NOCHECK</span> <span style="color: #0000ff;">CONSTRAINT</span> fk_ProjectMembers_Employee_Id;</pre>
<!--CRLF--></div>
<p>Nach der Ausführung der Abfrage ergibt sich für die Ausführung ein vollständig neues Bild.</p>
<div class="image_block"><a href="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_02.png?mtime=1386325837"><img src="/blogs/media/blogs/uricken/FK_AND_OPTIMIZATION/EXECUTION_PLAN_02.png?mtime=1386325837" alt="" width="738" height="285" /></a></div>
<p>Microsoft SQL Server muss nun alle in die Abfrage involvierten Relationen prüfen. Zunächst wird eine Ergebnismenge der beiden Relationen [dbo].[Employees] und [dbo].[ProjectMembers] mittels eines – teuren – Hash Match gebildet; anschließend wird diese Ergebnismenge mit [dbo].[Projects] verbunden und das Ergebnis an den Client geschickt. Statt eines – effektiveren – Merge Join muss ein – teurer – Hash Join verwendet werden, da Schlüsselattribute innerhalb der Abfrage nicht sortiert vorliegen. Weitere Informationen zu den physikalischen Operatoren für JOINS kann man im Buch “SQL Server Execution Plans” von Grant Fritchey nachlesen. Die unterschiedlichen Ausführungspläne machen sich natürlich auch im I/O bemerkbar, das durch die Abfragen generiert werden.</p>
<h3>I/O mit Fremdschlüssel</h3>
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">ProjectMembers-Tabelle. Scananzahl 1, logische Lesevorgänge 34, ...</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">Projects-Tabelle. Scananzahl 1, logische Lesevorgänge 2, ...</pre>
<!--CRLF--></div>
<h3>I/O ohne Fremdschlüssel</h3>
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">Worktable-Tabelle. Scananzahl 0, logische Lesevorgänge 0, ...</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">ProjectMembers-Tabelle. Scananzahl 1, logische Lesevorgänge 34, ...</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;">Employees-Tabelle. Scananzahl 1, logische Lesevorgänge 4, ...</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">Projects-Tabelle. Scananzahl 1, logische Lesevorgänge 2, ...</pre>
<!--CRLF--></div>
<h1>Zusammenfassung</h1>
<p>Microsoft SQL Server kann jede Art der “Unterstützung” gebrauchen, um optimale Ausführungspläne zu erstellen. Sicherlich ist die primäre Aufgabe einer Fremdschlüssel-Einschränkung nicht die Optimierung von Ausführungsplänen sondern die Durchsetzung von Datenintegrität; dennoch ist es bemerkenswert, dass Microsoft SQL Server basierend auf solchen Regeln Ausführungen von Abfragen vereinfachen und damit auch optimieren kann.</p>
<p>Herzlichen Dank fürs Lesen!</p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/uricken/2013/12/06/wie-fremdschluessel-einschraenkungen-ausfuehrungsplaene-beeinflussen#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3617</wfw:commentRss>
		</item>
				<item>
			<title>Wie große Datenmengen am effizientesten löschen?</title>
			<link>https://www.insidesql.org/blogs/uricken/2013/10/29/wie-grosse-datenmengen-am-effizientesten</link>
			<pubDate>Tue, 29 Oct 2013 16:29:00 +0000</pubDate>			<dc:creator>Uwe Ricken</dc:creator>
			<category domain="alt">Tipps und Tricks</category>
<category domain="main">Optimierung / Performance</category>
<category domain="alt">Level 300</category>			<guid isPermaLink="false">3603@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://db-berater.blogspot.de/2013/10/wie-groe-datenmengen-am-effizientesten.html#more&quot;&gt;http://db-berater.blogspot.de/2013/10/wie-groe-datenmengen-am-effizientesten.html#more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Dieser Artikel beschreibt Strategien, wie große Datenmengen aus Relationen gelöscht werden können und dabei möglichst effizient und schnell zu arbeiten. Ziel einer solchen Operation ist die Vermeidung großer Datenmengen im Transaktionsprotokoll. Diese Aufgabenstellung zu dokumentieren, rührt von den immer wieder auftretenden Fragen in den Microsoft Foren bezüglich effizienter Löschstrategien:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://social.msdn.microsoft.com/Forums/sqlserver/en-US/6bc6b5c0-99da-4299-9661-7cb96683bdec/need-to-build-a-job-that-purges-old-data-and-rebuilds-indexes?forum=sqldatabaseengine&quot; target=&quot;_blank&quot;&gt;Need to build a job that purges old data and rebuilds indexes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://social.msdn.microsoft.com/Forums/sqlserver/en-US/76a0976d-4d27-4374-a2e9-c6ca1d83521f/removing-large-number-of-records-with-truncate?forum=sqldatabaseengine&quot; target=&quot;_blank&quot;&gt;Removing large number of records with truncate?&lt;/a&gt;&lt;/p&gt;
&lt;div id=&quot;extendedEntryBreak&quot;&gt; &lt;/div&gt;&lt;a href=&quot;https://www.insidesql.org/blogs/uricken/2013/10/29/wie-grosse-datenmengen-am-effizientesten#more3603&quot;&gt;Ganze Geschichte &amp;raquo;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://db-berater.blogspot.de/2013/10/wie-groe-datenmengen-am-effizientesten.html#more">http://db-berater.blogspot.de/2013/10/wie-groe-datenmengen-am-effizientesten.html#more</a></p><p>Dieser Artikel beschreibt Strategien, wie große Datenmengen aus Relationen gelöscht werden können und dabei möglichst effizient und schnell zu arbeiten. Ziel einer solchen Operation ist die Vermeidung großer Datenmengen im Transaktionsprotokoll. Diese Aufgabenstellung zu dokumentieren, rührt von den immer wieder auftretenden Fragen in den Microsoft Foren bezüglich effizienter Löschstrategien:</p>
<p><a href="http://social.msdn.microsoft.com/Forums/sqlserver/en-US/6bc6b5c0-99da-4299-9661-7cb96683bdec/need-to-build-a-job-that-purges-old-data-and-rebuilds-indexes?forum=sqldatabaseengine" target="_blank">Need to build a job that purges old data and rebuilds indexes</a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/sqlserver/en-US/76a0976d-4d27-4374-a2e9-c6ca1d83521f/removing-large-number-of-records-with-truncate?forum=sqldatabaseengine" target="_blank">Removing large number of records with truncate?</a></p>
<div id="extendedEntryBreak"> </div><a href="https://www.insidesql.org/blogs/uricken/2013/10/29/wie-grosse-datenmengen-am-effizientesten#more3603">Ganze Geschichte &raquo;</a>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/uricken/2013/10/29/wie-grosse-datenmengen-am-effizientesten#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3603</wfw:commentRss>
		</item>
			</channel>
</rss>
