<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ixto-Blog &#187; Common Table Expression</title>
	<atom:link href="http://www.ixto.de/blog/tag/common-table-expression/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ixto.de/blog</link>
	<description>Business Intelligence, Database Consulting, Software Development</description>
	<lastBuildDate>Mon, 26 Sep 2011 09:23:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Range-Lookups mit den Integration Services – Teil II</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/range-lookups-mit-den-integration-services-%e2%80%93-teil-ii/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/range-lookups-mit-den-integration-services-%e2%80%93-teil-ii/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 13:01:22 +0000</pubDate>
		<dc:creator>Markus Schechner</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Common Table Expression]]></category>
		<category><![CDATA[CTE]]></category>
		<category><![CDATA[fortlaufende Werte]]></category>
		<category><![CDATA[Lookup]]></category>
		<category><![CDATA[SSIS]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2005/integration-services-2005/range-lookups-mit-den-integration-services-%e2%80%93-teil-ii/</guid>
		<description><![CDATA[Wie im Teil I versprochen wollen wir uns nun mit einer weiteren Möglichkeit für Range-Lookups mit den Integration Services auseinandersetzen.
Dazu zur Erinnerung noch einmal unsere Quelltabelle, aus der wir die zugehörigen IDs ermitteln wollen:



Lösung mittels Lookup – Mit Caching


Wie wir festgestellt haben, verliert der Lookup bei ausgeschaltetem Caching enorm an Geschwindigkeit. Alternativ könnte man also [...]]]></description>
			<content:encoded><![CDATA[<p>Wie im <a href="http://www.ixto.de/blog/sql-server-2005/integration-services-2005/range-lookups-mit-den-integration-services-%e2%80%93-teil-i-2/trackback/">Teil I</a> versprochen wollen wir uns nun mit einer weiteren Möglichkeit für Range-Lookups mit den Integration Services auseinandersetzen.</p>
<p>Dazu zur Erinnerung noch einmal unsere Quelltabelle, aus der wir die zugehörigen IDs ermitteln wollen:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_1200_RangeLookup1.png" alt="" /></p>
<p><span id="more-73"></span><br />
<br\><br />
<span style="text-decoration: underline;"><strong>Lösung mittels Lookup – Mit Caching<br />
</strong></span><br />
<br\><br />
Wie wir festgestellt haben, verliert der Lookup bei ausgeschaltetem Caching enorm an Geschwindigkeit. Alternativ könnte man also versuchen, den Range-Lookup mit aktiviertem Caching zu realisieren. Da der Lookup dann aber nur genaue Übereinstimmungen als Treffer wertet, muss für jeden möglichen Wert eine Zeile in der Lookup Tabelle existieren. Angenommen die Einkommen sind im beschriebenen Fall als volle Eurobeträge gespeichert, ließe sich das mit folgender rekursiven Common Table Expression (CTE) realisieren:<br />
<br\><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">WITH</span> IncomeGroups<span style="color: gray;">(</span>IncomeGroupID<span style="color: gray;">,</span>Income<span style="color: gray;">,</span> IncomeTo<span style="color: gray;">)<br />
</span></span></p>
<p><span style="font-family: Courier New; color: blue; font-size: 10pt;">AS<br />
</span></p>
<p><span style="font-family: Courier New; color: gray; font-size: 10pt;">(<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">SELECT</span>    [IncomeGroupID]<span style="color: gray;">,</span>[IncomeFrom] <span style="color: blue;">as</span> Income<span style="color: gray;">,</span> [IncomeTo]<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">FROM</span>    dbo<span style="color: gray;">.</span>_MATCH_IncomeGroup<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">WHERE</span>    IncomeGroupID <span style="color: gray;">&lt;</span> 7<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">UNION</span><br />
<span style="color: gray;">ALL<br />
</span></span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">SELECT</span> [IncomeGroupID]<span style="color: gray;">,</span> Income <span style="color: gray;">+</span> 1<span style="color: gray;">,</span> [IncomeTo]<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">FROM</span> IncomeGroups<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">WHERE</span> Income <span style="color: gray;">+</span> 1 <span style="color: gray;">&lt;=</span> IncomeTo<br />
</span></p>
<p><span style="font-family: Courier New; color: gray; font-size: 10pt;">)<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">SELECT</span> Income<span style="color: gray;">,</span> IncomeGroupID<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">FROM</span> IncomeGroups<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">ORDER</span><br />
<span style="color: blue;">BY</span> 1<span style="color: gray;">,</span>2<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">OPTION </span><span style="color: gray;">(</span>MAXRECURSION 0<span style="color: gray;">)</span></span><br />
<br\><br />
Dieses Statement liefert im Management das folgende Ergebnis:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_1200_RangeLookup2.png" alt="" /><br />
<br\><br />
Dies könnte als Quelle für den Lookup Task verwendet werden der dann wie jeder andere gewöhnliche Lookup konfiguriert werden kann.<br />
<br\><br />
Anschließend müsste dann die oberste Grenze, die in der Quelle bewusst ausgelassen wurde (denn 999.999.999 Datensätze wollte ich nun wirklich nicht erzeugen) per Abgeleitete Spalte (derived column) gesetzt werden.<br />
<br\><br />
Für Situationen in denen sehr viele Datensätze verarbeitet werden müssen, könnte dies eine gute Alternative zu der Variante ohne Caching sein. Es wird aber auch schnell klar, dass auch dieses Verfahren seine Grenzen hat. Für eine Aufteilung in Altersklassen von Kunden, für die es nur sehr wenige Ausprägungen in den Quelldaten gibt, ist dies wahrscheinlich die beste Lösung. Wenn es aber darum geht Firmenumsätze, die in die Milliarden gehen, in Gruppen einzuteilen, wird sowohl die Abfragezeit der Rekursion, als auch der benötigte Speicherplatz den Rahmen sprengen. Spätestens aber wenn die Grenzen nicht mehr mit ganzen Zahlen definierbar sind, ist dann wirklich Schluss.<br />
<br\><br />
Um auch für diese Situationen gerüstet zu sein, wird sich der nächste und vermutlich letzte Teil dieses Artikels mit der dritten Alternative, dem Range-Lookup mittels Script Task auseinandersetzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/range-lookups-mit-den-integration-services-%e2%80%93-teil-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

