sql >> データベース >  >> RDS >> Oracle

Oracleからのサンプリング、正確な数の結果が必要(サンプル句)

    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を評価することをお勧めします。 アプローチも同様であり、データが拡散し、「代表性」の要件がそれを要求する場合は、層化バージョンです。



    1. データベースの増分変更の検出(OracleからMongoDB ETLへ)

    2. oracle.jdbc.driver.T4CTTIrxd.readBitVector(T4CTTIrxd.java:135)でのjava.lang.ArrayIndexOutOfBoundsException

    3. PHPの日時スタンプが正しいことを確認しますか?

    4. pyodbcはデータベースに接続できません