<?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:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Uwe Ricken - Neueste Kommentare auf CTE, Tabellenvariablen und temporäre Tabellen</title>
		<link>https://www.insidesql.org/blogs/uricken/?disp=comments</link>
		<atom:link rel="self" type="application/rss+xml" href="https://www.insidesql.org/blogs/uricken/?tempskin=_rss2&#38;disp=comments&#38;p=3408" />
		<description></description>
		<language>de-DE</language>
		<docs>http://backend.userland.com/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=6.11.7-stable"/>
		<ttl>60</ttl>
		<item>
			<title>uricken in Antwort auf: CTE, Tabellenvariablen und temporäre Tabellen</title>
			<pubDate>Fri, 22 Feb 2013 15:04:44 +0000</pubDate>
			<dc:creator><a href="http://www.db-berater.de" title="Benutzerprofil anzeigen" class="login user nowrap" rel="bubbletip_user_14"><span class="identity_link_username">uricken</span></a></dc:creator>
			<guid isPermaLink="false">c2200@https://www.insidesql.org/blogs/</guid>
			<description>Hallo Torsten,

auf jeden Fall ist ein optimiertes Szenario der TEMPDB sinnvoll. Insbesondere ein schnelles IO-Subsystem ist hier entscheidend. Da aber in großen Umgebungen fast ausschließlich mit SAN gearbeitet wird, ist es fast schon wieder vernachlässigbar, da ja zunächst kein physischer IO generiert wird.
Grundsätzlich würde ich aber bei größeren Datenmengen - unabhängig von der Leistung von TempDB - auf temporäre Tabellen zurückgreifen, da ich hier deutlich mehr Optimierungsmöglichkeiten (Indexes / Statistiken !!!) habe als mit Tablevariablen und TableFunctions.

Bezüglich der &quot;Dirty Pages&quot; habe ich keine Verschlechterungen bemerkt. Hierbei bin ich wie folgt vorgegangen:
1. CHECKPOINT in tempdb um alle Änderungen zu speichern
2. Ausführung der CTE und unmittelbar danach die Ausführung der nachfolgenden Abfrage (in TEMPDB)

;WITH memusage_CTE AS
(
	SELECT	bd.database_id,
		bd.file_id,
		bd.page_id,
		bd.page_type,
		COALESCE(p1.object_id, p2.object_id)	AS object_id,
		COALESCE(p1.index_id, p2.index_id)		AS index_id,
		bd.row_count,
		bd.free_space_in_bytes,
		CONVERT(tinyint, bd.is_modified)		AS &#039;DirtyPage&#039;
	FROM	sys.dm_os_buffer_descriptors  bd INNER JOIN sys.allocation_units au
		ON	(au.allocation_unit_id = bd.allocation_unit_id)
		OUTER APPLY (
				SELECT TOP(1) p.object_id, p.index_id
				FROM sys.partitions AS p
				WHERE p.hobt_id = au.container_id AND au.type IN (1, 3)
			) p1
		OUTER APPLY (
				SELECT TOP(1) p.object_id, p.index_id
				FROM sys.partitions AS p
				WHERE p.partition_id = au.container_id AND au.type = 2
			) p2
	WHERE	bd.database_id = DB_ID() AND 
		bd.page_type IN (&#039;DATA_PAGE&#039;, &#039;INDEX_PAGE&#039;,&#039;TEXT_MIX_PAGE&#039;)
)
SELECT	DB_NAME(database_id) AS &#039;Database&#039;,
	OBJECT_NAME(object_id, database_id)	AS &#039;Table Name&#039;,
	index_id,COUNT(*) AS &#039;Pages in Cache&#039;,
	SUM(dirtyPage) AS &#039;Dirty Pages&#039;
FROM	memusage_CTE
GROUP BY
	database_id,
	object_id,
	index_id
ORDER BY
	SUM(dirtyPage) DESC

Du wirst sehen, dass sich die Anzahl der Dirty Pages nicht erhöhen wird.
PS: Diese Abfrage ist im Original NICHT von mir sondern ich habe sie dankenswerter Weise aus dem Blog von Steve Hindmarsh:
&lt;a href=&quot;http://sqlblogcasts.com/blogs/steveh/archive/2010/04/02/dbcc-memusage-in-2008.aspx&quot;&gt;http://sqlblogcasts.com/blogs/steveh/archive/2010/04/02/dbcc-memusage-in-2008.aspx&lt;/a&gt;</description>
			<content:encoded><![CDATA[Hallo Torsten,

auf jeden Fall ist ein optimiertes Szenario der TEMPDB sinnvoll. Insbesondere ein schnelles IO-Subsystem ist hier entscheidend. Da aber in großen Umgebungen fast ausschließlich mit SAN gearbeitet wird, ist es fast schon wieder vernachlässigbar, da ja zunächst kein physischer IO generiert wird.
Grundsätzlich würde ich aber bei größeren Datenmengen - unabhängig von der Leistung von TempDB - auf temporäre Tabellen zurückgreifen, da ich hier deutlich mehr Optimierungsmöglichkeiten (Indexes / Statistiken !!!) habe als mit Tablevariablen und TableFunctions.

Bezüglich der "Dirty Pages" habe ich keine Verschlechterungen bemerkt. Hierbei bin ich wie folgt vorgegangen:
1. CHECKPOINT in tempdb um alle Änderungen zu speichern
2. Ausführung der CTE und unmittelbar danach die Ausführung der nachfolgenden Abfrage (in TEMPDB)

;WITH memusage_CTE AS
(
	SELECT	bd.database_id,
		bd.file_id,
		bd.page_id,
		bd.page_type,
		COALESCE(p1.object_id, p2.object_id)	AS object_id,
		COALESCE(p1.index_id, p2.index_id)		AS index_id,
		bd.row_count,
		bd.free_space_in_bytes,
		CONVERT(tinyint, bd.is_modified)		AS 'DirtyPage'
	FROM	sys.dm_os_buffer_descriptors  bd INNER JOIN sys.allocation_units au
		ON	(au.allocation_unit_id = bd.allocation_unit_id)
		OUTER APPLY (
				SELECT TOP(1) p.object_id, p.index_id
				FROM sys.partitions AS p
				WHERE p.hobt_id = au.container_id AND au.type IN (1, 3)
			) p1
		OUTER APPLY (
				SELECT TOP(1) p.object_id, p.index_id
				FROM sys.partitions AS p
				WHERE p.partition_id = au.container_id AND au.type = 2
			) p2
	WHERE	bd.database_id = DB_ID() AND 
		bd.page_type IN ('DATA_PAGE', 'INDEX_PAGE','TEXT_MIX_PAGE')
)
SELECT	DB_NAME(database_id) AS 'Database',
	OBJECT_NAME(object_id, database_id)	AS 'Table Name',
	index_id,COUNT(*) AS 'Pages in Cache',
	SUM(dirtyPage) AS 'Dirty Pages'
FROM	memusage_CTE
GROUP BY
	database_id,
	object_id,
	index_id
ORDER BY
	SUM(dirtyPage) DESC

Du wirst sehen, dass sich die Anzahl der Dirty Pages nicht erhöhen wird.
PS: Diese Abfrage ist im Original NICHT von mir sondern ich habe sie dankenswerter Weise aus dem Blog von Steve Hindmarsh:
<a href="http://sqlblogcasts.com/blogs/steveh/archive/2010/04/02/dbcc-memusage-in-2008.aspx">http://sqlblogcasts.com/blogs/steveh/archive/2010/04/02/dbcc-memusage-in-2008.aspx</a>]]></content:encoded>
			<link>https://www.insidesql.org/blogs/uricken/2013/02/06/cte-tabellenvariablen-und-temporaere-tabellen#c2200</link>
		</item>
		<item>
			<title>tosc in Antwort auf: CTE, Tabellenvariablen und temporäre Tabellen</title>
			<pubDate>Thu, 21 Feb 2013 20:36:53 +0000</pubDate>
			<dc:creator><a href="http://de.linkedin.com/in/dbatosc" title="Benutzerprofil anzeigen" class="login user nowrap" rel="bubbletip_user_4"><span class="identity_link_username">tosc</span></a></dc:creator>
			<guid isPermaLink="false">c2199@https://www.insidesql.org/blogs/</guid>
			<description>Hallo Uwe,&lt;br /&gt;

&lt;p&gt;&quot;&lt;em&gt;Bei sehr großen Datenmengen empfiehlt sich auf jeden Fall der Einsatz von temporären Tabellen an Stelle von ...&lt;/em&gt;&quot; setzt natürlich ein wirklich gutes tuning der tempdb voraus, so dass Latch-Konflikten entgegen gewirkt werden kann. Das user object in der tempdb wird ziemlich voll werden.&lt;/p&gt;
&lt;p&gt;Was mich ein wenig stutzig macht, ist das UNION ALL Statement in der CTE - je nach Datenmenge wird es dann in den internal objects der tempdb evtl. zu dirty pages führen - oder wie siehst Du das?&lt;/p&gt;
&lt;p&gt;Gruß,&lt;br /&gt;Torsten&lt;/p&gt;</description>
			<content:encoded><![CDATA[Hallo Uwe,<br />

<p>"<em>Bei sehr großen Datenmengen empfiehlt sich auf jeden Fall der Einsatz von temporären Tabellen an Stelle von ...</em>" setzt natürlich ein wirklich gutes tuning der tempdb voraus, so dass Latch-Konflikten entgegen gewirkt werden kann. Das user object in der tempdb wird ziemlich voll werden.</p>
<p>Was mich ein wenig stutzig macht, ist das UNION ALL Statement in der CTE - je nach Datenmenge wird es dann in den internal objects der tempdb evtl. zu dirty pages führen - oder wie siehst Du das?</p>
<p>Gruß,<br />Torsten</p>]]></content:encoded>
			<link>https://www.insidesql.org/blogs/uricken/2013/02/06/cte-tabellenvariablen-und-temporaere-tabellen#c2199</link>
		</item>
		<item>
			<title> Uwe Ricken in Antwort auf: CTE, Tabellenvariablen und temporäre Tabellen</title>
			<pubDate>Fri, 15 Feb 2013 10:03:47 +0000</pubDate>
			<dc:creator><span class="user anonymous" rel="bubbletip_comment_2193">Uwe Ricken</span></dc:creator>
			<guid isPermaLink="false">c2193@https://www.insidesql.org/blogs/</guid>
			<description>Hallo Christoph,

sorry - mein Fehler. Ich habe die ganzen Downloads nun etwas verwaltbarer gemacht :(.
Nun sollte der Download gehen :)

Danke für den Hinweis.
Any comment is really appreciated!</description>
			<content:encoded><![CDATA[Hallo Christoph,

sorry - mein Fehler. Ich habe die ganzen Downloads nun etwas verwaltbarer gemacht :(.
Nun sollte der Download gehen :)

Danke für den Hinweis.
Any comment is really appreciated!]]></content:encoded>
			<link>https://www.insidesql.org/blogs/uricken/2013/02/06/cte-tabellenvariablen-und-temporaere-tabellen#c2193</link>
		</item>
		<item>
			<title>cmu in Antwort auf: CTE, Tabellenvariablen und temporäre Tabellen</title>
			<pubDate>Thu, 14 Feb 2013 14:47:13 +0000</pubDate>
			<dc:creator><a href="https://www.insidesql.org/blogs/uricken/?disp=user&amp;user_ID=6" title="Benutzerprofil anzeigen" class="login user nowrap" rel="bubbletip_user_6"><span class="identity_link_username">cmu</span></a></dc:creator>
			<guid isPermaLink="false">c2192@https://www.insidesql.org/blogs/</guid>
			<description>Hallo Uwe,
das sind sehr interessante Ausführungen!
Leider funktioniert der Link für das Beispielscript nicht.
Gruß
Christoph</description>
			<content:encoded><![CDATA[Hallo Uwe,
das sind sehr interessante Ausführungen!
Leider funktioniert der Link für das Beispielscript nicht.
Gruß
Christoph]]></content:encoded>
			<link>https://www.insidesql.org/blogs/uricken/2013/02/06/cte-tabellenvariablen-und-temporaere-tabellen#c2192</link>
		</item>
			</channel>
</rss>
