gpt4 book ai didi

java - Oracle/Mysql编辑记录量大,有推荐吗?

转载 作者:可可西里 更新时间:2023-11-01 08:35:16 30 4
gpt4 key购买 nike

首先,我要感谢您在页面上提供的所有帮助,这真的很有帮助。现在我遇到了一个我无法弄清楚的情况,我希望你能帮助我,就是这样:

在我的工作场所,我可以访问一个 Oracle 数据库,其中有一个表,上面填满了用户(姓名、姓氏、生日和其他内容)。它有 1700 万条记录,对于每条记录,我需要生成一个唯一的 key (可以说它是名字的前 2 个字母加上连接的出生日期,实际上更复杂,但它只是一个例子),所以对于这个 key ,我需要检索记录,计算键,然后用键更新记录。现在超过 1700 万条记录正在杀死服务器!!

所以工作中的DB是Oracle,我把我机器上的数据复制到MYSQL数据库中进行测试。我计划在本地测试用 php 进行计算,然后创建一个 java 应用程序来在服务器上创建 key ,但这是一个巨大的工作量!!我不知道该走哪条路。简单的选择在 php 上需要 10 分钟(在 mysql 上通过命令行需要 1.49 分钟来 COUNT() 记录)

我知道最好在收到记录时计算 key 。它们以 500k 的包送达,但由于我刚到这里,数据已经合并,我必须处理这些记录。

那么对于这样的任务,你会推荐这个可怜的灵魂做什么。我当时在考虑触发器或 pl/sql,但我真的不知道什么在性能方面会更好。

非常感谢!!!

------------作为 ogres 的请求,希望你能帮助我,这是我需要为每一行做的计算的 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;

//最后,我将名称中的前两个字符与计算出的代码和生日 EX 连接起来:JH235408071984 将来自 JHON,出生于 1984 年 8 月 7 日,计算出的名称代码 = 2354

$CODE=trim(substr($nombre,0,2)).trim($vn).formatFecha($fnac);

希望对您有所帮助,您可以给我一些建议!!

最佳答案

当面对像这样的庞大数据集时,我通常会做的是首先在某个地方留出以跟踪我的位置(只需一个表就可以完成这项工作),然后一次运行 1000 个左右的结果.假设您不需要最大程度的准确性来确定将有多少条记录(假设没有巨大的漏洞),并且为了将数据用于我们的循环,我们可以获取近似的结果数像这样的查询:

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

假设您有一个名为 ID 的 PK 标识。与完整的 COUNT(*) 或 COUNT(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(以便您可以跟踪您离开的位置...允许一个单独的脚本来检查值以及查看进度条或跟踪的位置)和 HandleResults(加载特定范围内的 ID 并为它们创建唯一值)。

无论如何,希望能帮助您入门!

关于java - Oracle/Mysql编辑记录量大,有推荐吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14972172/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com