がインデックスにある場合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);
この定式化は、表のインデックスを使用すると思います。
編集:
このアプローチについて考えると、実際にそれを使用して、テーブル内の実際のランダム 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から来ました。
編集:
SQL Server の癖により、シナリオ内であっても連続していない ID を取得できます。この受け入れられた答えは原因を説明しています。つまり、ID 値は一度に 1 つずつ割り当てられるのではなく、グループで割り当てられます。サーバーが失敗する可能性があり、未使用の値でさえスキップされます。
ランダム サンプリングを実行する理由の 1 つは、この問題を回避するためです。おそらく、上記の状況はほとんどのシステムでかなりまれです。ランダム サンプリングを使用して、たとえば 900 個の ID を生成できます。これらから、サンプルに実際に使用できる 800 個を見つけることができるはずです。