我正在考虑将大量数据加载到我的oracle数据库中。
传入的数据类似于CSV,只需稍加解析即可转换为CSV格式。
可能是某些行在加载过程中被拒绝,但我不希望其他插入回滚。
我正在考虑以下方法之一:
任何人都可以为我指出每种方法的优点/缺点,并建议我应该考虑其他任何替代方案吗?
感谢。
编辑:
抱歉,应该澄清2.我打算创建一个外部表,然后选择进入数据库。我的理解是,对于大量类似CSV的数据,这是一种很好的方法吗?
答案 0 :(得分:2)
我使用SQL * Loader而不是外部表的唯一原因是:
外部表更容易使用,更灵活(加载期间的多表插入,连接和/或聚合,合并,预处理脚本等),以及全面的更好的体验。并行DML也比SQL * Loader更容易 。
答案 1 :(得分:1)
我编写了Perl脚本来执行此操作并使用SQLldr。
我想说如果您可以访问本机并且您的CSV中没有并发症(CSV可能会很麻烦),那么请使用sqlldr。值得花时间计算控制文件,因为它很快就会出现在你遇到的每个Oracle盒子上。
答案 2 :(得分:1)
这实际上取决于您在Oracle中拥有数据后对数据执行的操作。如果您要经常查询它,使用sqlloader会更有效。通过将数据放入常规Oracle表,您可以添加索引,主键等。此外,由于数据由Oracle管理,性能可能更好,因为数据被组织成更严格定义的结构。
当您要在一组外部数据上不经常查询数据时,外部表非常方便。它省去了复制存储(文件和oracle表空间)和/或等待sqlloader完成批处理作业的麻烦。但是,我通常会将它们用于完整的表读取,因为Oracle无法找到特定的行。
简短回答:如果使用“where”子句查询此表,请使用sqlloader创建表。如果没有,请尝试两者并评估效果。
答案 3 :(得分:0)
我会使用外部表方法。
请参阅asktom
答案 4 :(得分:0)
SQL Loader和外部表方法非常相似,它们都满足您的要求,因为如果某些行被拒绝,它们不会丢弃整个数据集。
如果选择SQL Loader方法,则可以使用oracle-csv-loader自动执行任务,而不是手动创建表和控制文件。