id
がインデックスであるならば、私はこれらの線に沿って何かを考えています:
with ids as (
select 1 as id
union all
select id + 125000
from ids
where id <= 100000000
)
select ids.id,
(select name from table t where t.id = ids.id) as name
from ids
option (MAXRECURSION 1000);
私は、この製剤は、テーブルの上にインデックスを使用すると思います。
EDIT:
私はこのアプローチを考えると、あなたは実際には、テーブルではなく、単に等間隔のもの、実際のランダムIDを取得するためにそれを使用することができます:
with ids as (
select 1 as cnt,
ABS(CONVERT(BIGINT,CONVERT(BINARY(8), NEWID()))) % 100000000 as id
union all
select cnt + 1, ABS(CONVERT(BIGINT,CONVERT(BINARY(8), NEWID()))) % 100000000
from ids
where cnt < 800
)
select ids.id,
(select name from table t where t.id = ids.id) as name
from ids
option (MAXRECURSION 1000);
実際のコードを乱数発生器はhereから来ました。
EDIT:
により、SQL Serverの癖に、あなたはまだもあなたのシナリオでは、非連続のIDを取得することができます。これにより、answerが原因を説明しています。要するに、ID値は一度に1つずつ割り当てられるのではなく、グループで割り当てられます。サーバーが失敗し、未使用の値さえもスキップされます。
ランダムサンプリングを行いたい理由の1つは、この問題を回避することでした。おそらく、上記の状況はほとんどのシステムではまれです。ランダムサンプリングを使用して、900個のIDを生成することができます。これらから、あなたのサンプルに実際に利用可能な800を見つけることができるはずです。
これを行う目的は何ですか:
非連続的なIDの状況で任意の「穴」を避けるために、あなたはこのような何かを試すことができますか?結果のランダムなサブセットを取得しようとしていますか? –