<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Business Geek &#187; SQL Server</title>
	<atom:link href="http://blog.djeepy1.net/tag/sql-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.djeepy1.net</link>
	<description>Journal d&#039;un consultant, expert en technologies Microsoft</description>
	<lastBuildDate>Wed, 18 Aug 2010 13:55:01 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.djeepy1.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/0dd4b3f2cbf56dd6a85a6e4f1dbbabb9?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Business Geek &#187; SQL Server</title>
		<link>http://blog.djeepy1.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.djeepy1.net/osd.xml" title="Business Geek" />
	<atom:link rel='hub' href='http://blog.djeepy1.net/?pushpress=hub'/>
		<item>
		<title>Fragmentation et plan de maintenance</title>
		<link>http://blog.djeepy1.net/2010/03/28/fragmentation-et-plan-de-maintenance/</link>
		<comments>http://blog.djeepy1.net/2010/03/28/fragmentation-et-plan-de-maintenance/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 09:20:40 +0000</pubDate>
		<dc:creator>Djeepy1</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Fragmentation]]></category>
		<category><![CDATA[Index]]></category>

		<guid isPermaLink="false">http://djeepy1.wordpress.com/2010/03/28/fragmentation-et-plan-de-maintenance/</guid>
		<description><![CDATA[Malheureusement, tout le monde ne le sait pas toujours mais une base de données se fragmente avec le temps. Je vous renvoie à un précédent post : http://blog.djeepy1.net/2008/08/13/indexation-gerer-la-fragmentation/ pour les détails. Le billet du jour est lié aux plans de maintenance “automatique”. En effet, je vois souvent des SI dans lesquels l’administrateur ou l’équipe de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.djeepy1.net&amp;blog=7511412&amp;post=204&amp;subd=djeepy1&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Malheureusement, tout le monde ne le sait pas toujours mais une base de données se fragmente avec le temps. Je vous renvoie à un précédent post : <a title="http://blog.djeepy1.net/2008/08/13/indexation-gerer-la-fragmentation/" href="http://blog.djeepy1.net/2008/08/13/indexation-gerer-la-fragmentation/">http://blog.djeepy1.net/2008/08/13/indexation-gerer-la-fragmentation/</a> pour les détails.</p>
<p>Le billet du jour est lié aux plans de maintenance “automatique”. En effet, je vois souvent des SI dans lesquels l’administrateur ou l’équipe de développement sont fiers de m’annoncer qu’ils ont mis des plans de maintenance en place pour gérer la fragmentation.</p>
<p>C’est bien sauf que, si la base est conséquente, ces maintenances automatiques peuvent faire plus de tort que de bien.</p>
<p>En effet, le composant <strong>Rebuild Index Task</strong>, dans sa configuration par défaut reconstruit <strong>TOUS</strong> les index de <strong>TOUTES</strong> les tables.</p>
<p><a href="http://djeepy1.files.wordpress.com/2010/03/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://djeepy1.files.wordpress.com/2010/03/image_thumb3.png?w=244&#038;h=153" width="244" height="153" /></a> </p>
<p>Le problème est que si vous avez des tables importantes (plusieurs millions de lignes et plusieurs Go de données), reconstruire l’index CLUSTERED peut être une opération lourde :</p>
<ul>
<li>Remplissage du LOG (si vous êtes en RECOVERY FULL) </li>
<li>Lock de la table (si vous êtes en Standard Edition) </li>
<li>Opération longue </li>
</ul>
<p>D’autant plus que la tâche génère un script SQL par ordre alphabetique des index et non dans un ordre logique. On reconstruirait normalement les CLUSTERED puis les NON-CLUSTERED.</p>
<p>Bref, j’ai été confronté à des situations où cette tâche engendrait plus de problèmes qu’elle n’en résolvait. Par exemple, la tâche qui dure jusqu’au petit matin, se superposant à un autre plan de maintenance (le backup), dégradant les performances d’un job de synchro, etc.</p>
<h5><u>La solution</u></h5>
<p>La solution consiste à faire un job un peu plus complexe. L’idée est de se baser sur la vue système nous donnant les infos de fragmentation : <strong>sys.dm_db_index_physical_stats</strong>. Déjà, on peut filtrer sur les index les plus fragmentés (&gt; 25/30% pour moi).</p>
<p>On croise ensuite avec les infos de l’index (type CLUSTERED ou non) et les infos de volumétrie (nombre de lignes) que l’on trouve respectivement dans <strong>sys.indexes</strong> et <strong>sys.partitions</strong>.</p>
<p>A partir de ces informations, je peux donc obtenir dynamiquement les instructions à jouer.</p>
<blockquote><pre class="csharpcode"><span class="kwrd">SELECT</span>
    Schema_Name(o.schema_id) <span class="kwrd">as</span> SchemaName,
    OBJECT_NAME(stat.object_id) <span class="kwrd">as</span> TableName,
    ix.name, stat.index_id,
    avg_fragmentation_in_percent, ix.fill_factor, <span class="kwrd">rows</span>,
    <span class="str">'Alter Index ['</span>+ ix.name
        + <span class="str">'] on ['</span> + Schema_Name(o.schema_id)
        + <span class="str">'].['</span> + OBJECT_NAME(stat.object_id)
        + <span class="str">'] Rebuild'</span> <span class="kwrd">as</span> <span class="kwrd">Statement</span>
<span class="kwrd">FROM</span> <font color="#008000">sys.dm_db_index_physical_stats</font>(
    DB_ID(<span class="str">'AdventureWorks'</span>),
    <span class="kwrd">NULL</span>,
    <span class="kwrd">NULL</span>, <span class="kwrd">NULL</span>, <span class="kwrd">NULL</span>) stat
  <span class="kwrd">inner</span> <span class="kwrd">join</span> <font color="#008000">sys.indexes</font> ix
    <span class="kwrd">on</span> ix.index_id = stat.index_id
    <span class="kwrd">and</span> ix.object_id = stat.object_id
  <span class="kwrd">inner</span> <span class="kwrd">join</span><font color="#008000"> sys.partitions</font> p
    <span class="kwrd">on</span> ix.index_id = p.index_id
    <span class="kwrd">and</span> ix.object_id = p.object_id
  <span class="kwrd">inner</span> <span class="kwrd">join</span> <font color="#008000">sys.objects</font> o <span class="kwrd">on</span> stat.object_id = o.object_id
<span class="kwrd">where</span> avg_fragmentation_in_percent &gt; 25
<span class="kwrd">order</span> <span class="kwrd">by</span> index_id, avg_fragmentation_in_percent desc</pre>
</blockquote>
<p>&#160;</p>
<p>Je prends toutefois ces informations avec précaution. En effet, j’essaie d’avoir <strong>une idée de la durée de chaque reconstruction</strong> en fonction de la volumétrie. Ceci pour faire ma planification au mieux. Par exemple si en testant (eh oui, le test reste primordial) je m’aperçois que la reconstruction de tel index prends 35 minutes, je l’isole et le planifie à part, à un moment où cela ne va pas gêner les autres tâches.</p>
<p>Pour cela, il suffit de bien connaître sa base et ce qui s’y passe.</p>
<p>&#160;</p>
<h5><u>Epilogue</u></h5>
<p>Malgré toute la pédagogie que nous pouvons faire lors de formation, consulting, projets, etc., les développeurs ne sont pas encore assez vigilants aux problématiques de base de données et pensent qu’un produit comme SQL Server se maintient tout seul à un haut niveau de performance. Je prends souvent la métophore avec l’automobile. Cela fait quelques siècles que ça existe et pourtant vous allez toujours au garage régulièrement <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>Evidemment, loin de moi l’idée d’entretenir le clivage DBA/développeurs. Mon métier de consultant me place bien souvent au milieu et je privilégie la pédagogie.</p>
<p><strong>Donc la règle à retenir : SQL Server est un produit puissant mais complexe, faites-vous aider par des spécialiste.</strong></p>
<br />Filed under: <a href='http://blog.djeepy1.net/category/sql-server/'>SQL Server</a> Tagged: <a href='http://blog.djeepy1.net/tag/fragmentation/'>Fragmentation</a>, <a href='http://blog.djeepy1.net/tag/index/'>Index</a>, <a href='http://blog.djeepy1.net/tag/sql-server/'>SQL Server</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/djeepy1.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/djeepy1.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/djeepy1.wordpress.com/204/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.djeepy1.net&amp;blog=7511412&amp;post=204&amp;subd=djeepy1&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.djeepy1.net/2010/03/28/fragmentation-et-plan-de-maintenance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d5bd484f181f5352c2e531cb5cc78aef?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">djeepy1</media:title>
		</media:content>

		<media:content url="http://djeepy1.files.wordpress.com/2010/03/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Soundex &#8211; recherche de mots ressemblants</title>
		<link>http://blog.djeepy1.net/2010/01/18/soundex-recherche-de-mots-ressemblants/</link>
		<comments>http://blog.djeepy1.net/2010/01/18/soundex-recherche-de-mots-ressemblants/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 08:25:21 +0000</pubDate>
		<dc:creator>Djeepy1</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Recherche]]></category>

		<guid isPermaLink="false">http://djeepy1.wordpress.com/2010/01/18/soundex-recherche-de-mots-ressemblants/</guid>
		<description><![CDATA[Question : j&#8217;ai besoin d&#8217;utiliser la fonction SoundEx de SQL Server, malheureusement il utilise un algorithme anglais (même si ma base est en français) Réponse : Revenons un peu sur le Soundex. Le Soudex est une méthode qui permet de savoir si 2 mots sont ressemblants, phonétiquement parlant. Pour cela, on traite le mots en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.djeepy1.net&amp;blog=7511412&amp;post=191&amp;subd=djeepy1&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong><u>Question :</u></strong> j&#8217;ai besoin d&#8217;utiliser la fonction SoundEx de SQL Server, malheureusement il utilise un algorithme anglais (même si ma base est en français)</p>
<p><strong><u>Réponse :</u></strong></p>
<p>Revenons un peu sur le Soundex. Le Soudex est une méthode qui permet de savoir si 2 mots sont ressemblants, phonétiquement parlant. Pour cela, on traite le mots en rapprochant les sons, en supprimant les éléments inutiles (doubles lettres, etc.) et on obtient une sorte de Hash du mot le représentant. On peut ensuite les comparer avec une fonction de distance.</p>
<p>Le Soundex est sympa à la base mais contrairement à la recherche FullText, Microsoft n’a jamais fait d’effort pour le promouvoir. Il existe de nombreux algorithmes de Soundex, Microsoft utilise le sien, mais forcément qui ne fonctionne pas dans tous les cas, notamment en multilingue.</p>
<p>Pour contourner cela, te faut soit acheter un composant tout prêt qui corresponde mieux au besoin ou à la langue. Soit l’implémenter soi-même avec une fonction CLR par exemple.</p>
<p>Frédéric Brouard a fait un super article sur le Soundex et propose des algos :</p>
<p><a href="http://sqlpro.developpez.com/cours/soundex/">http://sqlpro.developpez.com/cours/soundex/</a></p>
<br />Publié dans SQL Server Tagged: Recherche, SQL Server <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/djeepy1.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/djeepy1.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/djeepy1.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.djeepy1.net&amp;blog=7511412&amp;post=191&amp;subd=djeepy1&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.djeepy1.net/2010/01/18/soundex-recherche-de-mots-ressemblants/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d5bd484f181f5352c2e531cb5cc78aef?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">djeepy1</media:title>
		</media:content>
	</item>
	</channel>
</rss>