将记录插入Oracle的成本较低的方法是什么?

Dav*_*wig 0 sql database oracle

我需要能够重复处理XML文件并将大量数据插入Oracle数据库.该过程需要能够创建新记录,或者如果数据已存在则更新现有记录.

我可以想到两种方法来处理将100,000条记录插入/更新到Oracle数据库中.但哪种方法更好?或者还有另一种方式吗?

  • 尝试INSERT.如果没有例外,插入工作正常,一切都很好.如果有异常,请抓住它并进行更新.
  • 首先查找记录(SELECT).如果没有找到,请执行INSERT.如果找到,请进行更新.显然,如果Oracle表为空,则第一种方法通过前面的查找节省时间.但是如果先前导入了文件,然后有人更改了几行并重新导入,那么生成的异常数量就会变得很大.由于查找,第二种方法在空数据库上花费的时间更长,但在后续导入期间不会生成昂贵的异常.

使用这样的数据是否有"正常"模式?

谢谢!

Gol*_*rol 6

我不知道''模式是什么,但如果你要生成一个语句,那么也许你可以生成一个select from dual包含XML文件中所有数据的查询联合.然后,您可以将此select包装在MERGE INTO语句中,因此您的SQL看起来像:

MERGE INTO YourTable t
USING (
  SELECT 'Val1FromXML' as SomeKey, 'Val2FromXML' as Extrafield, 'Val3FromXML' as OtherField FROM DUAL
  UNION ALL
  SELECT 'Val1FromRow2' as SomeKey, 'Val2FromXML' as Extrafield, 'Val3FromXML' as OtherField FROM DUAL
  ...) x ON x.SomeKey = t.SomeKey
WHEN MATCHED THEN
  UPDATE SET 
    t.ExtraField = x.ExtraField, 
    t.OtherField = x.OtherField
WHEN NOT MATCHED THEN
  INSERT (ExtraField, OtherField) VALUES (x.ExtraField, x.OtherField)
Run Code Online (Sandbox Code Playgroud)

这个语句的优点是它只有一个语句,因此它节省了为每一行初始化语句的开销.此外,作为单个语句,它将完全失败或完全成功,否则您将通过事务完成.

这也是一个陷阱.对于这样的导入,您可能希望一次只执行有限数量的行,然后提交.这样你就不会长时间锁定表的大部分内容,并且可以中断导入并稍后继续.但幸运的是MERGE INTO,通过简单地在联合的select-from-dual中放置不超过500行,应该很容易为有限数量的行生成语句.