<?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>Cap Data Team SGBD Blog : Oracle, SQL Server, MySQL, Sybase... &#187; monitorTempdb</title>
	<atom:link href="http://blog.capdata.fr/index.php/tag/monitortempdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.capdata.fr</link>
	<description>Le blog technique sur les bases de données de CAP DATA Consulting</description>
	<lastBuildDate>Wed, 01 Feb 2012 17:21:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sessions consommatrices dans tempdb</title>
		<link>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 08:56:42 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[dbcc inputbuffer]]></category>
		<category><![CDATA[DBCCINPUTBUFFER]]></category>
		<category><![CDATA[DBCCSHOWFILESTATS]]></category>
		<category><![CDATA[monitorTempdb]]></category>
		<category><![CDATA[sessions]]></category>
		<category><![CDATA[tempdb]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=184</guid>
		<description><![CDATA[Je sais ce que vous allez dire: on l&#8217;a déjà vu partout, il y a déjà un million d&#8217;articles sur le sujet, quel intérêt pour une société qui se défend justement de poster sur des sujets originaux, etc&#8230;
Je vous répondrai que le problème n&#8217;est pas trivial. Tout le monde utilise les vues DMV pour récupérer [...]]]></description>
			<content:encoded><![CDATA[<p>Je sais ce que vous allez dire: on l&#8217;a déjà vu partout, il y a déjà un million d&#8217;articles sur le sujet, quel intérêt pour une société qui se défend justement de poster sur des sujets originaux, etc&#8230;</p>
<p>Je vous répondrai que le problème n&#8217;est pas trivial. Tout le monde utilise les vues DMV pour récupérer les infos de la session qui occupe l&#8217;espace dans tempdb, notamment le texte SQL de la requête:<br />
- <em>sys.dm_db_task_space_usage</em>: pour voir l&#8217;espace utilisé par session.<br />
- <em>sys.dm_exec_requests</em> ou <em>sys.dm_exec_query_stats</em> + <em>cross apply sys.dm_exec_sql_text(sql_handle)</em>: pour plus d&#8217;infos sur les sessions (stats + texte des requêtes).</p>
<p>Seulement voilà: les sessions dont le plan a été purgé du cache ne sont plus visibles dans les DMV sys.dm_exec&#8230; donc la jointure entre sys.dm_db_task_space_usage et sys.dm_exec&#8230; ne renverra pas d&#8217;infos pour des sessions qui utilisent pourtant bel et bien de l&#8217;espace dans tempdb.</p>
<p>Donc il faut avoir recours au bon vieux  <strong><em>dbcc inputbuffer</em></strong> pour récupérer tout ça.</p>
<p>1) D&#8217;abord, on va créer les tables de recueil.</p>
<p>1.1 DBCCINPUTBUFFER va nous permettre de récupérer le contenu du dbcc inputbuffer par session:</p>
<pre>CREATE TABLE tempdb.guest.DBCCINPUTBUFFER
(
EventType varchar(50),
Parameters int,
SQLText varchar(8000)
)</pre>
<p>1.2 DBCCSHOWFILESTATS va nous permettre de récupérer l&#8217;espace total et utilisé dans tempdb:</p>
<pre>CREATE TABLE tempdb.guest.DBCCSHOWFILESTATS
(
[fileid] [int], [filegroup] [int],
[totalextents] [int], [usedextents] [int],
[name] [varchar] (255), [filename] [varchar] (255)
)</pre>
<p>1.3 monitorTempdb sera notre table finale d&#8217;historique.</p>
<pre>CREATE TABLE tempdb.guest.monitorTempdb
(
curdate datetime,
spaceintempdb bigint,
spaceusedintempdb bigint,
spid int,
sqltext varchar(8000),
internal_objects_alloc_MB bigint,
internal_objects_dealloc_MB bigint,
user_objects_alloc_MB bigint,
user_objects_dealloc_MB bigint,
program_name varchar(100),
login_time datetime,
hostname varchar(20),
login_name varchar(100)
)</pre>
<p>2) Par session récupérer les infos et le texte de la requête: on va placer les sessions consommatrices ainsi que les espaces consommés dans un curseur, puis boucler pour chaque session_id et récupérer plus d&#8217;infos (program_name, login, etc&#8230; depuis sys.dm_exec_sessions, la seule DMV qui affiche toutes les sessions actives ou non) et le dernier texte SQL généré:</p>
<pre>use tempdb
go
declare
	@spid int,
	@sqltext varchar(8000),
	@internal_objects_alloc_page_count bigint,
	@internal_objects_dealloc_page_count bigint,
	@user_objects_alloc_page_count bigint,
	@user_objects_dealloc_page_count bigint,
	@program_name varchar(100),
	@login_time datetime,
	@hostname varchar(20),
	@login_name varchar(100),
	@SQLQUERY varchar(100),
	@spaceintempdb bigint,
	@spaceusedintempdb  bigint

declare cr_sqltext CURSOR READ_ONLY for
select session_id,internal_objects_alloc_page_count,internal_objects_dealloc_page_count,
user_objects_alloc_page_count, user_objects_dealloc_page_count
from sys.dm_db_task_space_usage where internal_objects_alloc_page_count &gt; 12000 

open cr_sqltext
fetch next from cr_sqltext into
	@spid,
	@internal_objects_alloc_page_count,
	@internal_objects_dealloc_page_count,
	@user_objects_alloc_page_count,
	@user_objects_dealloc_page_count

while @@fetch_status = 0
begin
	select
		@program_name = program_name,
		@login_time = login_time,
		@hostname = host_name,
		@login_name = login_name
	from sys.dm_exec_sessions where session_id = @spid

	select @SQLQUERY = 'dbcc inputbuffer('+convert(char(3),@spid)+')'

	insert into tempdb.guest.DBCCINPUTBUFFER exec (@SQLQUERY)
	select @sqltext = SQLText from tempdb.guest.DBCCINPUTBUFFER 

	insert into tempdb.guest.DBCCSHOWFILESTATS exec ('DBCC showfilestats with NO_INFOMSGS')
	select
		@spaceintempdb = sum(totalextents)/16,
		@spaceusedintempdb = sum(usedextents)/16
	from tempdb.guest.DBCCSHOWFILESTATS

	delete from tempdb.guest.DBCCINPUTBUFFER
	delete from tempdb.guest.DBCCSHOWFILESTATS

	insert tempdb.guest.monitorTempdb values
	(getdate(),
	@spaceintempdb,
	@spaceusedintempdb ,
	@spid, 	@sqltext,
	@internal_objects_alloc_page_count*8192/1048576 ,
	@internal_objects_dealloc_page_count*8192/1048576 ,
	@user_objects_alloc_page_count*8192/1048576 ,
	@user_objects_dealloc_page_count*8192/1048576 ,
	@program_name ,
	@login_time ,
	@hostname ,
	@login_name)

fetch next from cr_sqltext into
	@spid,
	@internal_objects_alloc_page_count,
	@internal_objects_dealloc_page_count,
	@user_objects_alloc_page_count,
	@user_objects_dealloc_page_count

end
close cr_sqltext
deallocate cr_sqltext
go</pre>
<p>Cette dernière partie peut être mise dans un job planifié toutes les minutes par exemple. C&#8217;est ainsi que j&#8217;ai découvert que sp_MSget_repl_commands et sp_MSdistribution_cleanup (procs de répli) peuvent être extrêmement consommatrices lorsque la file des requêtes à répliquer est très importante.</p>
<p>A+ [ David B. ]</p>
<p><script src="http://tcr.tynt.com/javascripts/Tracer.js?user=d4FlbGI04r35lZadbi-bpO" type="text/javascript"></script><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/bench-avec-netapp-datacore-esx/" rel="bookmark" title="26 avril 2011">Bench avec NetApp / Datacore / ESX</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-lenveloppe-de-tempdb/" rel="bookmark" title="7 juillet 2011">How-To : réduire l&#8217;enveloppe de tempdb</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
</ul>
<p><!-- Similar Posts took 2.250 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsql-server-sessions-consommatrices-dans-tempdb%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsql-server-sessions-consommatrices-dans-tempdb%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

