{"id":16,"date":"2007-11-14T17:49:24","date_gmt":"2007-11-14T15:49:24","guid":{"rendered":"http:\/\/mayeur.com\/wordpressfr\/?p=16"},"modified":"2007-11-15T19:30:53","modified_gmt":"2007-11-15T17:30:53","slug":"ssis-et-les-mises-a-jour-de-masse","status":"publish","type":"post","link":"https:\/\/mayeur.com\/wordpressfr\/ssis-et-les-mises-a-jour-de-masse\/","title":{"rendered":"SSIS et les mises \u00e0 jour de masse"},"content":{"rendered":"<p>SSIS dispose d\u2019un composant de destination OLE DB permettant les chargements rapides. Celui-ci est tr\u00e8s efficace pour les insertions de masse.<br \/>\nPar contre, il n\u2019existe pas de composant de \u00ab mises \u00e0 jour \u00e0 chargement rapide \u00bb de m\u00eame type. La m\u00e9thode standard pour r\u00e9aliser les update, qui est g\u00e9n\u00e9ralement pr\u00e9sent\u00e9e dans la documentation officielle et les diff\u00e9rents blogs est la suivante : utilisation du composant \u00ab Commande OLE DB \u00bb dans le flux de donn\u00e9es pour la mise \u00e0 jour. L\u2019inconv\u00e9nient majeur de cette m\u00e9thode, est qu\u2019un appel \u00e0 la m\u00e9thode \u00ab update \u00bb est r\u00e9alis\u00e9 \u00e0 chaque ligne trait\u00e9e. Cela peut \u00eatre tr\u00e8s p\u00e9nalisant sur des volumes importants de donn\u00e9es. Une m\u00e9thode beaucoup plus efficace peut \u00eatre employ\u00e9e, que je vais illustrer ici.<br \/>\nL\u2019exemple est le suivant : une table \u00ab customers \u00bb contient les champs nom, pr\u00e9nom, date de naissance et un identifiant cl\u00e9 primaire. Cette table est correctement index\u00e9e sur le nom+pr\u00e9nom , et bien s\u00fbr sur la cl\u00e9 primaire. Nous allons mettre \u00e0 jour la date de naissance \u00e0 partir d\u2019un fichier CSV contenant le nom, pr\u00e9nom et la date de naissance, et ce pour 150 000 personnes.<br \/>\nLa m\u00e9thode standard est d\u2019avoir un flux de contr\u00f4le contenant juste un appel \u00e0 un flux de donn\u00e9es de cette forme-ci :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img1.JPG\" title=\"img1.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img1.JPG\" alt=\"img1.JPG\" title=\"img1.JPG\" \/><\/a><\/p>\n<p>Le flux de donn\u00e9es est compos\u00e9 ainsi :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img2.JPG\" title=\"img2.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img2.JPG\" alt=\"img2.JPG\" title=\"img2.JPG\" \/><\/a><\/p>\n<p>Le composant \u00ab Recherche \u00bb fait une recherche sur la table Customers pour remonter la cl\u00e9 primaire \u00e0 partir des champs nom et pr\u00e9nom. Le composant \u00ab Mise \u00e0 jour \u00bb r\u00e9alise l\u2019update suivant : \u00ab update Customers set birthdate=? where rowkey=? \u00bb avec le mappage suivant (les colonnes de droite repr\u00e9sentent les donn\u00e9es provenant du flux de donn\u00e9es, c&rsquo;est-\u00e0-dire du fichier, ou bien issue de la recherche pour rowkey) :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img3.JPG\" title=\"img3.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img3.JPG\" alt=\"img3.JPG\" title=\"img3.JPG\" \/><\/a><\/p>\n<p>Le temps de traitement sur mon portable est de 19 secondes 391 milli\u00e8mes.<br \/>\nMaintenant, passons \u00e0 la m\u00e9thode optimis\u00e9e. Celle-ci consiste \u00e0 ins\u00e9rer dans un premier temps les donn\u00e9es avec le chargement rapide dans une table temporaire (dans un flux de donn\u00e9es), puis dans un deuxi\u00e8me temps \u00e0 r\u00e9aliser une mise \u00e0 jour de la table customers avec une jointure (dans une \u00ab t\u00e2che d\u2019ex\u00e9cution de requ\u00eate SQL \u00bb). Voici le flux de contr\u00f4le reprenant les deux \u00e9tapes :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img4.JPG\" title=\"img4.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img4.JPG\" alt=\"img4.JPG\" title=\"img4.JPG\" \/><\/a><\/p>\n<p>Voici le flux de donn\u00e9es :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img5.JPG\" title=\"img5.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img5.JPG\" alt=\"img5.JPG\" title=\"img5.JPG\" \/><\/a><\/p>\n<p>On retrouve les deux premi\u00e8res \u00e9tapes d\u00e9j\u00e0 vues au dessus (source du fichier plat, et Recherche). Par contre, la mise \u00e0 jour est remplac\u00e9e par un composant de \u00ab Destination OLE DB \u00bb. Celui-ci est param\u00e9tr\u00e9 de la fa\u00e7on suivante :<\/p>\n<p><a href=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/img6.JPG\" title=\"img6.JPG\" class=\"thickbox\"><img decoding=\"async\" src=\"http:\/\/mayeur.com\/wordpressfr\/wp-content\/gallery\/art16\/thumbs\/thumbs_img6.JPG\" alt=\"img6.JPG\" title=\"img6.JPG\" \/><\/a><br \/>\nEnfin, la \u00ab t\u00e2che d\u2019ex\u00e9cution de requ\u00eate SQL \u00bb est param\u00e9tr\u00e9e ainsi :<br \/>\n<code>update customers set birthdate=x.birthdate from customers c,tempcustomers x where x.rowkey=c.rowkey<br \/>\nGO<br \/>\ntruncate table tempcustomers<br \/>\nGO<\/code><\/p>\n<p>Il s\u2019agit d\u2019une syntaxe SQL Server (dans le cas pr\u00e9sent, SQL Server 2005, mais fonctionne \u00e9galement sous SQL Server 2000). Il existe des syntaxes \u00e9quivalentes en Oracle.<br \/>\nLe temps de traitement est pass\u00e9 \u00e0 5 secondes 422 milli\u00e8mes, soit pr\u00e8s de 4 fois plus rapide. L\u2019ordre de grandeur peut d\u2019ailleurs \u00eatre parfois encore bien plus important, et il est \u00e9tonnant que cette m\u00e9thode ne soit pas plus souvent pr\u00e9conis\u00e9e.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SSIS dispose d\u2019un composant de destination OLE DB permettant les chargements rapides. Celui-ci est tr\u00e8s efficace pour les insertions de masse. Par contre, il n\u2019existe pas de composant de \u00ab mises \u00e0 jour \u00e0 chargement rapide \u00bb de m\u00eame type. La m\u00e9thode standard pour r\u00e9aliser les update, qui est g\u00e9n\u00e9ralement pr\u00e9sent\u00e9e dans la documentation officielle [&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],"tags":[],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-etl"],"_links":{"self":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":0,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"wp:attachment":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}