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

SASでprocsqlを使用してウェアハウス(Oracleエンジン)からデータをプルする際の単純なランダムサンプリング

    DBMS_RANDOMパッケージを使用してレコードを並べ替えてから、行制限句を使用して目的のサンプルサイズに制限します

    dbms_random.value関数は、テーブル内のすべての行について0〜1の乱数を取得し、ランダム値の昇順で並べ替えます。

    識別したサンプルセットを作成する方法は次のとおりです。

        SELECT
        *
    FROM
        (
            SELECT
                *
            FROM
                tbl1
            ORDER BY dbms_random.value
        )
    FETCH FIRST 1000000 ROWS ONLY;
    

    サンプルスキーマテーブルでデモンストレーションするには、emp 、4つのレコードをサンプリングします:

       [email protected]> SELECT
      2      empno,
      3      rnd_val
      4  FROM
      5      (
      6          SELECT
      7              empno,
      8              dbms_random.value rnd_val
      9          FROM
     10              emp
     11          ORDER BY rnd_val
     12      )
     13  FETCH FIRST 4 ROWS ONLY;
    EMPNO  RND_VAL
    7698   0.06857749035643605682648168347885993709
    7934   0.07529612360785920635181751566833986766
    7902   0.13618520865865754766175030040204331697
    7654   0.14056380246495282237607922497308953768
    
    
    [email protected]> SELECT
      2      empno,
      3      rnd_val
      4  FROM
      5      (
      6          SELECT
      7              empno,
      8              dbms_random.value rnd_val
      9          FROM
     10              emp
     11          ORDER BY rnd_val
     12      )
     13  FETCH FIRST 4 ROWS ONLY;
    EMPNO  RND_VAL
    7839   0.00430658806761508024693197916281775492
    7499   0.02188116061148367312927392115186317884
    7782   0.10606515700372416131060633064729870016
    7788   0.27865276349549877512032787966777990909
    

    上記の例では、empno SQL*Plusコマンドの実行中に大幅に変更されます。

    パフォーマンスは、説明している行数の問題である可能性があります。

    編集:

    テーブルのサイズが150ギガから79MMのオーダーであるため、並べ替えは面倒です。

    テーブルに1ずつインクリメントされたシーケンスに基づく代理キーがある場合、キーに基づいてn番目ごとのレコードを選択するアプローチを取ることができます。

    例えば

        --scenario n = 3000
    
     FROM
        tbl1
    WHERE
        mod(table_id, 3000) = 0;
    

    このアプローチでは(関数ベースのインデックスが作成されない限り)インデックスは使用されませんが、少なくともこのサイズのデータ​​セットに対して並べ替えは実​​行されません。

    8000万件近くのレコードがあるテーブルで説明プランを実行し、全表スキャンを実行します(条件により、関数ベースのインデックスなしでこれが強制されます)が、これは維持可能に見えます。



    1. mysqlクエリを使用して、を除くすべてを選択します

    2. PostgreSQLでの一括/バッチ更新/アップサート

    3. CSVファイルの値でOracleテーブルを更新します

    4. 基本クラスと派生オブジェクトのバリアント