从oracle获取一个随机行的最有效方法

时间:2013-11-13 09:09:41

标签: python sql oracle random obfuscation

我有一个场景,我必须在数据库中混淆数据(= scramble,用于测试目的,因此无法查看真实数据,不需要对其进行解扰/取消混淆)。有几个表引用了address_table。我不能混淆address_table,所以我想我只是用随机的其他address_table ID-s更改那些表中的引用。 address_table包含6M +记录。所以我会创建一个包含所有地址ID-s的临时表,然后在需要时调用一些函数从那里获取一个随机的。所以我可能会生成一个随机值并将该行取为:

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

其中x是dbms_random生成的一些随机值。现在,虽然这正是我所需要的,但它并没有达到我所期望的任何目标。 我尝试过的另一件事是调用sample()函数,这个(至少在小表上)执行得更好,但是还不够好。

我知道在thisthis on mySql这个问题上有几个主题,但他们并没有直接回答它的表现。

另外,我不限于使用pl / sql。我知道很少的pl / sql,它在性能方面如何?我的意思是,它只是数据库服务器处理队列中的另一个过程,也许我可以使用像python这样的东西在客户端进行处理(我的意思是生成更新脚本,填充randoms etcetc),甚至考虑网络延迟等等?有没有人有这方面的经验?

3 个答案:

答案 0 :(得分:2)

使用样本条款

select * from myTempTable SAMPLE(10);

这将只返回10%的行。

答案 1 :(得分:0)

如果您只想隐藏真实数据,为什么不在查询的选择部分中处理它。而不是查询:

select column_name from table;

你可以选择

select scrambling_function(column_name) from table;

scrambling_function可以是你喜欢的任何东西。

答案 2 :(得分:0)

没有一种很好的方法可以随机使用我所知道的SQL。某些SQL版本中提供的示例函数不是一个足够的随机样本。最好的方法是导出完整的样本集并使用随机软件来确定要包含在最终解决方案中的行索引。或者,如果您有一个简单的数字索引(1,2,3 ... n)并且知道需要从中选择多少行,您可以上传索引列表以包含和查询。尝试使用random.org进行随机数生成,其API位于http://www.random.org/clients/http/