jonearlesのサンプルテーブルを借りると、まったく同じものが表示され(OEL開発者イメージの11gR2で)、通常はa
の値を取得します。 1
に大きく偏っている;サンプルサイズが小さいと、まったく何も見えないことがあります。コメントで述べた追加のランダム化/制限ステップ:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
...私が得た3回の実行で:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
はい、100%は本当に1
として戻ってきました 2回目の実行で。スキュー自体はかなりランダムに見えます。 block
で試してみました おそらく驚くべきことに、ほとんど違いがないように見えた修飾子-この状況ではさらに悪化すると思ったかもしれません。
これは、テーブル全体にヒットする必要があるため、サンプルサイズが小さい場合は、遅くなる可能性があります。しかし、かなり一貫して分割することさえできます:
select a, count(*) from (
select a, b from (
select a, b, row_number() over (order by dbms_random.value) as rn
from test1
)
where rn < 101
)
group by a;
3回の実行で、次のようになりました。
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
...少し健康に見えます。もちろんYMMV。
このOracleの記事
いくつかのサンプリング手法について説明しているので、ora_hash
を評価することをお勧めします。 アプローチも同様であり、データが拡散し、「代表性」の要件がそれを要求する場合は、層化バージョンです。