问题描述
嗨,汤姆,
我们遇到ORA-01044错误- ORA-01044 :绑定到变量的缓冲区大小300000000超出最大值268431360
基本上,我们正在Python中构建50K记录的列表,并将该列表传递给存储过程。存储过程将接受列表并将值插入表中。
下面是存储过程的详细信息。
类型data_ Array 是表VARCHAR2(32767) PLS_INTEGER索引;
程序pkg_bulk ( p_val_list输入输出NOCOPY数据数组)
是
开始
IF p_val_list 是 NOT NULl
那么
1..p_val_list.Call中的FORALL
插入XYZ值p_val_list(I) ;
结束;
异常:
...
结束;
Python代码
---------
步骤1 :执行sql查询
Step2: For Each result item in the Cursor, Put the result in the L是T (ie L是T.APPEND(cursor_result) . Once the result count reaches 50K call the Stored Procedure pkg_bulk.
第三步:继续执行步骤2 ,直到数据可用。
我们在步骤2中看到错误。当我们将记录限制从50K减少到25K时,它运行正常。
我们想知道问题的根本原因- ORA-01044 :绑定到变量的缓冲区大小300000000超出了最大值268431360。
数据库有足够的PGA内存- 3GB
oracle抱怨哪个数据库参数268431360 ?
请指点一下。
谢谢,
巴拉
我们遇到ORA-01044错误- ORA-01044 :绑定到变量的缓冲区大小300000000超出最大值268431360
基本上,我们正在Python中构建50K记录的列表,并将该列表传递给存储过程。存储过程将接受列表并将值插入表中。
下面是存储过程的详细信息。
类型data_ Array 是表VARCHAR2(32767) PLS_INTEGER索引;
程序pkg_bulk ( p_val_list输入输出NOCOPY数据数组)
是
开始
IF p_val_list 是 NOT NULl
那么
1..p_val_list.Call中的FORALL
插入XYZ值p_val_list(I) ;
结束;
异常:
...
结束;
Python代码
---------
步骤1 :执行sql查询
Step2: For Each result item in the Cursor, Put the result in the L是T (ie L是T.APPEND(cursor_result) . Once the result count reaches 50K call the Stored Procedure pkg_bulk.
第三步:继续执行步骤2 ,直到数据可用。
我们在步骤2中看到错误。当我们将记录限制从50K减少到25K时,它运行正常。
我们想知道问题的根本原因- ORA-01044 :绑定到变量的缓冲区大小300000000超出了最大值268431360。
数据库有足够的PGA内存- 3GB
oracle抱怨哪个数据库参数268431360 ?
请指点一下。
谢谢,
巴拉
专家解答
将主机阵列来回传递到数据库的限制是256MB。
实际上,一旦批量绑定的大小开始一次超过(比如说) 1000行,如果您看到任何性能优势,我会非常惊讶。
尝试使用25k行、10k行、1k行进行计时测试,其中插入的总行数相同,只是增加了循环次数。
在这个网站上搜索“批量绑定”,你会发现很多例子,绑定大小甚至低至50都非常接近最佳。
希望这个能帮上忙。
SQL> select 256 * 1024 * 1024 from dual;
256*1024*1024
-------------
268435456
实际上,一旦批量绑定的大小开始一次超过(比如说) 1000行,如果您看到任何性能优势,我会非常惊讶。
尝试使用25k行、10k行、1k行进行计时测试,其中插入的总行数相同,只是增加了循环次数。
在这个网站上搜索“批量绑定”,你会发现很多例子,绑定大小甚至低至50都非常接近最佳。
希望这个能帮上忙。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




