{"id":1184,"date":"2008-07-11T18:30:47","date_gmt":"2008-07-11T16:30:47","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=1184"},"modified":"2008-07-09T22:49:47","modified_gmt":"2008-07-09T20:49:47","slug":"sql-paging","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2008\/07\/11\/sql-talk\/sql-paging","title":{"rendered":"SQL: Paging"},"content":{"rendered":"<p>Als uns letzte Woche <a href=\"http:\/\/blogs.msdn.com\/dparys\/\">Darius Parys<\/a> das neue Entity-Framework von Microsoft vorstellte, warfen wir auch einen Blick auf das (unter der Haube) produzierte SQL. Dabei viel mir auf, dass dort das Paging-Problem &#8211; Die Daten werden in H&#228;ppchen von SQl-Server angefordert und gelesen &#8211; mittels ROW_NUMBER gel&#246;st wird. Das ist nat&#252;rlich ein sehr pragmatischer Ansatz, der aber nur dann wirklich performant klappen kann, wenn auf dem Ordnungskriterium (meist dem Schl&#252;ssel) auch wirklich der Clustered-Index liegt. Die Variante von Microsoft war jedenfalls erheblich komplizierter als der <a href=\"http:\/\/blogs.x2line.com\/al\/archive\/2005\/11\/18\/1323.aspx\">g&#228;ngige<\/a>, deswegen kann ich den auch nicht auswendig hinschrieben. <\/p>\n<p>In der Regel w&#252;rde ich aber sowieso empfehlen den Clustered-Index aber eher auf fachliche Kriterien zu legen, damit alle Datens&#228;tze, die zugleich bearbeitet werden auf den gleichen (oder benachbarten) Datenseiten liegen. Damit ist aber fast jede Art des Paging auf den technischen Schl&#252;sseln langsam.<\/p>\n<p>Bl&#246;d ist nat&#252;rlich auch, dass Einf&#252;gevorg&#228;nge seltsame Nebenwirkungen haben k&#246;nnen. Wenn ich z.B. eine &quot;Seite&quot; von Daten am Bildschirm sehe und dann eine Minute sp&#228;ter die zweite abrufe, dann bekomme ich als ersten unter Umst&#228;nden S&#228;tze angezeigt, die ich schon auf der ersten Seite sah, wenn inzwischen Datens&#228;tze eingef&#252;gt wurden. Dito beim L&#246;schen, nur umgekehrt. \ud83d\ude42<\/p>\n<p>Bei uns werden daher meistens die letzten IDs gespeichert und dann die danach folgenden Daten abgerufen. Mit TOP kann man dann steuern, wie viele man bekommen m&#246;chte. Wie gesagt, auch sollte wenigstens ein Index auf den Schl&#252;ssel liegen, am besten ein Clustered&#8230;<\/p>\n<p><a href=\"http:\/\/www.sqljunkies.com\/WebLog\/tom_rizzo\/default.aspx\">Tom Rizzo<\/a> von Microsoft schlug uns 2002 hingegen vor, dass wir zu dem Zweck <a href=\"http:\/\/www.themanaged.net\/archive\/2007\/02\/13\/10.aspx\">zwei verschachtelte TOPs<\/a> verwenden, was auch wieder nur dann schnell ist, wenn der Index stimmt. \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als uns letzte Woche Darius Parys das neue Entity-Framework von Microsoft vorstellte, warfen wir auch einen Blick auf das (unter der Haube) produzierte SQL. Dabei viel mir auf, dass dort das Paging-Problem &#8211; Die Daten werden in H&#228;ppchen von SQl-Server angefordert und gelesen &#8211; mittels ROW_NUMBER gel&#246;st wird. Das ist nat&#252;rlich ein sehr pragmatischer Ansatz, [&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":[214,929],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1184"}],"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=1184"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1184\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=1184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=1184"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=1184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}