Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

skuteczny sposób na wdrożenie stronicowania

Próbuję dać ci krótką odpowiedź na twoje wątpliwości, jeśli wykonasz skip(n).take(m) metody w linq (z SQL 2005 / 2008 jako serwerem bazy danych) Twoje zapytanie będzie używać Select ROW_NUMBER() Over ... oświadczenie, z jest w jakiś sposób bezpośrednim stronicowaniem w silniku SQL.

Dając przykład, mam tabelę db o nazwie mtcity i napisałem następujące zapytanie (działa również z linq to Entity):

using (DataClasses1DataContext c = new DataClasses1DataContext())
{
    var query = (from MtCity2 c1 in c.MtCity2s
                select c1).Skip(3).Take(3);
    //Doing something with the query.
}

Wynikowe zapytanie to:

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name],  
    [t1].[Code]
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]) AS [ROW_NUMBER], 
        [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
    FROM [dbo].[MtCity] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

To jest dostęp do danych w oknie (całkiem fajnie, btw bo będzie zwracał dane od samego początku i będzie miał dostęp do tabeli, o ile spełnione są warunki). Będzie to bardzo podobne do:

With CityEntities As 
(
    Select ROW_NUMBER() Over (Order By CodCity) As Row,
        CodCity //here is only accessed by the Index as CodCity is the primary
    From dbo.mtcity
)
Select [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc

Z wyjątkiem tego, że to drugie zapytanie zostanie wykonane szybciej niż wynik linq, ponieważ będzie używać wyłącznie indeksu do utworzenia okna dostępu do danych; oznacza to, że jeśli potrzebujesz jakiegoś filtrowania, filtrowanie powinno znajdować się (lub musi być) na liście jednostek (gdzie tworzony jest wiersz), a niektóre indeksy powinny być również utworzone, aby utrzymać dobrą wydajność.

Co jest lepsze?

Jeśli masz dość solidny przepływ pracy w swojej logice, implementacja właściwego sposobu SQL będzie skomplikowana. W takim przypadku LINQ będzie rozwiązaniem.

Jeśli możesz obniżyć tę część logiki bezpośrednio do SQL (w procedurze składowanej), będzie to jeszcze lepsze, ponieważ możesz zaimplementować drugie zapytanie, które ci pokazałem (za pomocą indeksów) i pozwolić SQL na generowanie i przechowywanie planu wykonania zapytanie (poprawa wydajności).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić datę w formacie niemieckim w SQL Server (T-SQL)

  2. Dodaj tożsamości puli aplikacji IIS 7 jako loginy SQL Server

  3. Jak usunąć wszystkie domyślne ograniczenia w bazie danych SQL Server — samouczek SQL Server / TSQL, część 94?

  4. Jakie są ograniczenia bazy danych?

  5. Zaktualizuj profil poczty bazy danych (SSMS)