【发布时间】:2018-10-21 10:03:50
【问题描述】:
我正在从事一项日常自动化工作,该工作会根据 oracle 数据库检查文本文件中的记录。 我们每天都会收到来自外部团队的文本文件,其中包含大约 100,000 条记录。文本文件将采用 unix 格式,其中有 6 列,由 | 分隔。符号。
例如, HDR 1
home/sample/file|testvalue1|testvalue2|testval3|testval4|testval5
TRL
我需要检查 testval3 和 testval5 中的值是否存在于我的 oracle 数据库中的表中。该表有大约 1000 万条记录。 我目前正在通过 shellscript 处理它。在 shellscript 中,我正在读取文本文件并循环遍历每一行。在循环内部,我从每一行传递值并对 DB 运行查询。如果数据库中不存在记录,我必须将它们输出到 csv 文件。使用以下查询:
select ‘testval3’,’testval5’ from dual
where not exists (select primarykeycolumn
from mytable where mycolumn=testval3 and mycolumn2=testval5)
由于输入文件有 100000 个条目,我的循环将运行查询 100000 次,每次它都会检查包含 1000 万条记录的表。这使我的批处理作业运行了好几个小时,我必须终止它。有没有更好的方法来处理这种情况?如果没有更好的方法通过 shellscript 执行此操作,我也可以使用 java。
【问题讨论】:
-
您使用的是 UTL_FILE?,您使用的是哪个版本的 Oracle?
-
您似乎选择了效率最低的方法。你没听说过 SQL * Loader、外部表等吗?我的建议是首先在数据库中创建一个包含 2 列的表,然后使用 SQL* Loader 将文件加载到其中。然后使用单个查询,您可以提取您需要的所有内容。与加载程序不同,外部表和 UTL_FILE 需要目录权限。如果你能轻松获得它,那就去吧。
-
@KaushikNayak 他非常清楚自己的方式效率低下,这就是他首先在这里提出问题的原因。你可以给出相同的值,只是省略前两个短语。
-
@Busybee:我已经发布了一个答案,可能是您正在寻找的东西。
-
@VinkoVrsalovic:你怎么知道是“他”? .此外,我不知道这样的问题在 java 标记下是否很少见,但是在 Oracle 下,像 SQL* Loader 这样的东西是人们期望 OP 知道的基本内容。我们需要连接数据库一百万次的逻辑并没有给我留下深刻的印象。那么问题来了,为什么要使用它。
标签: java database oracle shell