Welcome to Sign in | Help

Re: problema cu Connection Timeout

  •  12-19-2006, 7:07 AM

    Re: problema cu Connection Timeout

    2) cum pot selecta n linii dintr-un select incepand cu linia m (echivalentul lui LIMIT de la mySQL)

    Intrebarea aceasta apare destul de des, vezi http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=117121&SiteID=1 sau http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=359211&SiteID=1. In general solutiile recomandate folosesc ROW_NUMBER() intr-un mod sau altul (si eu as merge pe mina lui Umachandar).

    Parerea mea este ca modul acesta de paginare a unui resultset, foarte mult iubit de developerii de web, este problematic pentru ca neglijeaza accesul concurent si schimarile ce pot apare in baza de date intre selectarea 'paginilor'. De exemplu prima pagina contine record-urile r1, r2, ... r10. La selectarea paginii urmatoare, se astepata sa continue cu r11, r12, ... r20 dar, din cauza ca intre timp r8 a fost sters, 'pagina' intoarsa contine r12, r13, ... r21. Recordul r11 nu este returnat de nici o pagina. O solutie mult mai sigura este folosirea unui unique key si a clauzei TOP. La fiecare 'pagina' se cer primele N record-uri care au cheia mai mare decit ultima valoare din pagina anterioara. In general acest mod este si mai eficient, pentru ca planul de access poate localiza direct inceputul 'paginii' si continua scanarea de acolo, fara sa trebuiasca sa scaneze 'in gol' doar ca sa ajunga la primul record (ceea ce toate solutiile cu ROW_NUMBER() sau LIMIT fac).

    HTH,
    ~ Remus

     


    http://rusanu.com
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems