Sql server 建立链接服务器链接Oracle插入数据时报:“内存不足“

H_Gragon 2013-11-25 02:09:38
Sql server 建立链接服务器链接Oracle插入数据时报:“内存不足“
一开始一万多条数据可以执行,连续执行几次后,就报开内存不足了,是不是进程还没完全结束呢?
下面是具体错误:

链接服务器"RMYY"的 OLE DB 访问接口 "MSDAORA" 返回了消息 "内存不足。"。
消息 7399,级别 16,状态 1,第 1 行
链接服务器 "RMYY" 的 OLE DB 访问接口 "MSDAORA" 报错。提供程序内存不足。
消息 7343,级别 16,状态 2,第 1 行
链接服务器 "RMYY" 的 OLE DB 访问接口 "MSDAORA" 无法 INSERT INTO 表 "[RMYY]..[GAINTERFACE].[T_FIXEDSPECIAL_BSC_FBJ]"。
...全文
533 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
高原gy 2015-06-30
  • 打赏
  • 举报
回复
昨天也遇到了这个问题,提示内存不足,用了各种方式无果 后来发现修改下插入的写法就可以了 以前是这样写的(SQL Server 连接 Oracle):
INSERT INTO orcl239..EAS.K3_ORIGINALITYCARD(FEMPID,EVERNAME)
VALUES('20150011','张三')
后来改为这种样式:
-- 由于插入操作并不需要结果集, 为提高性能, 在openquery的查询中加入1=2条件, 以控制查询结果集
INSERT INTO openquery(orcl239, 'select FEMPID, EVERNAME from K3_ORIGINALITYCARD where 1=2') 
VALUES('20150011','张三')
初步分析,可能是直接使用 INSERT 语句,使用的是 OLE DB的内存空间,且每次执行完成之后,内存都不会释放;导致数据量大了,或者执行的次数多了,就会报 OLE DB 提供程序内存不足; 改为 openquery 后,可能重新分配了一个内存空间,且在执行完成之后释放,因此不再出现 OLE DB 提供程序内存不足的报错了。
發糞塗牆 2013-11-26
  • 打赏
  • 举报
回复
sys.sysobjects可以查表、视图、存储过程,至于他们的定义,我目前也没有现成的脚本给你
H_Gragon 2013-11-26
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
会结束,但是不会腾内存,但是如果内存不够,sqlserver会自己调控内存,把一些数据移到磁盘,让新数据进去内存的buffer cache
版主,sql server如何查询某个数据库中包含的表、视图、存储过程呢?另外如何查询某表或视图包含那些字段呢?期盼您的回复!
cnhjm 2013-11-26
  • 打赏
  • 举报
回复
H_Gragon 2013-11-26
  • 打赏
  • 举报
回复
引用 10 楼 cnceohjm 的回复:
引用 8 楼 DBA_Huangzj 的回复:
会结束,但是不会腾内存,但是如果内存不够,sqlserver会自己调控内存,把一些数据移到磁盘,让新数据进去内存的buffer cache
谢谢,版主,我再看看啊!
查询数据库包含的表:select [id], [name] from [sysobjects] where [type] = 'u' order by [name]
H_Gragon 2013-11-26
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
会结束,但是不会腾内存,但是如果内存不够,sqlserver会自己调控内存,把一些数据移到磁盘,让新数据进去内存的buffer cache
版主,sql server某个数据库中包含的表、视图、存储过程呢?另外如何查询某表、视图包含那些字段呢?期盼您的回复!
H_Gragon 2013-11-25
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
会结束,但是不会腾内存,但是如果内存不够,sqlserver会自己调控内存,把一些数据移到磁盘,让新数据进去内存的buffer cache
谢谢,版主,我再看看啊!
  • 打赏
  • 举报
回复
引用 7 楼 cnceohjm 的回复:
引用 6 楼 DBA_Huangzj 的回复:
引用 4 楼 cnceohjm 的回复:
[quote=引用 3 楼 DBA_Huangzj 的回复:] 我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
可是我Oracle里面数据已经可以查到了,就不用提交什么了吧!
oracle的机制我不懂,不过也不排除你那个类似sqlserver的未提交读,你如果kill掉进程的话,万一未提交,就回滚,虽然内存可能请出来了,但是你的操作就等于没发生了
Sql是不是执行完插入以后,会自动结束某些进程,把内存腾出来啊![/quote] 最好是在执行完插入语句后,执行一个commit语句。 这方面,oracle的事务机制确实和sql server 不太一样。
發糞塗牆 2013-11-25
  • 打赏
  • 举报
回复
会结束,但是不会腾内存,但是如果内存不够,sqlserver会自己调控内存,把一些数据移到磁盘,让新数据进去内存的buffer cache
H_Gragon 2013-11-25
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
引用 4 楼 cnceohjm 的回复:
引用 3 楼 DBA_Huangzj 的回复:
我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
可是我Oracle里面数据已经可以查到了,就不用提交什么了吧!
oracle的机制我不懂,不过也不排除你那个类似sqlserver的未提交读,你如果kill掉进程的话,万一未提交,就回滚,虽然内存可能请出来了,但是你的操作就等于没发生了
Sql是不是执行完插入以后,会自动结束某些进程,把内存腾出来啊!
發糞塗牆 2013-11-25
  • 打赏
  • 举报
回复
引用 4 楼 cnceohjm 的回复:
引用 3 楼 DBA_Huangzj 的回复:
我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
可是我Oracle里面数据已经可以查到了,就不用提交什么了吧!
oracle的机制我不懂,不过也不排除你那个类似sqlserver的未提交读,你如果kill掉进程的话,万一未提交,就回滚,虽然内存可能请出来了,但是你的操作就等于没发生了
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
正解
H_Gragon 2013-11-25
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
可是我Oracle里面数据已经可以查到了,就不用提交什么了吧!
發糞塗牆 2013-11-25
  • 打赏
  • 举报
回复
我觉得应该是oracle那端没有提交事务,数据一直站在内存中,导致内存不足
H_Gragon 2013-11-25
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
听说oracle的事务机制和sqlserver的有点不同。可能要看看oracle那边的事务提交机制怎么实现
第一次执行时没有问题的,一万多条数据3,4分钟插进去,再执行就报内存不足了!是不是kill掉什么进程啊!
發糞塗牆 2013-11-25
  • 打赏
  • 举报
回复
听说oracle的事务机制和sqlserver的有点不同。可能要看看oracle那边的事务提交机制怎么实现

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧