对于准备好的语句,超出了每个会话20 MB的内存限制。减少准备好的语句的数量或大小

时间:2019-06-26 07:02:39

标签: azure-sql-database azure-sqldw oracle-data-integrator azure-sql-data-warehouse

我正在尝试使用Oracle ODI将记录插入到Azure sql数据仓库中,但是在插入某些记录后出现错误。

注意:我正在尝试插入1000条记录,但在800条之后出现错误。

错误消息:原因:java.sql.BatchUpdateException:112007;对于准备好的语句,每个会话超出了20 MB的内存限制。减少准备好的语句的数量或大小。

我正在尝试插入1000条记录,但在800条之后出现错误。

错误消息:原因:java.sql.BatchUpdateException:112007;对于准备好的语句,每个会话超出了20 MB的内存限制。减少准备好的语句的数量或大小。

2 个答案:

答案 0 :(得分:0)

20MB是定义的限制,目前这是硬限制。减少批次大小当然可以帮助您解决此限制。

链接到容量限制。

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-service-capacity-limits

答案 1 :(得分:0)

虽然Abhijith的回答在技术上是正确的,但我想提出一个替代方案,它可以为您提供更好的性能。

问题的根源在于,您选择了最糟糕的方法来将大量数据加载到Azure SQL数据仓库中。不管您要扔多少DWU,一长串INSERT语句的执行都会非常糟糕,因为它始终是单节点操作。

我的建议是,假设您的Oracle是本地部署,请按照以下方式调整ODI流程。

  • 将提取的内容写入文件
  • 调用AZCOPY将文件移至Azure blob存储
  • 创建外部表以在存储中的文件上映射视图
  • 创建表AS或INSERT INTO以从该视图读取到目标表

这将比您当前的方法快几个数量级。