如何跳过重复的记录?
How to skip repeated records?
我正在开发一个 SQL*Loader 脚本来将大量数据上传到 table。
脚本的工作方式如下:
它连接到一个 FTP 服务器并镜像一个目录以获取所有已生成的新文件,然后它获取所有 CSV 文件并将它们保存到一个文件中,然后从这个更大的 CSV 文件中上传数据。
基本上,我正在寻找一种方法,如果第一个记录已经存在于 table 中,SQL*Loader 甚至不会尝试插入记录。
问题是,table 将保存多达 1000 万条记录,有时这些文件会在不应下载时错误地下载,这意味着某些记录会重复。
我已经在需要它的两个字段上放置了唯一键。
我尝试将最大错误更改为脚本将尝试插入的行数,但我注意到这样做并让它们 return 约束违反错误的工作速度比没有重复记录时慢得多,它会创建一个非常大的日志文件。
有没有办法在 SQL*Loader 控制文件中放置一个条件(在两个字段上,因为其中一个可以重复但不能同时重复)?
或者你认为什么可以帮助我加快这个过程?
奖金问题:如果我有 10 个 CSV 文件,将每个文件发送到 SQL*Loader 还是制作一个包含这 10 个数据的文件更好?
要防止 SQL Loader 在 table 中已经存在记录时插入记录,您可以使用条件语句使 SQL Loader 跳过该记录,除非它满足你的必要条件。例如:
LOAD DATA
INFILE 'YourData.dat'
BADFILE 'YourBadData.bad'
APPEND INTO TABLE YourTable
WHEN (Condition 1 = TRUE) AND (Condition 2 = FALSE)
{
...
要加快初始加载过程,您可以将所有记录插入临时 table,然后使用 select 语句将所有不同的行插入永久 table。
INSERT INTO YourTable
SELECT DISTINCT [fields]
FROM tempYourTable
根据 solllodolllo 的回答,将记录导入临时 table,然后
DELETE FROM temptable WHERE id IN (SELECT id FROM yourtable)?
之后您可以将温度table插入您的table。
这当然取决于您的行之间的不同方式。在问题中指出这一点可能会很好。
我正在开发一个 SQL*Loader 脚本来将大量数据上传到 table。
脚本的工作方式如下: 它连接到一个 FTP 服务器并镜像一个目录以获取所有已生成的新文件,然后它获取所有 CSV 文件并将它们保存到一个文件中,然后从这个更大的 CSV 文件中上传数据。
基本上,我正在寻找一种方法,如果第一个记录已经存在于 table 中,SQL*Loader 甚至不会尝试插入记录。
问题是,table 将保存多达 1000 万条记录,有时这些文件会在不应下载时错误地下载,这意味着某些记录会重复。
我已经在需要它的两个字段上放置了唯一键。
我尝试将最大错误更改为脚本将尝试插入的行数,但我注意到这样做并让它们 return 约束违反错误的工作速度比没有重复记录时慢得多,它会创建一个非常大的日志文件。
有没有办法在 SQL*Loader 控制文件中放置一个条件(在两个字段上,因为其中一个可以重复但不能同时重复)?
或者你认为什么可以帮助我加快这个过程?
奖金问题:如果我有 10 个 CSV 文件,将每个文件发送到 SQL*Loader 还是制作一个包含这 10 个数据的文件更好?
要防止 SQL Loader 在 table 中已经存在记录时插入记录,您可以使用条件语句使 SQL Loader 跳过该记录,除非它满足你的必要条件。例如:
LOAD DATA
INFILE 'YourData.dat'
BADFILE 'YourBadData.bad'
APPEND INTO TABLE YourTable
WHEN (Condition 1 = TRUE) AND (Condition 2 = FALSE)
{
...
要加快初始加载过程,您可以将所有记录插入临时 table,然后使用 select 语句将所有不同的行插入永久 table。
INSERT INTO YourTable
SELECT DISTINCT [fields]
FROM tempYourTable
根据 solllodolllo 的回答,将记录导入临时 table,然后
DELETE FROM temptable WHERE id IN (SELECT id FROM yourtable)?
之后您可以将温度table插入您的table。
这当然取决于您的行之间的不同方式。在问题中指出这一点可能会很好。