1

数据源将包含大约。5000 条记录。我知道可以使用orderby newid(). 但是要排序的数据应该是分页的。这意味着第 n 页不能包含前一页(n-1、n-2 等)的记录。现在我想我有两种方法可以走:在数据库中排序,或者在内存中排序(因为 5000 条记录足够小,可以将其保存在内存缓存中)。

对于选项 1(在 db 中排序),我不确定是否可能,因为应该分页数据。如果可以,有可能吗?对于选项 2,是否有任何好的算法(好的是高性能和高度随机的排序器)来对内存中的数据进行排序?在这种情况下你会怎么做:在内存或数据库中排序,为什么?

4

1 回答 1

0

您可以在 TSQL 中使用伪随机数来生成可重现的随机值列表。

从 的计算中删除注释分隔符@Seed将导致序列随着 的每个新值而变化@LastLogin

-- Some user specific value that does not change.
declare @UserId as Int = 42
-- Some user specific value that changes as often as you want the order to change for a user.
declare @LastLogin as DateTime = SysDateTime()
-- Paging parameters.
declare @PageSize as Int = 10
declare @PageNumber as Int = 2

select @UserId as Seed, @UserId + DatePart( ms, @LastLogin ) as AlternativeSeed, @LastLogin as LastLogin
declare @Seed as Int = @UserId -- + DatePart( ms, @LastLogin )

; with Numbers ( Number, PseudorandomNumber ) as (
  -- Select the "first" row from your data.
  select 1, Rand( @Seed )
  union all
  -- Add the "next" row from your data.
  select Number + 1, Rand( 1000000 * PseudorandomNumber )
    from Numbers
    where Number < 100
  ),
-- Add row numbers to the previous rowset to allow paging.
NumbersWithRowNumber as (
  select *, Row_Number() over ( order by PseudorandomNumber ) as RowNumber
    from Numbers
  )
-- Select the requested page of data.
select *
  from NumbersWithRowNumber
  where RowNumber between @PageSize * ( @PageNumber - 1 ) + 1 and @PageSize * @PageNumber
  order by RowNumber
于 2012-05-04T15:51:33.797 回答