DEV Community

loading...

Discussion on: Dica Rápida: Paginando no MSSQL considerando escala

Collapse
silverio27 profile image
Lucas Silvério

Oi Willian! Isso faz sentido se o Id for um Guid?

Collapse
wsantosdev profile image
William Santos Author

Oi, Lucas! Tudo bom?

Não vejo sentido em usar o GUID como fonte de ordenação, por conta da forma como o SQL Server o ordena. Entendo que faça mais sentido neste caso usar ROW_NUMBER sobre o GUID e fazer a paginação a partir dele.

Seria algo assim:

WITH PagedCustomers AS (
SELECT
ROW_NUMBER() OVER(ORDER BY Id) RowNumber,
Id,
FirstName,
LastName
FROM
Customers
) SELECT
Top (@PageSize) Id,
FirstName,
LastName
FROM
PagedCustomers
WHERE
RowNumber > @LastRowNumber

Collapse
silverio27 profile image
Lucas Silvério

Boa! Eu acabei chegando nessa conclusão tb, mas nunca tinha usado o WITH😶.
Tem diferença no desempenho nas abordagens abaixo:

-- SUBQUERY
select * from (
select row_number() over (order by CreatedAt desc) as row#, Id,
CreatedAt,
Name,
Email
from [User]) as result
where row# >= @LastRowNumber and row# <= @PageSize;

-- WITH
with pagedUsers as (
select row_number() over (order by CreatedAt desc) as row#, Id,
CreatedAt,
Name,
Email
from [User])
select top @PageSize * from pagedUsers
where row# >= @LastRowNumber;

Thread Thread
wsantosdev profile image
William Santos Author

Entendo que não haja diferença no desempenho, não. Optei pelo WITH por fazer parte da sintaxe CTE (Common Table Expressions), que entendo ser mais expressiva.

Na subquery você pode usar também o TOP para obter o número de registros igual a @PageSize, seguindo o exemplo do WITH. E, no caso da cláusula WHERE da subuqery, colocar row# >= @LastRowNumber and row# <= @PageSize vai deixar de funcionar na segunda página! rs

Thread Thread
silverio27 profile image
Lucas Silvério

sim tem razão! eu alterei o código aqui pra exemplificar e não me atentei a isso. Valeu pela atenção!