Jak to robicie w MSSQLu?
Norbert - 07-07-2006 02:22
Jak to robicie w MSSQLu?
Witam Grupowiczow,
Mam aplikacje ktorej SQL'owy engine byl rozwijany w PostgreSQL. Jestem z tego zadowolony. Muszę jednak stworzyc wersje tej aplikacji dzialajaca w MS SQLu.
W sumie nie jest tak trudno, ale zacialem sie (z logicznego punktu widzenia) na jednej rzeczy. W MS SQLu nie ma parametru LIMIT, OFFSET.
"Odpowiednikiem" tego parametru jest TOP, niestety nie ma offsetu. Teoretycznie mozna sobie z tym poradzic, ale kosztem wydajnosci.
W zwiazku z tym mam pytanie do praktykow. W jaki sposob przygotowujecie dane typu data-grid stronicowane np. co 10 rekordów. W postgresie i kilku innych bazach wystarczyloby "select * from tabela LIMIT 10,0" a nastepnie "select * from tabela LIMIT 10,10", itd. Jak zacznę kombinowac z MS SQL to jesli korzystam z TOP i subselecta wyrzucajacego mi część danych, to powstają problemy wydajnościowe. Tak samo jesli zrobie "select top 10 * from tabela", a nastepnie "select top 20 * from tabela" i pokaze dopiero od 11 rekordu to im dalej sie przemieszczam po tabeli tym wolniej to dziala.
Jak Wy to robicie?
Z gory dzieki za pomoc
Pozdrawiam
Norbert
Grzegorz Danowski - 07-07-2006 02:22
Użytkownik "Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> napisał w wiadomości news:44aceee6$1@news.home.net.pl... > Witam Grupowiczow, > > Mam aplikacje ktorej SQL'owy engine byl rozwijany w PostgreSQL. Jestem z > tego zadowolony. > Muszę jednak stworzyc wersje tej aplikacji dzialajaca w MS SQLu. > > W sumie nie jest tak trudno, ale zacialem sie (z logicznego punktu > widzenia) na jednej rzeczy. > W MS SQLu nie ma parametru LIMIT, OFFSET. > > "Odpowiednikiem" tego parametru jest TOP, niestety nie ma offsetu. > Teoretycznie mozna sobie z tym poradzic, ale kosztem wydajnosci. >
Której wersji SQL Servera używasz? Jeśli 2005, to będzie łatwiej. G.
g0mez - 07-07-2006 02:22
Użytkownik "Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> napisał w wiadomości news:44aceee6$1@news.home.net.pl... > Witam Grupowiczow, > Mam aplikacje ktorej SQL'owy engine byl rozwijany w PostgreSQL. Jestem z > tego zadowolony. > Muszę jednak stworzyc wersje tej aplikacji dzialajaca w MS SQLu. > W sumie nie jest tak trudno, ale zacialem sie (z logicznego punktu > widzenia) na jednej rzeczy. > W MS SQLu nie ma parametru LIMIT, OFFSET. > "Odpowiednikiem" tego parametru jest TOP, niestety nie ma offsetu. > Teoretycznie mozna sobie z tym poradzic, ale kosztem wydajnosci. > W zwiazku z tym mam pytanie do praktykow. W jaki sposob przygotowujecie > dane typu data-grid stronicowane np. co 10 rekordów. W postgresie i > kilku innych bazach wystarczyloby "select * from tabela LIMIT 10,0" a > nastepnie "select * from tabela LIMIT 10,10", itd. Jak zacznę > kombinowac z MS SQL to jesli korzystam z TOP i subselecta wyrzucajacego > mi część danych, to powstają problemy wydajnościowe. Tak samo jesli > zrobie "select top 10 * from tabela", a nastepnie "select top 20 * from > tabela" i pokaze dopiero od 11 rekordu to im dalej sie przemieszczam > po tabeli tym wolniej to dziala. Jak Wy to robicie? > Z gory dzieki za pomoc > Pozdrawiam > Norbert
Jak piszesz za pomocą ADO to można iść w zupełnie inną stronę. Otwierasz zapytanie (Recordset) bez używania top czy offset, a jedynie klucz stawiasz po stronie serwera. Określasz wcześniej rozmiar strony (PageSize) i poruszasz się między stronami za pomocą AbsolutePage, pobierając dane dla określonej liczby rekordów. Możesz też używać AbsolutePosition, aby przemieszczać się pomiędzy poszczególnymi rekordami. Jeśli używasz BDS to tam stron nie ma ale za jest RecNo, który ustawia AbsolutePosition (tak mi się wydaje, że on to robi). Ja używam tego tak: otwieram recordset, przechodzę do pierwszego wyświetlanego rekordu, pobieram dane do bufora aż do ostatniego wyświetlanego, na koniec wyświetlam dane buforowane. Przesuwanie okna podglądu danych powoduje uzupełnianie bufora. Buforem jest lista o rozmiarze RecordCount zawierająca instancje klas reprezentujących rekord danych.
kubik - 08-07-2006 00:13
Norbert napisał(a): > W sumie nie jest tak trudno, ale zacialem sie (z logicznego punktu widzenia) > na jednej rzeczy. > W MS SQLu nie ma parametru LIMIT, OFFSET. Polecam artykuł: http://www.codeproject.com/aspnet/PagingLarge.asp
pozdrawiam Adam Kubiczek
Norbert - 11-07-2006 00:09
"Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> wrote in message news:e8is4s$bor$1@inews.gazeta.pl...
> Której wersji SQL Servera używasz? Jeśli 2005, to będzie łatwiej. > G.
Używam MS SQL 2000.
Norbert
Norbert - 11-07-2006 00:09
> W MS SQLu nie ma parametru LIMIT, OFFSET. Polecam artykuł: http://www.codeproject.com/aspnet/PagingLarge.asp
Dzięki
Norbert
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Skrypt listowania plików
Kompresja lepsza niz w PS
program do duzej ilosci zdjec
=?ISO-8859-2?Q?kr=F3tkie_pytanie_o_d=B3ugie_przetwarzanie_(PS )?=
Bezpieczne korzystanie z tabeli przez kilku użytkowników
Konwersja bazy PARADOX do CSV
z LATIN2 na UTF8
SQL Server 2000 dobry edytor
oczy dziewczyny - gdzie free foto?
Trigger ... pytanie do prawdziwych wyjadaczy
zanotowane.pldoc.pisz.plpdf.pisz.pllatwa-kasiora.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|