1

データベースでデータを難読化する必要があるシナリオがあります(=テスト目的でスクランブルするため、実際のデータを表示することはできません。スクランブルを解除/難読化を解除する必要はありません)。address_table を参照しているテーブルがいくつかあります。address_table を難読化することはできないため、これらのテーブルの参照をランダムな他の address_table ID に変更するだけであると考えました。address_table には 6M 以上のレコードが含まれています。そのため、すべてのアドレス ID を含む一時テーブルを作成し、必要に応じて関数を呼び出してそこからランダムなものを取得します。したがって、ランダムな値を生成して、その行を次のように取得できます。

Select * From (
Select Id, Rownum Rn From myTempTable )
WHERE  RN = x;

ここで、x は dbms_random によって生成されるランダム値です。今、これは私が必要としているものですが、私が期待するものに近いものは何も実行しません. 私が試した他のことは、sample() 関数を呼び出すことです。これは (少なくとも小さなテーブルでは) パフォーマンスが少し向上しますが、十分ではありません。

thisまたはthis on mySqlのようなこの問題に関するいくつかのスレッドがあることは知っていますが、パフォーマンスに関して直接答えることはありません。

また、pl/sql の使用に制限はありません。私は pl/sql についてほとんど知りませんが、パフォーマンスに関してはどうですか? つまり、これは DB サーバー処理キューの別のプロセスです。おそらく、ネットワーク遅延などを考慮しても、Python などを使用してクライアント側で処理 (更新スクリプトの生成、ランダムの入力など) を実行すると、パフォーマンスが向上する可能性があります。誰もこれについて経験がありますか?

4

3 に答える 3

2

サンプル句を使用

select * from myTempTable SAMPLE(10);

これにより、行の 10% のみが返されます。

于 2013-11-13T09:23:47.080 に答える
0

私が知っている SQL を使用してランダムにサンプリングする良い方法はありません。一部の SQL バージョンで使用可能なサンプル関数は、十分なランダム サンプルではありません。最善の方法は、サンプル セット全体をエクスポートし、ランダム ソフトウェアを使用して、最終的なソリューションに含める行のインデックスを決定することです。または、単純な数値インデックス (1,2,3...n) があり、選択する必要がある行数がわかっている場合は、インデックスのリストをアップロードして、それに対してクエリを実行できます。乱数生成には random.org を試してください。API はhttp://www.random.org/clients/http/にあります。

于 2013-11-13T22:22:17.977 に答える
0

実際のデータを隠したいだけなら、クエリの選択部分でそれを処理してみませんか。クエリの代わりに:

select column_name from table;

選択できます

select scrambling_function(column_name) from table;

scrambling_function は好きなように指定できます。

于 2013-11-13T09:46:48.593 に答える