<?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; statistiques</title>
	<atom:link href="http://blog.capdata.fr/index.php/tag/statistiques/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>Retrouver les tables dont les stats ne sont plus compilées en automatique</title>
		<link>http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 17:09:28 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[statistiques]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=452</guid>
		<description><![CDATA[Quand on tombe sur un problème de performance de requête, il faut entre autres choses vérifier si les statistiques sur les tables ont bien été recompilées récemment. En effet, ce n&#8217;est pas parce que les options &#8216;auto create statistics&#8216; et &#8216;auto update statistics&#8216; sont activées pour une base que ses tables et indexes ont toujours [...]]]></description>
			<content:encoded><![CDATA[<p>Quand on tombe sur un problème de performance de requête, il faut entre autres choses vérifier si les statistiques sur les tables ont bien été recompilées récemment. En effet, ce n&#8217;est pas parce que les options &#8216;<em>auto create statistics</em>&#8216; et &#8216;<em>auto update statistics</em>&#8216; sont activées pour une base que ses tables et indexes ont toujours des statistiques à jour.</p>
<p>On va créer une base de test pour démontrer ce point:</p>
<pre><span style="color: #000080;">create database test_statistics</span></pre>
<p>On va vérifier si les options de création et de mise à jour auto sont bien activées</p>
<pre><span style="color: #000080;">select databasepropertyex('test_statistics','IsAutoCreateStatistics')
select databasepropertyex('test_statistics','IsAutoUpdateStatistics')</span></pre>
<pre><span style="color: #008000;"><em>1
1</em></span></pre>
<p>On créé un peu de volumétrie et on ajoute les indexes clusterisés</p>
<pre><span style="color: #000080;">use test_statistics
create table STATS1(a numeric identity, b varchar(400))
create table STATS2(a numeric identity, b varchar(400))
insert into STATS1 values (replicate('a',400))
go 1000
insert into STATS2 values (replicate('a',400))
go 1000
alter table STATS1 add constraint PK_STATS1 primary key (a)
alter table STATS2 add constraint PK_STATS2 primary key (a)</span></pre>
<p>On fixe ensuite la date de dernière mise à jour des stats pour les deux tables avec STATS_DATE()</p>
<pre><span style="color: #000080;">select object_name(object_id), stats_date(object_id,stats_id) FROM sys.stats S
inner</span><span style="color: #000080;"> join sys.tables T on T.object_id = S.object_id

</span><span style="color: #008000;"><em>STATS1    2010-01-28 17:41:45.617
STATS2    2010-01-28 17:41:45.963</em>
</span></pre>
<p>A partir de là, on va forcer le calcul des stats en <strong>NORECOMPUTE </strong>sur STATS1 seulement et revérifier les dates de stats. <strong>NORECOMPUTE </strong>aura pour effet de dire à SQL Server de ne plus compiler en auto sur cette table.</p>
<pre><span style="color: #000080;">update statistics dbo.STATS1 PK_STATS1 WITH NORECOMPUTE</span>
<em><span style="color: #808080;"><span style="color: #008000;"> Command(s) completed successfully.</span>
</span></em><span style="color: #000080;">
select object_name(S.object_id), stats_date(S.object_id,S.stats_id) FROM sys.stats S
inner join sys.tables T on T.object_id = S.object_id
</span><span style="color: #808080;"><em><span style="color: #008000;">STATS1    2010-01-28</span> <span style="color: #ff0000;"><strong>17:42:14.350 </strong></span></em></span><em>
<span style="color: #008000;">STATS2    2010-01-28 17:41:45.963</span></em>
</pre>
<p>La date pour STATS1 a bien été modifiée. OK<br />
On va générer quelques perturbations identiques aux niveau des deux tables comme ajouter une colonne, supprimer des lignes, etc de manière à déclencher <strong>statman</strong>, l&#8217;utilitaire de recompilation auto des stats&#8230; On le verra passer dans une session Profiler:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/01/autostats.png"><img class="alignnone size-full wp-image-455" title="autostats" src="http://blog.capdata.fr/wp-content/uploads/2010/01/autostats.png" alt="" width="469" height="331" /></a></p>
<p>Si  on revérifie maintenant les dates de mise à jour:</p>
<pre><span style="color: #000080;">select object_name(S.object_id), stats_date(S.object_id,S.stats_id) FROM sys.stats S
inner join sys.tables T on T.object_id = S.object_id</span>
<span style="color: #808080;"><em><span style="color: #008000;">STATS1    2010-01-28 17:42:14.350
</span><span style="color: #008000;">STATS2    2010-01-28 </span><span style="color: #ff0000;"><strong>17:47:59.630</strong></span></em></span></pre>
<p>Cette fois seule STATS2 a été modifiée. Il faudra donc que je prévoie de mettre à jour manuellement STATS1 à intervalles réguliers, 1 fois par jour la nuit par exemple.</p>
<p><strong>Conclusion </strong>pour retrouver sur une base les tables qui sont passées en norecompute au niveau des stats:</p>
<pre><span style="color: #000080;">select T.name 'tablename', S.name 'statsname', S.no_recompute
from sys.tables T
INNER JOIN sys.stats S on S.object_id = T.object_id
WHERE S.no_recompute = 1</span>

<em><span style="color: #808080;"><span style="color: #008000;">tablename             statsname                        no_recompute
-------------------  -------------------------------  ------------------------------
STATS1                PK_STATS1                       1
</span>
</span></em></pre>
<p><span style="color: #000000;"><em>A+ [David B.]</em></span></p>
<p><em><span style="color: #808080;"> </span></em></p>
<p><script type="text/javascript" src="http://tcr.tynt.com/javascripts/Tracer.js?user=d4FlbGI04r35lZadbi-bpO"></script><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/" rel="bookmark" title="13 juillet 2011">Point-in-time recovery et fn_dump_dblog()</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/comment-limiter-les-alertes-liees-a-la-journalisation-checkpoint-not-completed-et-compagnie/" rel="bookmark" title="8 juillet 2011">Checkpoint not complete: Comment limiter les alertes liées à la journalisation</a> (Louis PROU) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-la-taille-du-journal-de-transactions-sur-disque/" rel="bookmark" title="11 juillet 2011">How-To: réduire la taille du journal de transactions sur disque</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/consistence-des-ecritures-avec-sata/" rel="bookmark" title="13 mars 2011">Consistence des écritures avec SATA</a> (David BAFFALEUF) [Operating SystemSQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.412 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-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique%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-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

