{"id":438,"date":"2007-02-01T22:16:17","date_gmt":"2007-02-01T21:16:17","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/2007\/02\/01\/sql-talk\/sql-effizient-daten-erzeugen"},"modified":"2007-02-01T22:16:17","modified_gmt":"2007-02-01T21:16:17","slug":"sql-effizient-daten-erzeugen","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2007\/02\/01\/sql-talk\/sql-effizient-daten-erzeugen","title":{"rendered":"SQL: effizient Daten erzeugen"},"content":{"rendered":"<p>Im gestrigen Posting zu SQL habe ich noch einen anderen Trick von Itzik Ben-Gan verwendet, mit dem man besonders effizient Daten generieren und in eine Tabelle schreiben kann: beim F&#252;llen der Hilfstabelle, in der z.B. die Zahlen von 1 bis 8000 gespeichert werden und daher nur eine Spalte &quot;n&quot; hat.<\/p>\n<p>Prozedural w&#252;rde man eine Schleife von 1 bis 8000 machen und 8000 Insert-Befehle absetzen. Das ist allerdings im mengenorientirten SQL sehr ung&#252;nstig, weil die vielen Einzeloperationen unn&#246;tig viel Zeit kosten. Den Unterschied bemerkt man vor allem, wenn es anstelle der 8.000 mal 8.000.000 Datens&#228;tze sind&#8230;<\/p>\n<p>Viel effizienter ist es einen Datensatz einzuf&#252;gen und dann in einer Schleife die Daten immer wieder zu kopieren (und damit zu verdoppeln). F&#252;r 8.000 Datens&#228;tze sind dann gerade mal 13 Inserts notwendig. Aber erst mit 80.000 bzw. 800.000 Datens&#228;tzen wird die Performance &quot;sp&#252;rbar&quot;. Im Vergleich zur &quot;normalen&quot; Schleife ergibt sich auf meinen heimischen PC ein Performance-Unterschied von Faktor 3 bis 6. <\/p>\n<p><code lang=\"sql\">declare @max\tinteger,<br \/>\n\t@rc\tinteger;<\/p>\n<p>set @max=8000;<br \/>\nset @rc=1;<br \/>\ninsert into hilfstabelle (n) values (1);<\/p>\n<p>while @rc<=@max begin\n\t-- sehr effizentes F&#252;llen durch mengenorientierten Ansatz:\n\tinsert into hilfstabelle (n)\n\t\tselect @rc+n from hilfstabelle where @rc+n<=@max;\n\tset @rc=@rc*2;\nend<\/code><\/p>\n<p>Damit nicht ungewollt zu viele Datens&#228;tze eingef&#252;gt werden, ist der Filter &quot;where @rc+n<=@max\" im SELECT des Inserts notwendig.\n\n\nVorbereitung:\n\n<code lang=\"sql\">if object_id(N'hilfstabelle') is not null drop table hilfstabelle<br \/>\ncreate table hilfstabelle (n integer primary key)<\/code><\/p>\n<p>Der Code steht auch zum <a href=\"\/files\/samples\/stringsaufteilen.sql\">Download<\/a> bereit. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im gestrigen Posting zu SQL habe ich noch einen anderen Trick von Itzik Ben-Gan verwendet, mit dem man besonders effizient Daten generieren und in eine Tabelle schreiben kann: beim F&#252;llen der Hilfstabelle, in der z.B. die Zahlen von 1 bis 8000 gespeichert werden und daher nur eine Spalte &quot;n&quot; hat. Prozedural w&#252;rde man eine Schleife [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/438"}],"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=438"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/438\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=438"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}