<?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>David Barbarin &#187; SQL Server 2000</title>
	<atom:link href="https://blog.developpez.com/mikedavem/pcategory/sql-server-2000/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/mikedavem</link>
	<description>MVP DataPlatform - MCM SQL Server</description>
	<lastBuildDate>Thu, 09 Sep 2021 21:19:50 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>NOLOCK n&#8217;est définitivement pas ce que vous croyez</title>
		<link>https://blog.developpez.com/mikedavem/p12997/sql-server-2005/nolock-nest-definitivement-pas-ce-que-vous-croyez</link>
		<comments>https://blog.developpez.com/mikedavem/p12997/sql-server-2005/nolock-nest-definitivement-pas-ce-que-vous-croyez#comments</comments>
		<pubDate>Fri, 19 Feb 2016 07:37:22 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[concurrence]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[hint]]></category>
		<category><![CDATA[NOLOCK]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[verrouillage]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1172</guid>
		<description><![CDATA[Pour ceux qui croient encore qu&#8217;utiliser le hint nolock se prémunit contre tout verrou, lisez la suite de ce billet. J&#8217;avais déjà écrit un billet précédent sur le sujet il y a 3 ans environ, lorsque j&#8217;étais chez un client &#8230; <a href="https://blog.developpez.com/mikedavem/p12997/sql-server-2005/nolock-nest-definitivement-pas-ce-que-vous-croyez">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour ceux qui croient encore qu&rsquo;utiliser le hint nolock se prémunit contre tout verrou, lisez la suite de ce billet. J&rsquo;avais déjà écrit un <a href="http://blog.developpez.com/mikedavem/p11994/sql-server-2005/set-transaction-isolation-level-unreadcommited-et-nolock-pas-de-verrous" target="_blank">billet précédent</a> sur le sujet il y a 3 ans environ, lorsque j&rsquo;étais chez un client et que nous avions eu une discussion intéressante sur ce type de hint placé dans les requêtes de Reporting. Cette fois, j&rsquo;ai pu expérimenté chez un autre client, une problématique de verrouillage intéressante en utilisant ce même hint.</p>
<p>&gt; <a href="http://blog.dbi-services.com/nolock-is-definitely-not-what-you-may-expect/" target="_blank">Lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Envie de faire un benchmark de votre stockage? Il est temps de passer à diskspd</title>
		<link>https://blog.developpez.com/mikedavem/p12946/sql-server-2005/envie-de-faire-un-benchmark-de-votre-stockage-il-est-temps-de-passer-a-diskspd</link>
		<comments>https://blog.developpez.com/mikedavem/p12946/sql-server-2005/envie-de-faire-un-benchmark-de-votre-stockage-il-est-temps-de-passer-a-diskspd#comments</comments>
		<pubDate>Tue, 03 Nov 2015 13:21:51 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[DiskSpd]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[SQLIO]]></category>
		<category><![CDATA[stockage]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1120</guid>
		<description><![CDATA[Comme vous le savez certainement, SQLIO est officiellement dépréciée depuis quelques mois. Pour ma part, j&#8217;ai eu l&#8217;occasion (peut être la dernière) d&#8217;utiliser SQLIO pour un projet client dans le but d&#8217;effectuer un benchmark de son stockage et préparer une &#8230; <a href="https://blog.developpez.com/mikedavem/p12946/sql-server-2005/envie-de-faire-un-benchmark-de-votre-stockage-il-est-temps-de-passer-a-diskspd">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Comme vous le savez certainement, SQLIO est officiellement dépréciée depuis quelques mois. Pour ma part, j&rsquo;ai eu l&rsquo;occasion (peut être la dernière) d&rsquo;utiliser SQLIO pour un projet client dans le but d&rsquo;effectuer un benchmark de son stockage et préparer une installation AlwaysOn et groupes de disponibilité. Il est maintenant temps de passer au prochain outil prévu à cet effet: DiskSpd.</p>
<p>&gt; <a href="http://blog.dbi-services.com/want-to-benchmark-your-storage-its-time-to-switch-to-sqlspd-tool/" target="_blank">Lire la suite </a>(en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jointure, transitivité et simplification de requête</title>
		<link>https://blog.developpez.com/mikedavem/p12939/sql-server-2005/jointure-transitivite-et-simplification-de-requete</link>
		<comments>https://blog.developpez.com/mikedavem/p12939/sql-server-2005/jointure-transitivite-et-simplification-de-requete#comments</comments>
		<pubDate>Mon, 02 Nov 2015 13:55:18 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[jointure]]></category>
		<category><![CDATA[optimiseur]]></category>
		<category><![CDATA[optimizer]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[transitive]]></category>
		<category><![CDATA[transitivité]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1096</guid>
		<description><![CDATA[Au cours d&#8217;une discussion hier avec un de mes amis &#171;&#160;oraclien&#160;&#187; nous avons débattu sur les différents comportements d&#8217;optimisation entre Oracle et SQL Server sur un cas bien précis. Vous pouvez lire son billet ici et trouver un script pour &#8230; <a href="https://blog.developpez.com/mikedavem/p12939/sql-server-2005/jointure-transitivite-et-simplification-de-requete">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Au cours d&rsquo;une discussion hier avec un de mes amis &laquo;&nbsp;oraclien&nbsp;&raquo; nous avons débattu sur les différents comportements d&rsquo;optimisation entre Oracle et SQL Server sur un cas bien précis. Vous pouvez lire son billet <a href="http://blog.dba-ob.com/post/2015/09/09/optimisation-de-requete" target="_blank">ici</a> et trouver un script pour reproduire le problème par vous même. J&rsquo;ai donc décidé d&rsquo;écrire un billet à mon tour parce que cette discussion avait introduit des concepts intéressants que je voulais approfondir côté SQL Server.</p>
<p>&gt; <a href="http://blog.dbi-services.com/join-transitive-closure-and-query-simplification-considerations/" target="_blank">Pour lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>N&#8217;utilisez pas les paramètres par défaut AUTOGROW!</title>
		<link>https://blog.developpez.com/mikedavem/p12935/sql-server-2005/nutilisez-pas-les-parametres-par-defaut-autogrow</link>
		<comments>https://blog.developpez.com/mikedavem/p12935/sql-server-2005/nutilisez-pas-les-parametres-par-defaut-autogrow#comments</comments>
		<pubDate>Mon, 02 Nov 2015 13:19:46 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[autogrow]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1081</guid>
		<description><![CDATA[Au cours de mes audits clients, j&#8217;ai souvent vu les paramètres d&#8217;expansion de fichiers par défaut sur les bases de données utilisateurs et comme vous le savez ceci n&#8217;est pas forcément une bonne pratique. Laissez moi vous raconter une histoire &#8230; <a href="https://blog.developpez.com/mikedavem/p12935/sql-server-2005/nutilisez-pas-les-parametres-par-defaut-autogrow">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Au cours de mes audits clients, j&rsquo;ai souvent vu les paramètres d&rsquo;expansion de fichiers par défaut sur les bases de données utilisateurs et comme vous le savez ceci n&rsquo;est pas forcément une bonne pratique. Laissez moi vous raconter une histoire drôle vécue qui concerne une situation extrême avec un fichier journal et ses paramètres par défaut.</p>
<p>&gt; <a href="http://blog.dbi-services.com/dont-use-the-default-database-file-autogrow-settings/" target="_blank">Pour lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MVP SQL Server pour la 5ème année</title>
		<link>https://blog.developpez.com/mikedavem/p12556/sql-server-2005/889</link>
		<comments>https://blog.developpez.com/mikedavem/p12556/sql-server-2005/889#comments</comments>
		<pubDate>Tue, 01 Apr 2014 21:15:08 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=889</guid>
		<description><![CDATA[C&#8217;est officiel je suis renouvelé pour la 5ème fois en tant que MVP SQL Server. Enjoy ! David BARBARIN (Mikedavem) MVP et MCM SQL Server]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est officiel je suis renouvelé pour la 5ème fois en tant que MVP SQL Server.</p>
<p>Enjoy !</p>
<p>David BARBARIN (Mikedavem)<br />
MVP et MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVP SQL Server : Quatri&#232;me chapitre pour l&#8217;ann&#233;e 2013</title>
		<link>https://blog.developpez.com/mikedavem/p11876/sql-server-2005/mvp-sql-server-quatrime-chapitre-pour-lanne-2013</link>
		<comments>https://blog.developpez.com/mikedavem/p11876/sql-server-2005/mvp-sql-server-quatrime-chapitre-pour-lanne-2013#comments</comments>
		<pubDate>Mon, 01 Apr 2013 17:45:05 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=406</guid>
		<description><![CDATA[Pas de poisson d&#8217;avril et une vraie bonne nouvelle de la part de Microsoft aujourd&#8217;hui : le renouvèlement de mon titre de MVP SQL Server pour la 4ème fois. J&#8217;en profite pour remercier Martine Tiphaine et Microsoft une nouvelle fois &#8230; <a href="https://blog.developpez.com/mikedavem/p11876/sql-server-2005/mvp-sql-server-quatrime-chapitre-pour-lanne-2013">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pas de poisson d&rsquo;avril et une vraie bonne nouvelle de la part de Microsoft aujourd&rsquo;hui : le renouvèlement de mon titre de MVP SQL Server pour la 4ème fois. </p>
<p>J&rsquo;en profite pour remercier Martine Tiphaine et Microsoft une nouvelle fois !</p>
<p>&#160;</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/MVP-SQL-Server--Troisime-chapitre-pour-l_631A/mvp_2.jpg"><img title="mvp" border="0" alt="mvp" src="http://blog.developpez.com/media/269/Windows-Live-Writer/MVP-SQL-Server--Troisime-chapitre-pour-l_631A/mvp_thumb.jpg" width="161" height="65" /></a></p>
<p>&#160;</p>
<p>David BARBARIN (Mikedavem)    <br />MVP SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les journ&#233;es SQL Server&#8211;second volet</title>
		<link>https://blog.developpez.com/mikedavem/p11302/sql-server-2005/les-journes-sql-serversecond-volet</link>
		<comments>https://blog.developpez.com/mikedavem/p11302/sql-server-2005/les-journes-sql-serversecond-volet#comments</comments>
		<pubDate>Thu, 13 Sep 2012 06:03:38 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[Evénements]]></category>
		<category><![CDATA[SQL Azure]]></category>
		<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2012]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=170</guid>
		<description><![CDATA[&#160; &#160; &#160; Le premier volet des journées SQL Server a visiblement connu un très grand succès. C’est la raison pour laquelle GUSS s’est relancé dans la préparation d’un second volet qui devrait se dérouler en décembre. Les dates définitives &#8230; <a href="https://blog.developpez.com/mikedavem/p11302/sql-server-2005/les-journes-sql-serversecond-volet">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&#160;</p>
<p>&#160;</p>
<p><img src="http://blog.capdata.fr/wp-content/uploads/2012/09/jss2012-full-header31.png" /></p>
<p>&#160;</p>
<p>Le premier volet des journées SQL Server a visiblement connu un très grand succès. C’est la raison pour laquelle GUSS s’est relancé dans la préparation d’un second volet qui devrait se dérouler en décembre. Les dates définitives seront communiqués un peu plus tard. Cependant pour que cet évènement soit de nouveau un succès nous avons besoin de vos avis qui se présente sous la forme d’un sondage qui ne vous prendra que quelques minutes de votre temps <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none;border-left-style: none;border-bottom-style: none;border-right-style: none" alt="Sourire" src="http://blog.developpez.com/mikedavem/files/2012/09/wlEmoticon-smile1.png" /> et qui nous permettront de mieux cibler vos attentes à tous les niveaux (contenu des sessions, organisation etc …)</p>
<p>Pour le remplir c’est par <a href="http://guss.fr/jss-2012.aspx">ici</a></p>
<p>Merci par avance !!</p>
<p>&#160;</p>
<p>David BARBARIN (Mikedavem)    <br />MVP SQL Server </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interpréter les noms de statistiques créées automatiquement par l’optimisateur de requêtes de SQL Server</title>
		<link>https://blog.developpez.com/mikedavem/p11200/sql-server-2005/statistiques_crees_automatiquement_par_l</link>
		<comments>https://blog.developpez.com/mikedavem/p11200/sql-server-2005/statistiques_crees_automatiquement_par_l#comments</comments>
		<pubDate>Sun, 05 Aug 2012 10:27:11 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour ceux qui se demandent comment interpréter les noms de statistiques créées automatiquement par l&#8217;optimisateur de requêtes ce billet est pour vous . Comme vous le savez sans doute lorsqu&#8217;un index créé des statistiques lui sont également associées. Ces dernières &#8230; <a href="https://blog.developpez.com/mikedavem/p11200/sql-server-2005/statistiques_crees_automatiquement_par_l">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour ceux qui se demandent comment interpréter les noms de statistiques créées automatiquement par l&rsquo;optimisateur de requêtes ce billet est pour vous <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sourire" src="http://blog.developpez.com/media/269/Windows-Live-Writer/e25eb18ec918_98BD/wlEmoticon-smile_2.png" />. Comme vous le savez sans doute lorsqu&rsquo;un index créé des statistiques lui sont également associées. Ces dernières servent à l&rsquo;optimisateur de requêtes afin de déterminer un plan optimal pour retrouver les données initiés par une requête. Autrement dit en fonction des cardinalités ou de la sélectivité des données sous jacentes celui-ci va déterminer quelle(s) méthode(s) il devra pour utiliser pour les retrouver avec un minimum de coût.  Cependant que se passe-t-il lorsqu&rsquo;une requête composée d&rsquo;un prédicat ne concerne pas un index ? He bien celui-ci va créer des statistiques sur la ou les colonnes concernées pour pouvoir estimer la cardinalité des données à retourner. Ces statistiques se retrouvent sous la forme _WA_Sys_00000004_0F382DC6 par exemple. Comment interpréter ce nom plutôt abscons à première vue. C&rsquo;est ce que nous allons voir dans la suite de billet.</p>
<p><span id="more-103"></span></p>
<p>En réalité la décomposition du nom fourni par l&rsquo;optimisateur n&rsquo;est pas très compliquée,  encore faut-il savoir le décomposer. </p>
<p>_WA_Sys_00000004_0F382DC6 :  </p>
<table border="1" cellspacing="0" cellpadding="2" width="998">
<tbody>
<tr>
<td valign="top" width="200"> _WA_Sys_</td>
<td valign="top" width="796"> Préfixe donné par l&rsquo;optimiseur de requêtes pour une statistique créée automatiquement</td>
</tr>
<tr>
<td valign="top" width="200"> 00000004</td>
<td valign="top" width="796"> Valeur hexadécimale du numéro de colonne de la table concernée par la statistique créée automatiquement</td>
</tr>
<tr>
<td valign="top" width="200"> 0F382DC6</td>
<td valign="top" width="796"> Valeur hexadécimale de l&rsquo;Id de la table concernée par la statistique créée automatiquement</td>
</tr>
</tbody>
</table>
<p>Pour résumée une statique auto incrémentée est identifiée par l&rsquo;Id de la table et le numéro de la colonne qui est concernée par notre statistique.</p>
<p>Voici une fonction (seulement pour s&rsquo;amuser) qui permet de retrouver toutes ces informations : </p>
<blockquote><p><strong>CREATE FUNCTION stat_details (@stat_name SYSNAME)       <br />RETURNS TABLE        <br />AS         <br />RETURN        <br />(        <br /> SELECT OBJECT_NAME(CAST(CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(REVERSE(@stat_name), 1, CHARINDEX(&lsquo;_&rsquo;, REVERSE(@stat_name)) &#8211; 1)), 2) AS INT)) AS table_name,        <br /> name AS column_name        <br /> FROM sys.columns        <br /> WHERE object_id = CAST(CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(REVERSE(@stat_name), 1, CHARINDEX(&lsquo;_&rsquo;, REVERSE(@stat_name)) &#8211; 1)), 2) AS INT)        <br />  AND column_id = CAST(CONVERT(VARBINARY(MAX), SUBSTRING(SUBSTRING(@stat_name, LEN(&lsquo;_WA_Sys_&rsquo;) + 1, LEN(@stat_name)), 1, CHARINDEX(&lsquo;_&rsquo;, SUBSTRING(@stat_name, LEN(&lsquo;_WA_Sys_&rsquo;) + 1, LEN(@stat_name))) &#8211; 1)  , 2) AS INT)        <br />)</strong></p>
</blockquote>
<p>On peut l&rsquo;utiliser comme ceci :</p>
<blockquote><p><strong>USE AdventureWorks;       <br />GO</strong></p>
<p><strong>SELECT       <br /> s.name,        <br /> c.table_name,        <br /> c.column_name        <br />FROM sys.stats AS s        <br />CROSS APPLY dbo.stat_details(s.name) AS c        <br />WHERE s.object_id = OBJECT_ID(&lsquo;dbo.SalesOrderDetail&rsquo;)        <br /> AND s.auto_created = 1; &#8212; Statistique créée automatiquement par l&rsquo;optimiseur</strong></p>
</blockquote>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/e25eb18ec918_98BD/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/e25eb18ec918_98BD/image_thumb.png" width="430" height="88" /></a></p>
<p> </p>
<p>J&rsquo;ai bien précisé pour s&rsquo;amuser avec les valeurs hexadécimales <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sourire" src="http://blog.developpez.com/media/269/Windows-Live-Writer/e25eb18ec918_98BD/wlEmoticon-smile_2.png" />  &#8230; on peut bien sûr retrouver ce même résultat plus facilement en utilisant une autre DMV adéquate sys.stat_columns :</p>
<blockquote><p><strong>SELECT        <br /> s.name,        <br /> o.name AS table_name,        <br /> c.name AS colum_name        <br />FROM sys.stats_columns AS sc        <br /> JOIN sys.objects AS o        <br />  ON sc.object_id = o.object_id        <br /> JOIN sys.stats AS s        <br />  on s.stats_id = sc.stats_id        <br />   AND s.object_id = o.object_id        <br /> JOIN sys.columns AS c        <br />  on c.object_id = sc.object_id        <br />   AND c.column_id = sc.column_id        <br />WHERE o.object_id = OBJECT_ID(&lsquo;dbo.SalesOrderDetail&rsquo;)        <br /> AND s.auto_created = 1;</strong></p>
</blockquote>
<p> </p>
<p>Bonne statistique !!</p>
<p>David BARBARIN (Mikedavem)    <br />MVP SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trouver un login de type Windows par son SID Windows</title>
		<link>https://blog.developpez.com/mikedavem/p11192/sql-server-2005/trouver_un_login_de_type_windows_par_son</link>
		<comments>https://blog.developpez.com/mikedavem/p11192/sql-server-2005/trouver_un_login_de_type_windows_par_son#comments</comments>
		<pubDate>Mon, 30 Jul 2012 08:40:01 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il peut arriver parfois de vouloir retrouver un login Windows via son SID (ou Security Identifier) au format Windows sur une instance SQL Server. Le problème est que le SID stocké sur SQL Server est au format varbinary(85). Il nous &#8230; <a href="https://blog.developpez.com/mikedavem/p11192/sql-server-2005/trouver_un_login_de_type_windows_par_son">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il peut arriver parfois de vouloir retrouver un login Windows via son SID (ou Security Identifier) au format Windows sur une instance SQL Server. Le problème est que le SID stocké sur SQL Server est au format varbinary(85). Il nous faut donc formater la valeur de cette colonne pour pouvoir la mettre au format Windows S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXX. </p>
<p><span id="more-102"></span></p>
<p>En connaissant la forme d&rsquo;un SID Windows on peut donc retrouver le retrouver à partir du SID stocké dans SQL Server. Pour cela on peut créer une fonction de la sorte (que l&rsquo;on peut retrouver sur beaucoup de sites internet, je ne l&rsquo;ai pas inventé <img src="https://blog.developpez.com/mikedavem/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> ) :</p>
<p> </p>
<blockquote><p><strong>CREATE FUNCTION fn_SIDToString        <br />(         <br />  @BinSID AS VARBINARY(100)         <br />)         <br />RETURNS VARCHAR(100)         <br />AS BEGIN</strong></p>
<p><strong>  IF LEN(@BinSID) % 4 &lt;&gt; 0 RETURN(NULL)</strong></p>
<p><strong>  DECLARE @StringSID VARCHAR(100)        <br />  DECLARE @i AS INT         <br />  DECLARE @j AS INT</strong></p>
<p><strong>  SELECT @StringSID = &lsquo;S-&lsquo;        <br />     + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 1, 1))))         <br />  SELECT @StringSID = @StringSID + &lsquo;-&lsquo;         <br />     + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 3, 6))))</strong></p>
<p><strong>  SET @j = 9        <br />  SET @i = LEN(@BinSID)</strong></p>
<p><strong>  WHILE @j &lt; @i        <br />  BEGIN         <br />    DECLARE @val BINARY(4)         <br />    SELECT @val = SUBSTRING(@BinSID, @j, 4)         <br />    SELECT @StringSID = @StringSID + &lsquo;-&lsquo;         <br />      + CONVERT(VARCHAR, CONVERT(BIGINT, CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @val)))))         <br />    SET @j = @j + 4         <br />  END         <br />  RETURN ( @StringSID )         <br />END</strong>       </p>
</blockquote>
<p>Il suffit ensuite d&rsquo;utiliser la fonction précédemment créée pour retrouver notre utilisateur via son SID Windows :</p>
<blockquote><p><strong>SELECT        <br />name,         <br />sid,         <br />type,         <br />type_desc         <br />FROM sys.server_principals         <br />WHERE dbo.fn_SIDToString(sid) = &lsquo;S-1-5-21-1560703034-4098287726-863964163-8814&prime;</strong></p>
</blockquote>
<p>qui donne</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Trouver-un-login-de-type-Windows-par-son_12246/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Trouver-un-login-de-type-Windows-par-son_12246/image_thumb_1.png" width="685" height="54" /></a></p>
<p> </p>
<p>David BARBARIN (Mikedavem)    <br />MVP SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buffer Cache Hit Ratio : seul compteur à surveiller pour détecter une pression mémoire ?</title>
		<link>https://blog.developpez.com/mikedavem/p11137/sql-server-2005/buffer_cache_hit_ratio_seul_compteur_a_s</link>
		<comments>https://blog.developpez.com/mikedavem/p11137/sql-server-2005/buffer_cache_hit_ratio_seul_compteur_a_s#comments</comments>
		<pubDate>Fri, 06 Jul 2012 18:44:59 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2000]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un petit billet sur un compteur que vous connaissez certainement tous et qui permet en autre de détecter une pression mémoire sur une instance SQL Server. Seulement en faisant un audit des compteurs de surveillance d&#8217;un de mes clients, je &#8230; <a href="https://blog.developpez.com/mikedavem/p11137/sql-server-2005/buffer_cache_hit_ratio_seul_compteur_a_s">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un petit billet sur un compteur que vous connaissez certainement tous et qui permet en autre de détecter une pression mémoire sur une instance SQL Server. Seulement en faisant un audit des compteurs de surveillance d&rsquo;un de mes clients, je me suis aperçu qu&rsquo;il n&rsquo;utilisait que ce dernier pour détecter la présence ou non une pression mémoire sur l&rsquo;ensemble des instances de son parc. Je lui ai donc expliqué que l&rsquo;utilisation unique de ce compteur ne permettait pas à tous les coups de détecter un problème d&rsquo;utilisation mémoire. Je vous propose de voir pourquoi dans ce billet.</p>
<p><span id="more-101"></span></p>
<p>Tout d&rsquo;abord commençons par regarder la définition de cet compteur :</p>
<blockquote><p><em>&laquo;&nbsp;Percentage of pages found in the buffer cache without having to read from disk. The ratio is the total number of cache hits divided by the total number of cache lookups over the last few thousand page accesses. After a long period of time, the ratio moves very little. Because reading from the cache is much less expensive than reading from disk, you want this ratio to be high. Generally, you can increase the buffer cache hit ratio by increasing the amount of memory available to SQL Server.&nbsp;&raquo;</em> </p>
</blockquote>
<p>Ce compteur représente donc le pourcentage de pages qui seront satisfaites directement depuis le cache de données SQL Server sans avoir à les récupérer sur disque. On peut donc facilement comprendre que la diminution de ce ratio peut signifier qu&rsquo;il existe un problème potentiel de pression mémoire puisque les accès aux pages de données seront feront d&rsquo;abord sur disque et ensuite dans le cache de données. Si ce compteur est directement représentatif d&rsquo;un problème de mémoire alors pourquoi la surveillance unique de ce dernier ne suffit-elle pas ? Pour répondre à cette question faisons un test :</p>
<p>Créons une base de données avec une table ayant une volumétrie supérieure à la taille du cache alloué à SQL Server pour garantir que SQL Server devra effectuer des lectures physiques pour récupérer les pages de données nécessaires à nos requêtes. Si l&rsquo;on suit la définition de notre compteur Buffer Cache Hit Ratio nous devrions voir une diminution du ration pendant notre test. J&rsquo;ai limité volontairement la taille du cache de données à 1Go et j&rsquo;ai créé une table avec une taille légèrement supérieure à 3Go.</p>
<blockquote><p><strong>EXEC sp_configure N&rsquo;show advanced options&rsquo; , N&rsquo;1&prime;        <br />RECONFIGURE WITH OVERRIDE         <br />GO         <br />EXEC sp_configure N&rsquo;max server memory (MB)&rsquo; , N&rsquo;1024&prime;         <br />GO         <br />RECONFIGURE WITH OVERRIDE         <br />GO</strong></p>
</blockquote>
<blockquote><p><strong>CREATE DATABASE test_buffer_cache_hit_ratio;        <br />GO</strong></p>
<p><strong>USE test_buffer_cache_hit_ratio;        <br />GO</strong></p>
<p><strong>CREATE TABLE dbo.test        <br />(         <br />id INT IDENTITY(1,1),         <br />col1 CHAR(1000),         <br />col2 CHAR(1000),         <br />col3 CHAR(1000)         <br />);         <br />GO</strong></p>
<p><strong>INSERT dbo.test (col1, col2, col3) VALUES (REPLICATE(&lsquo;T&rsquo;, 1000), REPLICATE(&lsquo;T&rsquo;, 1000), REPLICATE(&lsquo;T&rsquo;, 1000))        <br />GO 818998         <br /></strong></p>
</blockquote>
<p>Vérifions la taille de notre table :</p>
<blockquote><p><strong>EXEC sp_spaceused &lsquo;dbo.test';        <br />GO</strong></p>
</blockquote>
<p>qui donne une table de 3199 Mo :</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_thumb.png" width="418" height="52" /></a></p>
<p> </p>
<p>Pendant notre test je vous propose d&rsquo;ajouter d&rsquo;autres compteurs qui nous seront utiles pour démontrer que l&rsquo;utilisation unique du compteur BCHR n&rsquo;est pas judicieuse.</p>
<ul>
<li><u>Page Life Expectancy</u> : qui représenta la durée de vie en seconde d&rsquo;une page dans le cache de données SQL Server sans être référencée </li>
<li><u>Page reads/sec</u> : qui représente le nombre de lectures physique par seconde effectuée par SQL Server. Il faut comprendre ici que la ou les pages concernés ne sont pas lues depuis le cache de données. Autant dire que cette valeur doit être la plus petite possible. </li>
<li><u>Free pages</u> : qui représente le nombre de pages libres disponible pour une allocation immédiate dans le cache de données  </li>
</ul>
<p>J&rsquo;ai également rajouté un compteur lié à l&rsquo;utilisation des disques à savoir :</p>
<ul>
<li><u>Disks Read/sec</u> : qui représente le nombre d&rsquo;IO en lecture par seconde </li>
</ul>
<p> </p>
<p>D&rsquo;autres compteurs sont présents dans la démonstration mais seuls ceux cités plus haut nous servirons dans le cadre du présent billet. La situation primaire est la suivante :</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_thumb_1.png" width="418" height="200" /></a></p>
<p>Une situation plutôt pérenne avec un BCHR de 100%, une durée de vie de page dans le cache  596 minutes  et un nombre conséquent de pages libres dans le buffer. Pour lancer nos requêtes j&rsquo;utiliserai un outil plutôt sympathique pour notre exercice : <u>SQLQueryStress</u>.</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/icon_arrow_2.gif"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="icon_arrow" border="0" alt="icon_arrow" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/icon_arrow_thumb.gif" width="15" height="15" /></a> 1ère phase : Avec SQLQueryStress je lance une requête sans impact majeure (sur la base AdventureWorks) sur le cache avec suffisamment d&rsquo;itération (10000) pour que celle puisse durer le temps de notre test. Au préalable j&rsquo;aurai vidé le cache de données SQL Server. </p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/icon_arrow_4.gif"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="icon_arrow" border="0" alt="icon_arrow" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/icon_arrow_thumb_1.gif" width="15" height="15" /></a> 2ème phase : Je lance une seconde requête qui va venir remplir notre cache de données en interrogeant les données de notre table <em>dbo.test</em> précédemment créé.</p>
<p> </p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_6.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_thumb_2.png" width="1149" height="388" /></a></p>
<p> </p>
<p>et voici les résultats :</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_8.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_thumb_3.png" width="818" height="539" /></a></p>
<p>Un peu d&rsquo;explication est nécessaire parmi tout ces lignes de monitoring. A l&rsquo;étape 1 on voit un pic de diminution du buffer cache hit ratio associé à une montée soudaine des lectures de pages sur disque. Cette première phase est tout à fait normal car ayant vider le cache des données au préalable SQL Server est obligé d&rsquo;aller chercher la première fois les données sur disque. On constate d&rsquo;ailleurs que la valeur du cache hit ratio se stabilise par la suite et qu&rsquo;aucune lecture des pages n&rsquo;est faite sur disque. </p>
<p>A l&rsquo;étape 2 j&rsquo;augmente la charge en exécutant la 2ème requête qui interroge notre fameuse table <em>dbo.test</em>. On constate presque instantanément que le nombre de lectures disques augmente (compteurs <em>Disk Read/sec</em> et <em>Page read/sec</em>). En revanche on se ne voit pas de changement radical de valeur pour le BCHR. </p>
<p>A l&rsquo;étape 2 &#8211; P1, la durée de vie d&rsquo;une page dans le cache de données chute drastiquement. En effet, comme la table <em>dbo.test</em> ne tient pas en mémoire SQL Server est obligé de vider les pages du cache de données pour satisfaire l&rsquo;exécution simultanée de nos 2 requêtes. Mais encore une fois on ne voit aucun changement au niveau du BCHR.</p>
<p>A l&rsquo;étape 2 &#8211; P2 on constate que les lectures sur disque sont nombreuses, que l&rsquo;espérance de vie d&rsquo;une page dans le cache des données est proche de zéro mais que le BCHR est toujours proche de 100%</p>
<p>On vient donc ici de démontrer que la lecture seule du BCHR n&rsquo;est pas suffisante pour détecter une pression mémoire. Alors la question est pourquoi ? O_O &#8230; O_O &#8230; Tout simplement parce que nous avons oublié que SQL Server était capable de faire de la lecture anticipée et que celle-ci va donc lire plus de données que nécessaire pour tenter de satisfaire la lecture des prochaines données qui seront du coup déjà en cache. Comme nous l&rsquo;avons vu un peu plus haute la valeur du BCHR détermine le taux d&rsquo;accès de pages de données déjà en cache par rapport à ceux effectués sur disque. C&rsquo;est le cas ici car la lecture anticipée permet comme son nom l&rsquo;indique d&rsquo;anticiper les prochaines lectures de pages dans le cache de données. C&rsquo;est la raison pour laquelle la valeur de compteur ne bouge pratiquement pas ici. Sans cette lecture anticipée on aurait une valeur de compteur beaucoup plus variable. Peut-on le prouver ? Bien sûr. Pour cela il suffit de désactiver l&rsquo;utilisation de la lecture anticipée sur notre instance SQL Server en activant le trace flag 652.</p>
<blockquote><p><strong>DBCC TRACEON(652, -1);        <br />GO</strong></p>
</blockquote>
<p>On réalise à nouveau les mêmes tests que précédemment et voici le résultat :</p>
<p><a href="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_10.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.developpez.com/media/269/Windows-Live-Writer/Buffer-Cache-Hit-Ratio--seul-compteur--s_13728/image_thumb_4.png" width="804" height="570" /></a></p>
<p>A l&rsquo;étape 1 on retrouve la même chose que tout à l&rsquo;heure. Le cache étant vide au départ une première lecture des données de la première requête donne lieu à des accès sur disque pour remonter les pages dans le cache des données SQL Server.</p>
<p>A l&rsquo;étape 2 on lance notre requête de sélection sur la table <em>dbo.test</em>. Ici c&rsquo;est une tout autre histoire. On voit que le nombre de lectures physiques augmente comme tout à l&rsquo;heure mais que la valeur du BCHR diminue drastiquement également. En effet, la lecture anticipée n&rsquo;est plus là pour satisfaire les prochaine lectures de pages directement dans le cache de données. Du coup on se retrouve à aller chercher plus souvent les pages de données sur disque que dans le cache de données. </p>
<p>A l&rsquo;étape 2 &#8211; P1 P2 on retrouve la même situation que tout à l&rsquo;heure. L&rsquo;espérance de vie d&rsquo;une page de données chute puisque SQL Server est obligé de vider le cache au fur et à mesure pour remonter les nouvelles pages qui devront être accédées pendant l&rsquo;exécution de nos 2 requêtes. </p>
<p> </p>
<p>Nous avons donc vu que la valeur du BHCR ne permettait pas à elle seule de détecter une pression mémoire sur une instance SQL Server. Je dirai même que lorsque la valeur de ce compteur commence à chuter plus que de raison il est déjà trop tard. Maintenant il est question ici d&rsquo;environnements OLTP comme vous l&rsquo;avez sans doute deviner. Il n&rsquo;est pas rare de voir la valeur de compteur beaucoup plus basse dans des environnements OLAP avec des entrepôts de données. J&rsquo;espère en tout cas que ce billet vous aura convaincu de ne pas utiliser uniquement la valeur du BCHR dans vos outils de monitoring.</p>
<p>Bonne surveillance !!</p>
<p>David BARBARIN (Mikedavem)    <br />MVP SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
