1

データソースには約が含まれます。5000 レコード。でデータをランダムに並べ替えることができることを知っていorderby newid()ます。ただし、並べ替えるデータはページングする必要があります。つまり、ページ n には前のページ (n-1、n-2 など) のレコードを含めることはできません。データベースでの順序付け、またはメモリ内での順序付けの 2 つの方法があると思います (5000 レコードはメモリ内キャッシュに保持するのに十分小さいため)。

オプション 1 (データベースでの並べ替え) については、データをページングする必要があるため、それが可能かどうかはわかりません。はいの場合、どのように可能ですか?オプション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 に答える