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

SQLでn個のランダムな行を更新します

    ROWIDを使用します:

    UPDATE xyz SET x='Y' WHERE rowid IN (
        SELECT r FROM (
            SELECT ROWID r FROM xyz ORDER BY dbms_random.value
        ) RNDM WHERE rownum < n+1
    )
    

    私がROWIDを使用する実際の理由は、効率のためではありません(それでも全表スキャンを実行します)-列mの場合、SQLは必要な行数を更新しない可能性があります ユニークではありません。

    行が1000行しかないので、効率について心配する必要はありません(1億行の場合もあります)。このテーブルにインデックスがないと、ランダムなレコードを選択するために全表スキャンを実行するのに行き詰まります。

    [編集:] 「しかし、100,000行ある場合はどうなるか」

    ええと、それでも1億未満の3桁です。

    私は以下を実行しました:

    create table xyz as select * from all_objects;
    

    [私のシステムで約50,000行を作成しました-テーブルと同じように、インデックス付けされていません]

    UPDATE xyz SET owner='Y' WHERE rowid IN (
         SELECT r FROM (
              SELECT ROWID r FROM xyz ORDER BY dbms_random.value
         ) RNDM WHERE rownum < 10000
    );
    commit;
    

    これには約1.5秒かかりました。多分それは1秒、多分最大3秒でした(正式に時間を計っていませんでした、まばたきするのにちょうど十分な時間がかかりました)。



    1. Microsoft SQL Server 2008 R2 を使用する PHP 5.5.0 - sqlsrv_connect() はありませんか?

    2. 行の作成と最終変更のタイムスタンプ

    3. MySQLを使用したマテリアライズドビュー

    4. MySQLC++コネクタの未解決の外部シンボル_get_driver_instance