【问题标题】:Most efficent way to get one random row from oracle从 oracle 获取一个随机行的最有效方法
【发布时间】:2013-11-25 19:24:55
【问题描述】:

我有一个场景,我必须混淆数据库中的数据(= 加扰,出于测试目的,所以看不到真实数据,不需要解扰/解混淆它)。有几个表引用了 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() 函数,这(至少在小桌子上)执行得更好,但还不够好。

我知道有几个线程像thisthis on mySql这样的问题,但他们没有直接回答性能方面的问题。

另外,我不限于使用 pl/sql。我对pl/sql知之甚少,性能如何?我的意思是,这只是数据库服务器处理队列中的另一个进程,也许我可以在客户端使用 python 之类的东西来获得更好的处理性能(我的意思是生成更新脚本,填充随机数等),即使考虑到网络延迟等?有人有这方面的经验吗?

【问题讨论】:

标签: python sql oracle random obfuscation


【解决方案1】:

使用示例子句

select * from myTempTable SAMPLE(10);

这将只返回 10% 的行。

【讨论】:

    【解决方案2】:

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

    select column_name from table;
    

    你可以选择

    select scrambling_function(column_name) from table;
    

    scrambling_function 可以随心所欲。

    【讨论】:

    • 我不能。数据库将被提供,真实数据一定不存在。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2012-04-20
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多