{"id":21,"date":"2007-12-16T19:50:16","date_gmt":"2007-12-16T18:50:16","guid":{"rendered":"http:\/\/mayeur.com\/wordpressfr\/?p=21"},"modified":"2007-12-16T19:54:11","modified_gmt":"2007-12-16T18:54:11","slug":"ssis-dimension-a-variation-lente-ou-recherche","status":"publish","type":"post","link":"http:\/\/mayeur.com\/wordpressfr\/ssis-dimension-a-variation-lente-ou-recherche\/","title":{"rendered":"SSIS : \u00ab\u00a0Dimension \u00e0 variation lente\u00a0\u00bb ou \u00ab\u00a0Recherche\u00a0\u00bb ?"},"content":{"rendered":"<p>Faisant r\u00e9ponse \u00e0 mon article pr\u00e9c\u00e9dent \u00ab\u00a0SSIS et les UPSERTs\u00a0\u00bb, un lecteur a fait la remarque judicieuse suivante : pourquoi utiliser un composant recherche, puis une mise \u00e0 jour en passant par une table temporaire interm\u00e9diaire, alors que SSIS propose un composant d\u00e9di\u00e9 aux UPSERT, appel\u00e9 \u00ab\u00a0Dimension \u00e0 variation lente\u00a0\u00bb, ou encore en anglais \u00ab\u00a0Slowly Changing Dimension\u00a0\u00bb (SCD) ?<\/p>\n<p>La r\u00e9ponse est : \u00ab\u00a0la performance\u00a0\u00bb. N&rsquo;\u00e9tant pas tout \u00e0 fait s\u00fbr de mon fait au prime abord, j&rsquo;ai voulu prendre le temps de faire des tests. La r\u00e9ponse s&rsquo;impose d&rsquo;elle-m\u00eame. Le sc\u00e9nario est le suivant :<\/p>\n<ul>\n<li>la table de destination contient au d\u00e9part 80 000 lignes<\/li>\n<li>la source de donn\u00e9es contient 160 000 lignes,\n<ul>\n<li>dont 80 000 ont des cl\u00e9s sur des donn\u00e9es de la table de destination\n<ul>\n<li>dont 40 000 n\u00e9cessitent effectivement des mises \u00e0 jour<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li> soit au total 80 000 INSERT, et 40 000 UPDATE<\/li>\n<\/ul>\n<p>Voici la t\u00e2che de flux de donn\u00e9es que j&rsquo;ai utilis\u00e9 pour le test :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art21\/img1.JPG\" class=\"thickbox\" title=\"img1.JPG\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art21\/img1.JPG\" alt=\"img1.JPG\" title=\"img1.JPG\" \/><\/a><\/p>\n<p>Ma m\u00e9thode utilisant le composant de recherche r\u00e9alise l&rsquo;op\u00e9ration en 8 secondes 375.<\/p>\n<p>La m\u00e9thode Slowly Changing Dimension r\u00e9alise la m\u00eame op\u00e9ration en 1 minute 53 sec. 353.<\/p>\n<p>Les performances de ce composant ne sont vraiment pas \u00e0 la hauteur. Parcourant les blogs, j&rsquo;ai pu d&rsquo;ailleurs lire que celui-ci a \u00e9t\u00e9 con\u00e7u par Microsoft pour permettre la mise en place ais\u00e9e de type UPSERT, mais que la mise en place de ce type de process performante doit rester plus sp\u00e9cifique.<\/p>\n<p>L&rsquo;une des raisons en est que les mises \u00e0 jour r\u00e9alis\u00e9es par le SCD sont une \u00ab\u00a0commande OLE DB\u00a0\u00bb. C&rsquo;est \u00e0 dire que pour chaque ligne \u00e0 mettre \u00e0 jour, une commande \u00ab\u00a0UPDATE\u00a0\u00bb va \u00eatre envoy\u00e9e au moteur de base de donn\u00e9es. Cela est particuli\u00e8rement peu performant, comme j&rsquo;ai pu l&rsquo;expliquer dans d&rsquo;autres articles (SSIS et les mises \u00e0 jour de masse), et il est nettement pr\u00e9f\u00e9rable de faire un chargement rapide (bulk insert) en table temporaire, suivi d&rsquo;une mise \u00e0 jour ensembliste en fin de traitement (update &#8230; select &#8230;). Il est possible de mettre en place manuellement ce design pattern sur le SCP en rempla\u00e7ant la commande OLE DB g\u00e9n\u00e9r\u00e9e.<\/p>\n<p>De plus, par d\u00e9faut, les insertions param\u00e9tr\u00e9es par ce composant ne sont pas des \u00ab\u00a0chargements rapides\u00a0\u00bb (probablement pour des questions de compatibilit\u00e9 avec certains moteurs de SGBD). Cette objection est facilement corrigeable manuellement.<\/p>\n<p>Enfin, le composant lui-m\u00eame semble particuli\u00e8rement peu performant. Je ne connait pas son impl\u00e9mentation interne, mais la raison est certainement qu&rsquo;il a \u00e9t\u00e9 con\u00e7u pour pouvoir r\u00e9aliser un nombre de choses assez important, qui ne sont pas utiles dans notre cas d&rsquo;esp\u00e8ce.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Faisant r\u00e9ponse \u00e0 mon article pr\u00e9c\u00e9dent \u00ab\u00a0SSIS et les UPSERTs\u00a0\u00bb, un lecteur a fait la remarque judicieuse suivante : pourquoi utiliser un composant recherche, puis une mise \u00e0 jour en passant par une table temporaire interm\u00e9diaire, alors que SSIS propose un composant d\u00e9di\u00e9 aux UPSERT, appel\u00e9 \u00ab\u00a0Dimension \u00e0 variation lente\u00a0\u00bb, ou encore en anglais \u00ab\u00a0Slowly [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[8,9],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-etl","category-sql-server"],"_links":{"self":[{"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":0,"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"wp:attachment":[{"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}