Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

ефективен начин за прилагане на пейджинг

Опитвам се да ви дам кратък отговор на вашето съмнение, ако изпълните skip(n).take(m) методи на linq (с SQL 2005 / 2008 като сървър на база данни) вашата заявка ще използва Select ROW_NUMBER() Over ... изявление, with е някак директно пейджинг в SQL машината.

Като ви давам пример, имам таблица с db, наречена mtcity и написах следната заявка (работи и с linq to entities):

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

Получената заявка ще бъде:

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]

Което е достъп до данни в прозорец (много готино, между другото, защото ще връща данни от самото начало и ще има достъп до таблицата, стига да са изпълнени условията). Това ще бъде много подобно на:

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

С изключение на това, че тази втора заявка ще бъде изпълнена по-бързо от резултата linq, защото ще използва изключително индекса за създаване на прозореца за достъп до данни; това означава, че ако имате нужда от филтриране, филтрирането трябва да бъде (или трябва да бъде) в списъка с обекти (където е създаден редът) и трябва да бъдат създадени някои индекси, за да поддържате доброто представяне.

Сега, какво е по-добре?

Ако имате доста стабилен работен поток във вашата логика, прилагането на правилния SQL начин ще бъде сложно. В този случай LINQ ще бъде решението.

Ако можете да намалите тази част от логиката директно до SQL (в съхранена процедура), ще бъде още по-добре, защото можете да приложите втората заявка, която ви показах (с помощта на индекси) и да позволите на SQL да генерира и съхранява плана за изпълнение на заявка (подобряване на производителността).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирате отрицателни стойности със скоби в SQL Server (T-SQL)

  2. Одит на данни в NHibernate и SqlServer

  3. Препоръчителни процесори Intel за натоварвания на SQL Server 2014

  4. Как да се покаже дата в британски формат в SQL Server (T-SQL)

  5. Как да премахнете ограничението по подразбиране на SQL, без да знаете името му?