{"id":1056,"date":"2008-05-05T18:57:32","date_gmt":"2008-05-05T16:57:32","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/2008\/05\/05\/sql-talk\/performance\/sql-server-2005-stoerer-beim-pivot-eliminieren"},"modified":"2008-05-11T11:07:28","modified_gmt":"2008-05-11T09:07:28","slug":"sql-server-2005-stoerer-beim-pivot-eliminieren","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2008\/05\/05\/sql-talk\/performance\/sql-server-2005-stoerer-beim-pivot-eliminieren","title":{"rendered":"SQL-Server-2005: St&#246;rer beim PIVOT eliminieren"},"content":{"rendered":"<p>Als ich mit dem PIVOT-Konstrukt arbeitete und performante Ergebnisse haben wollte, muss ich erst verstehen, wie es intern arbeitet. Das beschrieb ich im Artikel &quot;<a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/03\/sql-talk\/performance\/sql-server-2005-schnelles-pivot\">SQL-Server-2005: schnelles Pivot?<\/a>&quot;. Diese Serien soll meine Erfahrungen weitergeben und bei Verstehen der Zusammenh&#228;nge helfen. Mit ein paar Kniffen kann man dann die Ausf&#252;hrung erheblich beschleunigen. Das kommt im n&#228;chsten Artikel. Der Quellcode zu diesem Artikel steht &#252;brigens <a href=\"http:\/\/www.glorf.it\/files\/200710_pivot\/04_stoerer_eliminieren.sql\">hier<\/a>.<\/p>\n<ul>\n<li><a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/03\/sql-talk\/performance\/sql-server-2005-schnelles-pivot\">Artikel 1: Wie wird Pivot abgearbeitet?<\/a><\/li>\n<li><a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/05\/sql-talk\/performance\/sql-server-2005-stoerer-beim-pivot-eliminieren\">Artikel 2: St&#246;rer beim PIVOT eliminieren<\/a><\/li>\n<li><a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/07\/sql-talk\/performance\/sql-server-2005-pivot-und-performance\">Artikel 3: Pivot-Performance<\/a><\/li>\n<li><a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/09\/sql-talk\/performance\/sql-server-2005-pivot-auf-joins\">Artikel 4: Pivot-Performance mit Joins<\/a><\/li>\n<\/ul>\n<p><strong>Eliminierung von St&#246;rern<\/strong><\/p>\n<p>Wenn in der Tabelle weitere Spalten enthalten sind, dann kann das mit PIVOT zu unerwarteten Ergebnissen f&#252;hren. Wenn die Tabelle OpenSchema bspw. auch noch die Spalte \u201eStoerer\u201c enth&#228;lt:<br \/>\n<img src='http:\/\/www.glorf.it\/blog\/wp-content\/uploads\/2008\/05\/tabopenschema_mit_stoerer.jpg' alt='Tabelle Openschema mit St&#246;rer' \/><\/p>\n<p>Wenn man nun einfach das PIVOT aus dem <a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/03\/sql-talk\/performance\/sql-server-2005-schnelles-pivot\">letzten Artikel<\/a> einfach verwendet, dann f&#252;hrt das zu komischen Ergebnissen.<\/p>\n<p><code lang=\"sql\">SELECT ID,<br \/>\n\tattr1 as Typ,<br \/>\n\tattr2 as Datum,<br \/>\n\tattr3 as Anzahl,<br \/>\n\tattr4 as Dings,<br \/>\n\tattr5 as Bums<br \/>\nFROM OpenSchema<br \/>\n\tPIVOT\t(<br \/>\n\t    MAX(&quot;Value&quot;)<br \/>\n\t    FOR Attribute IN (&quot;attr1&quot;, &quot;attr2&quot;, &quot;attr3&quot;, &quot;attr4&quot;, &quot;attr5&quot;)<br \/>\n\t) AS pvt<br \/>\nORDER BY ID<\/code><\/p>\n<p><img src='http:\/\/www.glorf.it\/blog\/wp-content\/uploads\/2008\/05\/unerwartetes_ergebnis.jpg' alt='Unerwartetes Ergebnis' \/><\/p>\n<p>Das liegt an der impliziten Gruppierung aller Felder aus der Basistabelle. Es kann also passieren, dass durch eine unbedachte Tabellenerweiterung einige SELECTs ein v&#246;llig anderes Ergebnis liefern. Das ist nicht im Geiste von SQL, ist unangenehm und soll vermieden werden. Daher rate ich dazu PIVOT-Statements immer so zu formulieren, dass sie nicht auf der Basistabelle arbeiten, sondern einer Derived-Table: <\/p>\n<p><code lang=\"sql\">SELECT ID,<br \/>\n\tattr1 as Typ,<br \/>\n\tattr2 as Datum,<br \/>\n\tattr3 as Anzahl,<br \/>\n\tattr4 as Dings,<br \/>\n\tattr5 as Bums<br \/>\nFROM (<br \/>\n\t\tSELECT ID, Attribute, Value<br \/>\n\t\tFROM OpenSchema) as dt<br \/>\n\tPIVOT\t(<br \/>\n\t    MAX(&quot;Value&quot;)<br \/>\n\t    FOR Attribute IN (&quot;attr1&quot;, &quot;attr2&quot;, &quot;attr3&quot;, &quot;attr4&quot;, &quot;attr5&quot;)<br \/>\n\t) AS pvt<br \/>\nORDER BY ID<\/code><\/p>\n<p>Das liefert nicht nur in diesem Fall das erwartete Ergebnis, sondern auch nach weiteren Tabellen&#228;nderungen. Der Zugriffsplan ist entspricht dem <a href=\"http:\/\/www.glorf.it\/blog\/2008\/05\/03\/sql-talk\/performance\/sql-server-2005-schnelles-pivot\">ersten Artikel<\/a>.<\/p>\n<div class=\"small\">Diese Reihe schrieb ich letzten Oktober als Reaktion auf den Aufruf im SQL-PASS-Newsletter. M&#246;glicherweise erscheint der Artikel noch dort. Ich ver&#246;ffentliche ihn jetzt aber lieber mal bevor er mit dem bald erscheinenden SQL-Server-2008 m&#246;glicherweise veraltet&#8230; \ud83d\ude09<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Als ich mit dem PIVOT-Konstrukt arbeitete und performante Ergebnisse haben wollte, muss ich erst verstehen, wie es intern arbeitet. Das beschrieb ich im Artikel &quot;SQL-Server-2005: schnelles Pivot?&quot;. Diese Serien soll meine Erfahrungen weitergeben und bei Verstehen der Zusammenh&#228;nge helfen. Mit ein paar Kniffen kann man dann die Ausf&#252;hrung erheblich beschleunigen. Das kommt im n&#228;chsten Artikel. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18],"tags":[930,51,929],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1056"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=1056"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1056\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=1056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=1056"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=1056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}