java Oracle/Mysql编辑大量记录,推荐?
首先我要感谢你在页面上的帮助,这真的很有帮助。现在我遇到了一个我无法理解的情况,我希望你能帮助我,就是这样:
在我的工作场所,我可以访问一个Oracle数据库,其中有一个充满用户的表(姓名、姓氏、生日和其他信息)。它有1700万条记录,对于每一条记录,我需要生成一个唯一的密钥(假设它是姓名的两个首字母加上连接的出生日期,实际上更复杂,但这是一个示例),因此对于这个密钥,我需要检索记录,计算密钥,然后用密钥更新记录。现在超过1700万条记录,它正在杀死服务器
所以工作的数据库是Oracle,我将数据复制到我的机器上的MYSQL数据库中进行测试。我计划在本地测试,使用php进行计算,然后创建一个java应用程序在服务器上创建密钥,但这是一个巨大的工作量!!我不知道该走哪条路。在php上,简单的select需要10分钟(在mysql上,通过命令行计算()记录需要1.49分钟)
我知道最好在收到记录时计算密钥。它们以500k的数据包到达,但由于我刚到这里,数据已经被合并,我必须处理这些记录
那么你会建议这个可怜的灵魂做什么来完成这样的任务呢。我在考虑触发器或pl/sql,但我真的不知道什么性能更好
非常感谢
------------作为食人魔的请求,希望你能帮助我,以下是php中的代码,我需要对每一行进行计算
$vn=0;//holds the value calculated for name
$sql="select * from roots";//table holding triplets for character|number (ex: 1|A|13), field names (consecutive|character|code)
$resultados=mysql_query($sql,$idcon);
while($dato=mysql_fetch_array($resultados))//i put all of the pairs in an associative array for quicker acces
{
$consulta[$dato['v_propio']]=array($dato['caracter'],$dato['v_primo']);
}
//coding the name, for every char in the name i add to $vn, the consecutive times the position of the character in the string, plus the code for the character, if null, i add some values
$pos=1;
for ($i=0;$i<strlen($nombre);$i++)
{
$char=substr($nombre,$i,1);
$char=charnum($char);
if($char!=NULL)
{
$vn=$vn+($char*$pos)+$consulta[$char][1];
}
else
$vn=$vn + 28 + 107;
$pos++;
}
//end of name coding
// i format the code for the name to 4 digits
if ( $vn < 1000 and $vn > 99 )
$vn = '0'.$vn ;
else if ( $vn < 100 and $vn > 9 )
$vn = '00'.$vn;
else if ( $vn < 10 )
$vn = '000'.$vn;
else
$vn=$vn;
//最后,我将NAME中的前两个字符与计算的代码连接起来,生日EX:JH235408071984将来自于1984/08/07出生的JHON,NAME CODE computed=2354
$CODE=trim(substr($nombre,0,2)).trim($vn).formatFecha($fnac);
希望它能帮助我,你能给我一些建议
# 1 楼答案
当面对如此庞大的数据集时,我通常会做的是,首先留出一个地方来跟踪我的位置(只有一个表可以完成这项工作),然后一次运行1000个左右的结果。假设您不需要最大程度的准确度来计算出将有多少条记录(假设没有巨大的缺口),并且使用数据进行循环,我们可以通过以下查询获取大致的结果:
假设您有一个名为ID的PK标识。与完整计数(*)或计数(1)相比,此查询应该非常快。然后,您可以测试我上面提到的表,以查看数据是否存在,如果不存在,则从头开始,如果存在,则从您离开的地方开始处理这些ID。这可能需要在有这么多记录的情况下运行很长一段时间,但可以这样做,使其能够在必要时重新运行,或者永远运行,直到完成为止
它最终会看起来像(很多伪函数,因为我不知道您将使用什么平台):
您必须设计LoadLastWorkPosition(它尝试加载最后一个位置并返回0或false,如果没有,则返回任何值),SaveLastWorkPosition(这样您就可以跟踪您离开的位置…允许一个单独的脚本检查该值,并查看它在进度条或跟踪中的位置)和HandlerResults(加载特定范围内的ID并为其创建唯一值)
不管怎样,希望这能帮助你起步,如果没有别的
# 2 楼答案
您不必使用php进行计算,首先,在表中添加一列作为unique_键,然后在此列上创建索引/unique约束,然后可以使用sql更新整个表一次,生成的_值是行的unique_键,在sql中计算,而不是由php计算
,之后,如果您想查找person,您将计算其唯一的_键,然后使用查询