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() 函数,这(至少在小桌子上)执行得更好,但还不够好。

我知道在 mySql上有几个类似this或this 的线程,但他们并没有直接回答性能方面的问题。

另外,我不限于使用 pl/sql。我对pl/sql知之甚少,性能如何?我的意思是,这只是数据库服务器处理队列中的另一个进程,也许我可以在客户端使用 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 回答