我有一个要求,我必须将文件上传到db。 文件每天将有大约100K的记录,每月有一个800到1000万条记录。
还有一些字段级别的验证要执行。
验证如下:所有字段都存在,数字字段包含有效数字,日期包含有效日期,指定范围内的数字,字符串格式匹配等。
有三种方式。
1: Upload to temp and then validate
- Create a temp table (all string columns), have extra error column
- upload all entries to temp table
- run validation, populate error column if needed
- move valid entries to correct table
缺点:条目必须在db中写入两次,甚至是正确的。
2: Upload to db directly
- upload all entries directly to table
- check which entries are not uploaded
缺点:即使在上传后也需要读取每一行,以及双读
3: Validate and then Upload
- read each line, run all validations on all columns
- if valid then write to db
缺点:文件读取速度必须慢于批量上传到db。
我正在编写应用程序:C#& ASP.NET,DB就是Oracle。
3种方式中哪一种最好?
答案 0 :(得分:2)
我会选择2。
100k行 peanuts 进行批量和查询验证。
答案 1 :(得分:1)
正如@aF所说,选项2,增加了以下内容:
添加一个表,您可以将“无效”行转储到其中。然后,运行如下语句:
INSERT INTO InvalidData
SELECT *
FROM InputData
WHERE restrictedColumn NOT IN ('A', 'B')
OR NOT IS_NUMERIC(numberColumn) -- I'm assuming some version of SQL Server...
然后将“已验证”的行转储到您的实际表中,不包括“无效”行:
INSERT INTO Destination
SELECT a.*
FROM InputData as a
EXCEPTION JOIN InvalidData as b
ON b.id = a.id
如果遇到任何(其他)“无效”数据,INSERT
将失败,但应该是可发现的。然后可以对“无效”表进行清理和重新插入。