{"id":14,"date":"2008-07-10T23:27:36","date_gmt":"2008-07-10T21:27:36","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2008\/07\/ssis-semi-blocking-transformation-fuer-distinct\/"},"modified":"2008-07-10T23:27:36","modified_gmt":"2008-07-10T21:27:36","slug":"ssis-semi-blocking-transformation-fuer-distinct-pivot","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2008\/07\/ssis-semi-blocking-transformation-fuer-distinct-pivot\/","title":{"rendered":"SSIS semi-blocking transformation f\u00fcr Distinct: PIVOT"},"content":{"rendered":"<p>In SSIS gibt es mehrere M\u00f6glichkeiten, auf einer Datenmenge einen DISTINCT anzuwenden.<br \/>\nDie einfachsten sind <em>SORT<\/em> und <em>AGGREGATE<\/em>.<\/p>\n<p>Diese Transformationen haben jedoch den Nachteil, dass sie sogenannte <em>blocking transformations<\/em> sind, d.h. dass der n\u00e4chste Schritt erst durchgef\u00fchrt wird, nachdem <u>alle<\/u> Daten durch die <em>SORT<\/em>&#8211; oder <em>AGGREGATE<\/em>-Transformation gegangen sind.<br \/>\nDies erh\u00f6ht nat\u00fcrlich den Speicherbedarf und die Performance.<\/p>\n<p>Die <em>PIVOT<\/em>-Transformation bietet aber auch diese M\u00f6glichkeit und ist dabei nur <em>semi-blocking<\/em>, d.h. <em>PIVOT<\/em> arbeitet asynchron, startet aber bereits mit der Ausgabe, auch wenn noch nicht alle Daten verarbeitet wurden. [Ein netter Blog-Eintrag \u00fcber blocking, semi-blocking etc. findet sich <a title=\"Jorg's Blog-Eintrag \u00fcber blocking transformations\" href=\"http:\/\/sqlblogcasts.com\/blogs\/jorg\/archive\/2008\/02\/27\/SSIS-_1320_-Non_2D00_blocking_2C00_-Semi_2D00_blocking-and-Fully_2D00_blocking-components.aspx\" target=\"_blank\">hier: sqlblogcasts.com\/blogs\/jorg\/archive\/2008\/02\/27\/&#8230;<\/a>]<\/p>\n<p>Ein Nachteil ist nat\u00fcrlich, dass die PIVOT-Transformation nicht so einfach einzustellen ist, da nur der Advanced Editor zur Verf\u00fcgung steht, alle Output-Spalten manuell eingetragen werden m\u00fcssen und sogar die Lineage-ID getippt werden muss. Au\u00dferdem muss der Input nach dem Schl\u00fcssel sortiert vorliegen &#8211; sonst funktioniert PIVOT nicht korrekt. Dies kann aber \u00fcber ein ORDER BY im SQL leicht erreicht werden.<\/p>\n<p>Es ist zu beachten, dass mindestens eine Spalte ein Pivot-Schl\u00fcssel sein muss und eine Spalte die pivotierte Spalte sein muss. Das Ergebnis dieser Spalte muss man allerdings nicht verwenden.<\/p>\n<p>Hier die Einstellungen in einem Beispiel:<\/p>\n<p>Als Abfrage verwenden wir<\/p>\n<blockquote><p>SELECT YEAR(OrderDate) AS Auftragsjahr, MONTH(OrderDate) AS AuftragsMonat, DAY(OrderDate) AS Auftragstag<br \/>\nFROM Purchasing.PurchaseOrderHeader<br \/>\nORDER BY 1, 2, 3<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<p>auf die AdventureWorks-Datenbank.<\/p>\n<p>Das PIVOT-Element wird wie folgt definiert:<\/p>\n<ul>\n<li>Tab &#8222;Input Columns&#8220;: Alle Spalten als READONLY markieren<\/li>\n<li>Tab &#8222;Input and Output Properties&#8220; &gt; &#8222;Pivot Default Input&#8220; &gt; &#8222;Input Columns&#8220;:\n<ul>\n<li>F\u00fcr Auftragsjahr und AuftragsMonat die Eigenschaft &#8222;PivotUsage&#8220; auf 1 stellen (soll hei\u00dfen &#8222;Schl\u00fcssel-Element&#8220;)<\/li>\n<li>F\u00fcr Auftragsdatum (diese Spalte brauchen wir nicht mehr) die Eigenschaft &#8222;PivotUsage&#8220; auf 2 stellen (soll hei\u00dfen &#8222;diese Spalteninhalte werden pivotiert&#8220; &#8211; da aber keine Ziel-Spalten dazu angegeben wurden, passiert das nicht)<\/li>\n<\/ul>\n<\/li>\n<li>Tab &#8222;Input and Output Properties&#8220; &gt; &#8222;Pivot Default Output&#8220; &gt; &#8222;Output Columns&#8220;:\n<ul>\n<li>zwei neue Spalten anlegen &#8222;Auftragsjahr&#8220; und &#8222;Auftragsmonat&#8220;<\/li>\n<li>Jeweils als Name &#8222;Auftragsjahr&#8220; bzw. &#8222;Auftragsmonat&#8220; eintragen<\/li>\n<li>Jeweils als SourceColumn die LineageID der Quell-Spalte eintragen (Diese ersieht man aus den Eigenschaften der entsprechenden Input Column &#8211; 1 Zeile \u00fcber dem Namen)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Hier ein paar Screen Shots zu den Einstellungen&#8230; :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"458\" alt=\"EinstellungenSeite1\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/einstellungenseite1.jpg\" width=\"450\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"455\" alt=\"EinstellungenSeite2\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/einstellungenseite2.jpg\" width=\"450\" \/><\/p>\n<p>&#8230; und dem Ergebnis:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"283\" alt=\"DataFlow\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/dataflow.gif\" width=\"278\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"532\" alt=\"Vorher\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/vorher.jpg\" width=\"227\" \/> <img loading=\"lazy\" decoding=\"async\" height=\"531\" alt=\"Nachher\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/nachher.jpg\" width=\"203\" \/><\/p>\n<p>Eine Anmerkung:<\/p>\n<p>Dieser Trick funktioniert nur, wenn man eine Spalte im Recordset hat, die man nicht mehr ben\u00f6tigt &#8211; wie in unserem Fall der Auftragstag. Wenn man aber eine solche Spalte nicht zur Verf\u00fcgung hat, kann \u00fcber eine abgeleitete Spalte (derived column) leicht eine solche erstellen.<\/p>\n<p>Das dtsx-Paket steht hier zum Download bereit: <a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/07\/pivotstattaggregate.zip\">PivotStattAggregate.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In SSIS gibt es mehrere M\u00f6glichkeiten, auf einer Datenmenge einen DISTINCT anzuwenden. Die einfachsten sind SORT und AGGREGATE. Diese Transformationen haben jedoch den Nachteil, dass sie sogenannte blocking transformations sind, d.h. dass der n\u00e4chste Schritt erst durchgef\u00fchrt wird, nachdem alle Daten durch die SORT&#8211; oder AGGREGATE-Transformation gegangen sind. Dies erh\u00f6ht nat\u00fcrlich den Speicherbedarf und die &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2008\/07\/ssis-semi-blocking-transformation-fuer-distinct-pivot\/\" class=\"more-link\"><span class=\"screen-reader-text\">SSIS semi-blocking transformation f\u00fcr Distinct: PIVOT<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-integrationservices"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":0,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}