<?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; Sybase</title>
	<atom:link href="http://blog.capdata.fr/index.php/category/sybase/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>Abonnez-vous au blog de la CapData team !</title>
		<link>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/</link>
		<comments>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:48:49 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[capdata]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=1080</guid>
		<description><![CDATA[Bonjour à tous,
Juste un petit post pour vous rappeler les différentes méthodes vous permettant de suivre l&#8217;activité débordante du blog de la capdata team :

Accès standard via la page web : http://blog.capdata.fr
Vous abonner au flux RSS du blog et être ainsi prévenu de l&#8217;arrivée des nouveaux articles : http://feeds.feedburner.com/CapDataTeamBlog
Nous suivre sur Twitter pour retrouver l&#8217;actualité [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Juste un petit post pour vous rappeler les différentes méthodes vous permettant de suivre l&#8217;activité débordante du blog de la capdata team :</p>
<ul>
<li>Accès standard via la page web : <a href="http://blog.capdata.fr" target="_blank">http://blog.capdata.fr</a></li>
<li>Vous abonner au flux RSS du blog et être ainsi prévenu de l&#8217;arrivée des nouveaux articles : <a href="http://feeds.feedburner.com/CapDataTeamBlog" target="_blank">http://feeds.feedburner.com/CapDataTeamBlog</a></li>
<li>Nous suivre sur Twitter pour retrouver l&#8217;actualité des bases de données : <a href="http://twitter.com/capdata_blog" target="_blank">http://twitter.com/capdata_blog</a></li>
</ul>
<p>Vous êtes de plus en plus nombreux à nous suivre sur ce blog technique autour des bases de données et nous vous en remercions.</p>
<p>J&#8217;en profite pour vous proposer quelques articles qui semblent avoir remportés un vif succès dernièrement :</p>
<ul>
<li><a href="http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/" target="_self">http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/</a></li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" target="_self">http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/</a></li>
<li><a href="http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/" target="_self">http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/</a></li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" target="_self">http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/</a></li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/" target="_self">http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/</a></li>
</ul>
<p>Encore une fois, n&#8217;hésitez pas à poster vos commentaires sur les articles, l&#8217;échange est la richesse du contenu.</p>
<p>A bientôt sur le blog de la capdata team !<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/certification-sql-server-70-432-offerte/" rel="bookmark" title="25 février 2011">Voucher certification SQL Server 70-432 offert !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/interet-de-creer-des-indexes-cluster-uniques/" rel="bookmark" title="16 mars 2010">Intérêt de créer des indexes cluster uniques</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/" rel="bookmark" title="25 mars 2010">Que faire des &laquo;&nbsp;[Warning] Aborted connection&nbsp;&raquo; avec MySQL ?</a> (Cédric PEINTRE) [MySQL]</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 3.105 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%2Fabonnez-vous-au-blog-de-la-capdata-team%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fabonnez-vous-au-blog-de-la-capdata-team%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jeux de caractères, Unicode  et Base de données</title>
		<link>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/</link>
		<comments>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 10:31:37 +0000</pubDate>
		<dc:creator>Guillaume DEFENDINI</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[characterset]]></category>
		<category><![CDATA[jeux de caractères]]></category>
		<category><![CDATA[nchar]]></category>
		<category><![CDATA[nvarchar]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=961</guid>
		<description><![CDATA[Introduction
Un caractère est un symbole ou un signe unique appartenant à un alphabet.
Le jeu de caractères est un ensemble de caractères à représenter.
Il existe plusieurs jeux de caractères, permettant de représenter différents alphabets du monde.
Le standard ASCII
 
 
 
Afin de répertorier tous les caractères, un standard a été mis en place.
Le premier standard qui [...]]]></description>
			<content:encoded><![CDATA[<div><strong>Introduction</strong></div>
<div>Un caractère est un symbole ou un signe unique appartenant à un alphabet.</div>
<div>Le jeu de caractères est un ensemble de caractères à représenter.</div>
<div>Il existe plusieurs jeux de caractères, permettant de représenter différents alphabets du monde.</div>
<p><strong>Le standard ASCII</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><span style="font-weight: normal;">Afin de répertorier tous les caractères, un standard a été mis en place.</span></p>
<p><span style="font-weight: normal;">Le premier standard qui voit le jour est l’ASCII. </span></p>
<p><span style="font-weight: normal;">Pour représenter des caractères dans un fichier texte, on associe un nombre (code) à une lettre, à un chiffre ou à un symbole.</span></p>
<p><span style="font-weight: normal;">L’encodage le plus connu de l’ASCII est US-ASCII. </span></p>
<p><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">A =&gt; 65 =&gt; 01000001</span></p>
<p><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">a =&gt; 97 =&gt; 01100001 </span></p>
<p><span style="font-weight: normal;">Le codage est réalisé sur 7bits/octet soit 128 symboles possibles. Une trentaine d&#8217;entre eux sont des caractères de commande, le reste est constitué de l&#8217;alphabet anglais standard, des chiffres et des ponctuations. </span></p>
<p><span style="font-weight: normal;">L’extension la plus connue est la famille ISO-8859, permettant de représenter les caractères accentués. Le codage est réalisé sur un octet complet, soit 256 caractères possibles. Les codes de 160 à 255 sont affectés au codage des caractères latins accentués.</span></p>
<p><span style="font-weight: normal;">Standards ISO-8859-1 à 15</span></p>
<p><span style="font-weight: normal;"> ISO-8859-1 puis 15 (euro): Europe de l&#8217;Ouest</span></p>
<p><span style="font-weight: normal;"> ISO-8859-2: Europe Centrale ou de l&#8217;Est</span></p>
<p><span style="font-weight: normal;"> ISO-8859-5: Cyrillique</span></p>
<p><span style="font-weight: normal;"> ISO-8859-7: Grec</span><span><span style="font-weight: normal;"> </span></span></p>
<p><span style="font-weight: normal;"><strong> </strong></span></p>
<p><strong> <span style="font-weight: normal;">Les principaux problèmes rencontrés avec ce standard sont les suivants :</span></strong></p>
<p>- On ne peut utiliser plusieurs langues à l&#8217;intérieur d&#8217;une même instance.</p>
<p><span style="font-weight: normal;">- Deux grands absents de l&#8217;ISO-Latin-1 sont la ligature oe « œ », essentielle à la typographie française correcte, et le symbole de l&#8217;euro « € ».</span></p>
<p><span style="font-weight: normal;">- Chaque constructeur d&#8217;ordinateur a aussi développé ses propres codes non conformes aux standards internationaux (IBM EBCDIC, Windows-1252,..) </span></p>
<p><strong>L’unicode</strong></p>
<p><span style="font-weight: normal;">La globalisation consiste à intégrer dans une même table tous les caractères connus du monde. </span></p>
<p><span style="font-weight: normal;">Le standard Unicode est un mécanisme universel de codage de caractères. Il définit une manière cohérente de coder des textes multilingues et facilite l’échange de données textuelles. </span></p>
<p><span style="font-weight: normal;">Il est un passage obligatoire pour la plupart des nouveaux protocoles de l’Internet, mis en œuvre dans tous les systèmes d’exploitation et langages informatiques modernes.</span></p>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Formes de codage</span></span></p>
<p><span style="font-weight: normal;">Il existe plusieurs formes de codage de caractères pour l&#8217;Universal Character Set:</span></p>
<p><span style="font-weight: normal;">- UCS-2</span></p>
<p><span style="font-weight: normal;">- UCS-4</span></p>
<p>Cependant, les codages UCS-2 et UCS-4 sont difficiles à utiliser dans de nombreuses applications et protocoles qui travaillent avec des caractères codés sur 8 ou même 7 bits. Même certains systèmes plus récents capables de travailler avec des caractères sur 16 bits ne peuvent pas traiter les données codées en UCS-4. Cette situation a conduit au développement de formats de transformation UTF (UCS Transformation Formats). Chacun possédant ses propres caractéristiques.</p>
<p><span style="text-decoration: underline;">Encodage UTF 8</span></p>
<p><span style="font-weight: normal;">UTF-8 a été conçu par Kenneth Thompson en 1992 pour être compatible avec certains logiciels originellement prévus pour traiter des caractères d&#8217;un seul octet. </span></p>
<p><span style="font-weight: normal;">Les caractères de numéro 0 à 127 sont codés sur un octet dont le bit de poids fort est toujours nul.</span></p>
<p><span style="font-weight: normal;">Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets.</span></p>
<p><span style="text-decoration: underline;">Encodage UTF 16</span></p>
<p><span style="font-weight: normal;">UTF-16 est une méthode permettant de transformer un sous-ensemble de la table UCS-4 en une paire de valeurs UCS-2 d’une plage réservée. </span></p>
<p><span style="font-weight: normal;">UTF-16 est décomposé en 2 types.</span></p>
<p><span style="font-weight: normal;">UTF-16-BE (Big-endian)</span></p>
<p><span style="font-weight: normal;">UTF-16-LE (Little-endian)</span></p>
<p><span style="font-weight: normal;">Le codage UTF-16-BE est l&#8217;un des codages préconisés par la norme Unicode. Ce codage associe simplement un code de 16 bits (2 octets) à chaque caractère.</span></p>
<p><span style="text-decoration: underline;">Encodage UTF 32</span></p>
<p><span style="font-weight: normal;">UTF-32 est un protocole pour encoder les caractères sur 32 bits. Du fait que l’UTF-32 utilise 4 bytes par caractère. </span></p>
<p><span style="font-weight: normal;">Il est aussi  décomposé en 2 types.</span></p>
<p><span style="font-weight: normal;">UTF-32-BE (Big-endian)</span></p>
<p><span style="font-weight: normal;">UTF-32-LE (Little-endian)</span></p>
<p><span style="font-weight: normal;">Il est relativement consommateur d’espace.</span></p>
<p><strong>Support SGBD</strong></p>
<p style="text-align: center;"><a href="http://blog.capdata.fr/wp-content/uploads/2010/04/unicode_sgbd.png"><img class="size-medium wp-image-962 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/04/unicode_sgbd-300x161.png" alt="" width="500" height="261" /></a></p>
<p><strong>Oracle</strong></p>
<p><span style="font-weight: normal;">Deux paramètres permettent de prendre en charge l’Unicode.</span></p>
<ul>
<li><span style="font-weight: normal;">Database Character Set</span></li>
<li><span style="font-weight: normal;">National Character Set</span></li>
</ul>
<p><span style="font-weight: normal;">Ces paramètres sont définis lors de la création de la base.</span></p>
<p><span style="font-weight: normal;">L’instruction CREATE DATABASE dispose de la clause character set et de la clause national character set qui permettent de déclarer le jeu de caractères qui servira de jeu de caractères de la base et de jeu de caractères nationaux. </span></p>
<p><span style="font-weight: normal;">Sans spécification de la clause national character set, le jeu AL16UTF16 sera utilisé par défaut.</span></p>
<p><span style="font-weight: normal;">Le paramètre Database Character Set ne peut pas être configuré en UTF-16.</span></p>
<p><span style="font-weight: normal;">Oracle gère l&#8217;unicode au niveau des colonnes grâce </span>National Character Set et <span style="font-weight: normal;">au types de données suivantes :</span></p>
<ul>
<li><span style="font-weight: normal;">Nchar</span></li>
<li><span style="font-weight: normal;">Nvarchar2</span></li>
<li><span style="font-weight: normal;">nclob</span></li>
</ul>
<p><strong>Sybase</strong></p>
<p><span style="font-weight: normal;">Au moment de l’installation, vous devez définir le paramètre default character set. Par défaut il est déterminé par celui utilisé sur votre server (Win = 1252, solaris =ISO 8859-1). Sybase recommande de définir UTF 8 pour ce paramètre si vous utiliser de l&#8217;unicode.</span></p>
<p><span style="font-weight: normal;">Sybase supporte la gestion de l’unicode au niveau du type de colonne à l’aide des 3 types suivants : </span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Unichar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Univarchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Unitext</span></p>
<p><span style="font-weight: normal;">Ces 3 types de données sont encodés en UTF 16.</span></p>
<p><strong>Sql server</strong></p>
<p><span style="font-weight: normal;">Nous  allons introduire la notion de collation.</span></p>
<p><span style="font-weight: normal;"> Une collation est une table de correspondance spécifique à un jeu de caractères. </span></p>
<p><span style="font-weight: normal;">Un jeu de caractères peut avoir plusieurs collations, en général une par langue (par exemple, latin1 français, latin1 suédois). </span></p>
<p><span style="font-weight: normal;">Ce paramètre se définit à l&#8217;installation, sa valeur par défaut est en fonction de la langue de l&#8217;OS sur lequel se fait l&#8217;installation (pour les collations de type windows) : </span></p>
<p><span style="font-weight: normal;">Système en français : French_CI_AS </span></p>
<p><span style="font-weight: normal;">Système en anglais : Latin1_General_CI_AS </span></p>
<p><span style="font-weight: normal;">Il sert à déterminer la page de code utilisée dans les champs non unicode (varchar par exemple), l&#8217;ordre de tri des chaînes de caractère et aussi la sensibilité aux accents, aux majuscules, etc.</span></p>
<p><span style="font-weight: normal;">La collation paramétrée s&#8217;applique aux bases de données systèmes (master, msdb, tempdb et model) et par défaut aux nouvelles bases de données créées. Elle peut cependant être modifiée lors de la création d&#8217;une nouvelle base de données ou lors de l&#8217;ajout d&#8217;un champ texte grâce au mot clef COLLATE. </span></p>
<p>Sql server supporte la gestion de l’unicode à travers le type de colonne :</p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Nchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Nvarchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Ntext</span></p>
<p><strong>My sql</strong></p>
<p>MySQL détermine le jeu de caractères et la collation en fonction de l&#8217;option de configuration active quand le serveur démarre ou en fonction des valeurs de configuration à l&#8217;exécution.</p>
<p><span style="font-weight: normal;">Vous pouvez utiliser &#8211;default-character-set=character_set_name comme jeu de caractères et vous pouvez en même temps ajouter &#8211;default-collation=collation_name pour la collation. Par défaut mysql utilise les options suivante &#8211;default-charset=latin1 &#8211;collation=latin1_swedish_ci car latin1_swedish_ci est la collation par défaut de latin1.</span></p>
<p><span style="font-weight: normal;">La collation peut aussi être définie au niveau de la base ou de la colonne à l’aide de la clause collate.</span></p>
<p><span style="font-weight: normal;">En MySQL version 4.x et plus ancien, NCHAR et CHAR étaient synonymes. </span></p>
<p><span style="font-weight: normal;">MySQL utilise UTF8 comme jeu de caractère prédéfini pour les champs de types Nchar et Nvarchar .</span><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<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>
<li><a href="http://blog.capdata.fr/index.php/io-asynchrones-episode-1/" rel="bookmark" title="5 juillet 2011">I/O asynchrones (épisode 1)</a> (David BAFFALEUF) [Operating SystemSQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/" rel="bookmark" title="11 décembre 2008">Modes de récupération et journal de transactions, épisode 2</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/" rel="bookmark" title="13 juin 2008">Modes de récupération et journal de transactions, épisode 1</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/formation-optimisation-de-requetes/" rel="bookmark" title="22 septembre 2010">Formation Optimisation de requêtes</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.204 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%2Fjeux-de-caracteres-unicode-et-base-de-donnees%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fjeux-de-caracteres-unicode-et-base-de-donnees%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un trigger fait-il parti d&#8217;une transaction ?</title>
		<link>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/</link>
		<comments>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:31:54 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[ACID]]></category>
		<category><![CDATA[atomique]]></category>
		<category><![CDATA[transaction]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=430</guid>
		<description><![CDATA[C&#8217;est une question que l&#8217;on peut se poser, même si la réponse parait évidente, nous ne sommes pas à l&#8217;abri d&#8217;éventuelles surprises. Verdict à la fin de ce post !
C&#8217;est d&#8217;ailleurs une question que l&#8217;on s&#8217;est posée, autour de la machine café, et qui du coup a fait l&#8217;objet d&#8217;un petit exercice avec Oracle, SQL [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est une question que l&#8217;on peut se poser, même si la réponse parait évidente, nous ne sommes pas à l&#8217;abri d&#8217;éventuelles surprises. Verdict à la fin de ce post !</p>
<p>C&#8217;est d&#8217;ailleurs une question que l&#8217;on s&#8217;est posée, autour de la machine café, et qui du coup a fait l&#8217;objet d&#8217;un petit exercice avec Oracle, SQL Server, MySQL et Sybase&#8230; Bon, je vous rassure, nous ne faisons pas que parler bases de données pendant les pauses café mais ça arrive, parfois.</p>
<h2>Place aux tests : Un trigger fait-il parti d&#8217;une transaction ?</h2>
<h3><span style="text-decoration: underline;">Test Oracle :</span></h3>
<pre>SQL &gt; create table t2 ( cnt int );
 SQL &gt; insert into t2 values ( 0 );
 SQL &gt; commit;
 SQL &gt; create table t ( x int check ( x&gt;0 ) );</pre>
<pre>SQL &gt; create trigger t_trigger
 before insert or delete on t for each row
 begin
 if ( inserting ) then
 update t2 set cnt = cnt +1;
 else
 update t2 set cnt = cnt -1;
 end if;
 dbms_output.put_line( 'I fired and updated ' ||sql%rowcount || ' rows'  );
 end;
 /</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>SQL &gt; set serveroutput on
 SQL &gt; insert into t values (1);
 I fired and updated 1 rows
 1 row created.
 SQL &gt; insert into t values(-1);
 I fired and updated 1 rows
 insert into t values(-1)
 *
 ERROR at line 1:
 ORA-02290: check constraint (SYS_C009597) violated
 SQL &gt; select * from t2;
 CNT
 ----------
 1</pre>
<h3><span style="text-decoration: underline;">Test MS SQL Server :</span></h3>
<pre>use tempdb
 go</pre>
<pre>create table t2 ( cnt int )
 insert into  t2 values ( 0 )
 select * from t2</pre>
<pre>create table t ( x int check  ( x&gt;0 ) )</pre>
<pre>drop trigger t_trigger
 create trigger t_trigger  on t for insert
 as
 begin
 update t2 set cnt = cnt +1
 print( 'I fired and updated ' + CAST(@@ROWCOUNT AS NVARCHAR(8))  + '  rows' )
 end</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>begin tran
 insert into t values(2);
 insert into t values(-1);</pre>
<pre>(1 row(s) affected)
 I fired and updated  1 rows</pre>
<pre>(1 row(s) affected)
 Msg 547, Level 16, State  0, Line 4
 The INSERT statement conflicted with the CHECK constraint  "CK__t__x__7A5DD7C8". The conflict occurred in database "tempdb", table  "dbo.t", column 'x'.
 The statement has been terminated.</pre>
<h3><span style="text-decoration: underline;">Test MySQL (InnoDB) :</span></h3>
<p>Au passage, cela m&#8217;a permis de découvrir que les contraintes <em>CHECK </em>n&#8217;étaient  pas prises en charge par MySQL : <em>The <code>CHECK</code> clause is  parsed but ignored by all storage engines</em></p>
<pre>mysql&gt; set autocommit=off;
 Query OK, 0 rows affected (0.02  sec)</pre>
<pre>mysql&gt; use test
 Database changed
 mysql&gt; create  table t2 ( cnt int ) engine=innodb;
 Query OK, 0 rows affected (0.11  sec)</pre>
<pre>mysql&gt; insert into t2 values ( 0 );
 Query OK, 1 row  affected (0.02 sec)</pre>
<pre>mysql&gt; commit;
 Query OK, 0 rows  affected (0.11 sec)</pre>
<pre>mysql&gt; create table t ( x int primary key)  engine=innodb;
 Query OK, 0 rows affected (0.09 sec)</pre>
<pre>mysql&gt;  delimiter //</pre>
<pre>mysql&gt; create trigger t_trigger
 -&gt;             before insert on t for each row
 -&gt;              begin
 -&gt;             update t2 set cnt = cnt +1;
 -&gt;             end;
 -&gt; //
 Query OK, 0 rows affected (0.11  sec)</pre>
<pre>mysql&gt; delimiter ;</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>mysql&gt; insert into t values (1);
 Query OK, 1 row affected  (0.02 sec)</pre>
<pre>mysql&gt; insert into t values (1);
 ERROR 1062  (23000): Duplicate entry '1' for key 'PRIMARY'</pre>
<pre>mysql&gt; select *  from t2;
 +------+
 | cnt  |
 +------+
 |    1 |
 +------+
 1 row in set (0.00 sec)</pre>
<h3><span style="text-decoration: underline;">Test Sybase :<br />
</span></h3>
<pre>1&gt; create trigger T1_ins_tr on T1 for insert</pre>
<pre>2&gt; as</pre>
<pre> 3&gt; begin</pre>
<pre> 4&gt; select 1/0</pre>
<pre> 5&gt; end</pre>
<pre> 6&gt; go</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>5&gt; begin tran
 6&gt; go
 1&gt; insert into T1 values ('kjhkjhkjh')
 2&gt; go
 Msg 3607, Level 16, State 0:
 Server 'ASE1502', Procedure 'T1_ins_tr', Line 4:
 Divide by zero occurred.</pre>
<pre>-----------
 1&gt; select @@trancount
 2&gt; go</pre>
<pre>-----------
 0</pre>
<pre>(1 row affected)</pre>
<h2>Résultat des tests : LE VERDICT !</h2>
<p>Oui, un trigger fait bien parti d&#8217;une transaction, quel que soit le SGBD, enfin, au moins sur Oracle, SQL Serveur, MySQL et Sybase.</p>
<p>Je vous laisse faire vos tests sur DB2, Postgre et consorts&#8230; N&#8217;hésitez pas à nous faire un retour dans les commentaires.</p>
<p>A+<br />
Cédric<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/mythe-sql-server-associe-un-thread-a-chaque-connexion/" rel="bookmark" title="1 août 2010">Mythe: SQL Server associe un thread à chaque connexion</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/fragmentation-sur-des-tables-stockees-en-s-gam/" rel="bookmark" title="20 août 2010">Fragmentation sur des tables stockées en S-GAM</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/saines-lectures/" rel="bookmark" title="25 août 2010">Saines lectures</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/scripting-et-smo-suite-scripter-les-objets-directement-en-t-sql/" rel="bookmark" title="3 août 2010">Scripting et SMO (suite): scripter les objets directement en T-SQL</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/" rel="bookmark" title="18 juin 2009">Règles d&#8217;installation de base (épisode 1)</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.116 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%2Fun-trigger-fait-il-parti-dune-transaction%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fun-trigger-fait-il-parti-dune-transaction%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Planification dans Adaptive Server</title>
		<link>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/</link>
		<comments>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 13:39:46 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[Sybase]]></category>
		<category><![CDATA[internals]]></category>
		<category><![CDATA[scheduling]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=159</guid>
		<description><![CDATA[Un petit post sur la planification de tâches sur Adaptive Server.
Globalement, ASE utilise des threads pour supporter toutes les tâches qu&#8217;il exécute: requêtes, IO réseau ou disque, connexions utilisateur, tâches internes&#8230; en conjonction avec son propre planificateur de tâche.
Le rôle du planificateur de tâche sur tout système est de partager le temps d&#8217;un CPU entre [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit post sur la planification de tâches sur Adaptive Server.</p>
<p>Globalement, ASE utilise des threads pour supporter toutes les tâches qu&#8217;il exécute: requêtes, IO réseau ou disque, connexions utilisateur, tâches internes&#8230; en conjonction avec son propre planificateur de tâche.</p>
<p>Le rôle du planificateur de tâche sur tout système est de partager le temps d&#8217;un CPU entre plusieurs unités d&#8217;exécution (tâches). Il existe deux grandes familles de planificateurs, les <strong>préemptifs</strong>, et les <strong>coopératifs</strong>.</p>
<p>Le planificateur <strong>préemptif </strong>a le pouvoir de planifier et d&#8217;interrompre les tâches selon des règles qui lui sont propres et sans tenir compte du type de tâche en cours d&#8217;exécution. <em>One size fits all</em>, comme on dit.  Ce mécanisme, qui garantit qu&#8217;aucune tâche ne va monopoliser les ressources CPU, permet à chaque programme de pouvoir avoir la main sur la CPU à un moment où un autre. Sur la plupart des OS (linux, UNIX System V et Windows NT à partir de la 4.0), le planificateur alloue au thread un bail d&#8217;exécution ou un quantième. Si la tâche n&#8217;a pas terminé son travail dans le temps imparti, elle est interrompue. Lorsqu&#8217;il interrompt la tâche en cours, le planificateur sauvegarde son contexte dans un coin (c&#8217;est à dire les structures process + thread qui la représentent en mémoire), et planifie une nouvelle tâche sur la CPU. Ce qu&#8217;on appelle un<em> changement de contexte</em>.</p>
<p>Le planificateur <strong>coopératif</strong>, lui, va au contraire laisser à la tâche le soin de se terminer toute seule. C&#8217;est là la plus grosse différence, il n&#8217;interrompt pas une tâche qui n&#8217;a pas terminé son travail.  C&#8217;est à la charge de la tâche de rendre la main pour laisser de la place aux autres, c&#8217;est donc à elle de prévoir un mécanisme de relâche (<em>to yield</em> = &laquo;&nbsp;céder&nbsp;&raquo;). Windows 3.1 employait un scheduler coopératif, les Windows 98 et 95 aussi pour assurer la compatibilité avec les programmes 16 bits.</p>
<p>Maintenant, on imagine facilement le risque d&#8217;employer un tel système de planification: une tâche qui part en vrille ne libèrera jamais la CPU, ça n&#8217;a donc plus été employé pour faire des operating systems.</p>
<p><a href="http://www.csail.mit.edu/user/1547">Micheal Stonebraker</a> avait publié un article de quelques pages au début des années 80* expliquant en gros que les &#8217;services&#8217; apportés par UNIX system V n&#8217;étaient pas adaptés au monde de la base de données, et notamment en matière de planification. Les tâches typiques issues des SGBD prennent plus de temps à s&#8217;effectuer car il ne s&#8217;agit pas de calcul mais d&#8217;IOs, et le mode préemptif n&#8217;est pas adapté car il &#8216;coupe&#8217; la dynamique et l&#8217;efficacité du SGBD en produisant de nombreux changements de contexte.</p>
<p>Donc les développeurs chez Sybase ont répondu en créant un scheduler coopératif &#8216;<em>on top</em>&#8216; **, propre à Adaptive Server et par dessus le planificateur de l&#8217;OS, de telle manière à ce qu&#8217;il masque les choses vis à vis de celui-ci et limite au maximum les changements de contexte.</p>
<p><strong>- Les tranches de temps:</strong><br />
ASE va donc fonctionner comme un OS, mais avec ses règles à lui: il gère sa propre planification, son propre partage du temps CPU, ses propres valeurs de quantième. Car bien que coopératif, il doit pouvoir stopper une tâche qui ne répond plus et éviter la saturation d&#8217;un engine. Lorsqu&#8217;il planifie une tâche, il va lui allouer un bail. Ce bail n&#8217;est pas une valeur temporelle, c&#8217;est un nombre de ticks d&#8217;horloge qui est décrémenté. Il est calculé en divisant le paramètre &#8216;timeslice&#8217; par &#8217;sql server clock tick length&#8217;. Comme les deux valeurs sont à 100 ms par défaut, le nombre de ticks d&#8217;horloge autorisé est de 1. Dans le déroulement de son exécution, une tâche va passer par des parties de code qu&#8217;on appelle des <em>yield points</em>, au cours desquels elle va prendre une seconde pour vérifier qu&#8217;elle n&#8217;a pas dépassé son bail. Si elle découvre que le bail est excédé (bail &lt; 0), elle va demander à ASE de lui accorder une grace supplémentaire (<em>cpu grace time</em>), qui peut aller jusqu&#8217;à  500 ticks (soit 50 secondes). Si elle n&#8217;a pas terminé au delà de cette valeur, alors ASE sort les gros moyens, termine la tâche, annule ses transactions et affiche une stacktrace dans l&#8217;errorlog:</p>
<pre>00:00000:00005:2007/04/02 22:09:24.07 kernel  timeslice -501, current process infected
00:00000:00005:2007/04/02 22:09:24.75 kernel  ************************************
00:00000:00005:2007/04/02 22:09:24.77 kernel  curdb = 1 tempdb = 2 pstat = 0x200
00:00000:00005:2007/04/02 22:09:24.77 kernel  lasterror = 0 preverror = 0 transtate = 1
00:00000:00005:2007/04/02 22:09:24.77 kernel  curcmd = 0 program =
...</pre>
<p>Tout ceci se passe toujours sans que l&#8217;OS ne sache rien, car de son côté, le processus dataserver est toujours en exécution. C&#8217;est le but: l&#8217;OS ne doit pas interrompre le processus dataserver puisque celui-ci semble toujours travailler.</p>
<p><strong>- Runnable Process search count:</strong><br />
Toujours dans le souci de préserver son exécution vis à vis de l&#8217;OS, lorsqu&#8217;il a terminé d&#8217;exécuter des tâches, et plutôt que de rendre la main tout de suite, Adaptive Server va entrer dans une boucle de vérification des IOs en attente côté réseau puis côté disque. S&#8217;il ne trouve rien, il va tourner (<em>spinning</em>) pour rechercher de nouvelles tâches en attente d&#8217;exécution, puis de nouvelles IOs réseau, puis de nouvelles IOs disques, etc&#8230; tout ça 2000 fois par défaut (<em>runnable process search count</em>), même s&#8217;il n&#8217;y a rien à traiter dans aucune file d&#8217;attente. Ce qui donne une apparente sensation d&#8217;hyperactivité côté OS, alors que côté Adaptive Sever, l&#8217;électro-encéphalo est plutôt plat.</p>
<p>Pour illustrer tout ça, une petite explication de la section &#8216;kernel&#8217; de sp_sysmon:</p>
<pre>Kernel Utilization
------------------

Your Runnable Process Search Count is set to 5000
and I/O Polling Process Count is set to 10

Engine Busy Utilization        CPU Busy   I/O Busy       Idle
------------------------       --------   --------   --------
Engine 0                       80.0 %      7.5 %     12.5 %
Engine 1                       80.8 %      6.0 %     13.2 %
Engine 2                       82.5 %      5.7 %     11.9 %
Engine 3                       84.0 %      6.7 %      9.3 %
Engine 4                       79.0 %      6.8 %     14.2 %
Engine 5                       80.0 %      7.3 %     12.7 %
Engine 6                       79.6 %      8.3 %     12.0 %
------------------------       --------   --------   --------
Summary           Total         565.9 %     48.4 %     85.7 %
Average                         80.8 %      6.9 %     12.2 %</pre>
<p>Avant de commencer, il faut bien rappeler le cheminement de la boucle:<br />
<a href="https://www.alldb.fr/blog/wp-content/uploads/2009/06/rpsc3.png"><img class="alignnone size-medium wp-image-178" src="https://www.alldb.fr/blog/wp-content/uploads/2009/06/rpsc3-300x140.png" alt="" /></a><a href="https://www.alldb.fr/blogs/wp-content/uploads/2009/06/rpsc2.png"><br />
</a></p>
<p>Chaque engine tient le compte de ticks reçus de l&#8217;OS (par le biais de signaux SIGALRM) tous les 100ms, et les répertorie   selon trois catégories:</p>
<p><strong>CPU Busy</strong>: représente le temps (en fait le nombre de ticks ramené en pourcentage) passé par l&#8217;engine à exécuter une tâche sur l&#8217;intervalle.<br />
<strong>Idle</strong>: représente le temps passé par l&#8217;engine à n&#8217;exécuter aucune tâche sur l&#8217;intervalle.<br />
<strong> I/O Busy</strong>: est une soustraction de Idle. Il s&#8217;agit du temps passé par l&#8217;engine à n&#8217;exécuter aucune tâche (donc Idle) mais où il y avait au moins une IO disque en attente dans la file. Elle représente donc la quantité de temps où l&#8217;engine n&#8217;a pas pu exécuter une tâche parce qu&#8217;il y avait au moins une IO disque en attente.</p>
<p>On peut retrouver ces valeurs brutes en interrogeant les variables globales @@cpu_busy, @@idle, et @@io_busy. La durée d&#8217;un tick peut être retrouvée avec @@timeticks.</p>
<p>A+. [ David B. ]</p>
<p><em>*: Michael Stonebraker, Operating System Support for Database Management, CACM 24(7), p412-418 (1981).<br />
**: et Microsoft fit de même </em><em>en dotant </em><em>SQL Server 7.0  de son propre scheduler coopératif (UMS), toujours bien présent en version 2008 sous une autre dénomination (SQLOS). </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/formation-optimisation-de-requetes/" rel="bookmark" title="22 septembre 2010">Formation Optimisation de requêtes</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/certification-sql-server-70-432-offerte/" rel="bookmark" title="25 février 2011">Voucher certification SQL Server 70-432 offert !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/" rel="bookmark" title="23 juin 2010">Abonnez-vous au blog de la CapData team !</a> (Cédric PEINTRE) [GénéralMySQLOracleSQL ServerSybase]</li>
<li><a href="http://blog.capdata.fr/index.php/interet-de-creer-des-indexes-cluster-uniques/" rel="bookmark" title="16 mars 2010">Intérêt de créer des indexes cluster uniques</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.211 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%2Fsybase-ase-planification-dans-adaptive-server%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsybase-ase-planification-dans-adaptive-server%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Direct i/o, dsync on/off, raw device</title>
		<link>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/</link>
		<comments>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 15:20:11 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[Sybase]]></category>
		<category><![CDATA[directio]]></category>
		<category><![CDATA[dsync]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=148</guid>
		<description><![CDATA[Il y a depuis 2 ans et encore aujourd&#8217;hui un gros débat sur l&#8217;avenir du direct IO sur Linux dans la communauté des développeurs kernel (cf post Linus http://lkml.org/lkml/2007/1/10/233) . L&#8217;avenir du raw device lui ne se pose même plus puisque Red Hat ne le supporte plus que du bout des doigts (cf la manpage [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a depuis 2 ans et encore aujourd&#8217;hui un gros débat sur l&#8217;avenir du direct IO sur Linux dans la communauté des développeurs kernel (cf post Linus <a title="LKML.org" href="http://lkml.org/lkml/2007/1/10/233"><em>http://lkml.org/lkml/2007/1/10/233</em></a>) . L&#8217;avenir du raw device lui ne se pose même plus puisque Red Hat ne le supporte plus que du bout des doigts (cf la manpage  de raw en RHEL5):</p>
<p><strong>WARNING</strong><br />
<em>Although  Linux  includes support for rawio, it is now a deprecated interface. If your application performs device access using this interface, Red Hat encourages you to modify your application to open the block device with the O_DIRECT flag. The rawio interface will exist for the life of Red Hat Enterprise Linux 5, but is a candi-<br />
date for removal from future releases.</em></p>
<p>Le bénéfice du raw device n&#8217;est pas nouveau, que ce soit pour Adaptive Server ou Oracle, le fait d&#8217;écrire directement sur la partition brute a deux avantages majeurs pour les SGBD:<br />
1 &#8211; Ca va plus vite.<br />
2 &#8211; Ca garantit que ce que l&#8217;on écrit va bien sur le disque et non dans un buffer en mémoire. En effet, le système de base de données gère lui-même la bufferisation de ses pages de données et d&#8217;indexes, et ne doit pas se reposer sur le système pour ça.</p>
<p>A partir du moment où le raw device cesse d&#8217;être supporté, on va devoir écrire dans un fichier, et qui dit écriture dans un fichier sous UNIX/Linux dit écriture bufferisée. C&#8217;est là où le critère 2 n&#8217;est plus garanti.</p>
<p>Il reste alors deux solutions qui vont nous permettre de garantir celà: DIRECTIO ou DSYNC. Ce sont en fait des arguments qui vont être passés à la primitive d&#8217;ouverture du fichier, le plus souvent open(), sous la forme de flags: O_DIRECT, O_DSYNC ou O_ASYNC.</p>
<p>A travers Adaptive Server, ces arguments seront manipulés lors de la création de devices avec la commande disk init:</p>
<pre>disk init name='PERFSTATS_data01', physname='/sybase_data/ASE1502/userdb/PERFSTATS_data01.dat',
size=512000,
directio=true</pre>
<p>ou</p>
<pre>disk init name='PERFSTATS_data01', physname='/sybase_data/ASE1502/userdb/PERFSTATS_data01.dat',
size=512000,
dsync=true</pre>
<p>On ne peut pas utiliser à la fois directio=true et dsync=true pour le même device, les options sont mutuellement exclusives.</p>
<p><strong>DIRECTIO</strong>:<br />
Lorsque directio est à true, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_DIRECT:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_SYNC|O_DIRECT|O_LARGEFILE) = 17</pre>
<p>Lorsque la primitive d&#8217;écriture est invoquée (write(), aiowrite()), l&#8217;écriture va directement sur le disque. Donc sémantiquement équivalent à ce que donne une écriture sur un raw device, à la fois en termes de performances et de garantie.</p>
<p><strong>DSYNC:</strong><br />
Lorsque dsync est à true, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_DSYNC:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_DSYNC|O_LARGEFILE) = 17</pre>
<p>Lorsque dsync est à false, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_ASYNC:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_ASYNC|O_LARGEFILE) = 17</pre>
<p>Lorsque la primitive d&#8217;écriture est invoquée, l&#8217;écriture sera bufferisée mais en fonction de la valeur passée à disk init (true  ou false),  certains éléments vont être synchronisés sur disque avant que aiowrite() ne revienne au programme appelant.<br />
<em><strong>- dsync=true</strong></em>: alors le flag O_DSYNC est passé à open(). Ce flag garantit que write() reste en attente tant que les données n&#8217;ont pas été synchronisées sur disque.<br />
<em><strong>- dsync=false:</strong></em> alors le flag O_ASYNC est passé à open(). Ce flag indique que write() rend la main une fois l&#8217;écriture bufferisée mais AVANT la synchronisation sur disque, ce qui ne garantit pas notre critère 2.</p>
<p>On recommandera toujours de mettre dsync=true pour les devices de données et de journaux pour avoir la garantie d&#8217;écriture stabilisée, et dsync=false pour les devices tempdb pour favoriser la perf.</p>
<p><strong>- Avantages / Inconvénients pour le DSYNC: </strong><br />
<em><strong>Avantages</strong></em>: c&#8217;est complètement supporté par les file system.<br />
<em><strong>Inconvénients</strong></em>: C&#8217;est moins performant en écriture.</p>
<p><strong>- Avantages / Inconvénients pour le DIRECTIO: </strong><br />
<em><strong>Avantages</strong></em>: c&#8217;est comme du raw device, sauf que c&#8217;est dans un fichier. C&#8217;est même plus efficace en lecture.<br />
<em><strong>Inconvénients</strong></em>: il faut que le filesystem le supporte (c&#8217;est le cas pour ext3), et d&#8217;après Linus l&#8217;implémentation de directio au niveau du kernel est épouvantable. Le problème c&#8217;est que ce qu&#8217;il indique comme contournement à destination des développeurs ASE (Wim Ten Have et Dave Wein en tête) n&#8217;est pas vraiment applicable.</p>
<p>Pas de doute, le DIRECTIO reste la meilleure option.  Ce sera sûrement réécrit un jour, mais pour l&#8217;instant on n&#8217;a pas trouvé mieux.</p>
<p>Un dernier mot sur le dsync=true sur les noyaux 2.6+, l&#8217;écriture asynchrone se transforme en écriture synchrone et les perfs chutent  <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> (( . Il faut vraiment utiliser directio sur les noyaux récents. Ce sera peut être le sujet d&#8217;un prochain post sur ASE.</p>
<p>A+ [ David B. ]</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/journees-sql-server-1213-decembre-suite/" rel="bookmark" title="27 décembre 2011">Journées SQL Server 12/13 décembre (suite)</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/oracle-les-rpms-et-les-dependances-avec-yum/" rel="bookmark" title="6 novembre 2009">Oracle, les Rpms plus de souci avec YUM</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-d%e2%80%99une-physical-standby-database/" rel="bookmark" title="8 mars 2010">Création d’un Dataguard physique</a> (Guillaume DEFENDINI) [Oracle]</li>
<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/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.447 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%2Fsybase-ase-direct-io-dsync-onoff-raw-device%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsybase-ase-direct-io-dsync-onoff-raw-device%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

