有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);

希望它能帮助我,你能给我一些建议


共 (2) 个答案

  1. # 1 楼答案

    当面对如此庞大的数据集时,我通常会做的是,首先留出一个地方来跟踪我的位置(只有一个表可以完成这项工作),然后一次运行1000个左右的结果。假设您不需要最大程度的准确度来计算出将有多少条记录(假设没有巨大的缺口),并且使用数据进行循环,我们可以通过以下查询获取大致的结果:

    SELECT MIN(ID) AS MinID, MAX(ID) AS MaxID FROM Users
    

    假设您有一个名为ID的PK标识。与完整计数(*)或计数(1)相比,此查询应该非常快。然后,您可以测试我上面提到的表,以查看数据是否存在,如果不存在,则从头开始,如果存在,则从您离开的地方开始处理这些ID。这可能需要在有这么多记录的情况下运行很长一段时间,但可以这样做,使其能够在必要时重新运行,或者永远运行,直到完成为止

    它最终会看起来像(很多伪函数,因为我不知道您将使用什么平台):

    define("NUM_PER_ITERATION", 1000);
    
    // Get our ID range
    $query = "SELECT MIN(ID) AS MinID, MAX(ID) AS MaxID FROM Users";
    $array = $MyDB->GetSingleRow($query);
    $minid = (int) $array["MinID"];
    $maxid = (int) $array["MaxID"];
    
    // Get our last starting point
    $startingpoint = LoadLastWorkPosition();
    if (!$startingpoint || $startingpoint < $minid) {
      $startingpoint = $minid;
    } else if ($startingpoint > $maxid) {
      echo("Already done!");
      exit;
    }
    
    // Run through the values
    $curstart = $startingpoint;
    while ($curstart <= $maxid) {
      $curend = $curstart + NUM_PER_ITERATION - 1;
    
      // Set a time out so it will keep running, you'll know way better
      // than I how long this should be for each loop
      set_time_limit(300);
    
      // Handle a number of results
      HandleResults($curstart, $curend);
    
      // Set the start of the next entry
      $curstart = $curend + 1;
    
      // Save our current progress
      SaveLastWorkPosition($curstart);
    }
    
    echo("All done!");
    

    您必须设计LoadLastWorkPosition(它尝试加载最后一个位置并返回0或false,如果没有,则返回任何值),SaveLastWorkPosition(这样您就可以跟踪您离开的位置…允许一个单独的脚本检查该值,并查看它在进度条或跟踪中的位置)和HandlerResults(加载特定范围内的ID并为其创建唯一值)

    不管怎样,希望这能帮助你起步,如果没有别的

  2. # 2 楼答案

    您不必使用php进行计算,首先,在表中添加一列作为unique_键,然后在此列上创建索引/unique约束,然后可以使用sql更新整个表一次,生成的_值是行的unique_键,在sql中计算,而不是由php计算

    update table set unique_key = generated_value
    

    ,之后,如果您想查找person,您将计算其唯一的_键,然后使用查询

    select * from table where unique_key = generated_value