暂无图片
分享
d7z
2019-07-20
关于12c中DRIVING_SITE hint在有dml操作的语句中失效的问题。

目前有一个需求是,本地的一张小表a与通过dblink关联远程读库的一张大表b(100G左右),然后返回查询结果插入到本地另一张表c内。

我做的测试如下:

1、使用select /*+DRIVING_SITE(b)*/ * from a,b@dbl...... 将a传到远程关联完了再返回来,这样看执行计划是可以的,而且执行速度也能接受,环境很麻烦,执行计划不好拿,我确定肯定是生效了,但是insert into select /*+DRIVING_SITE(b)*/ * from a,b@dbl...... 的时候看执行计划hint就不生效了还是把大表拿到本地了,执行时间也很长,大约要1个小时了,我想问下dring_site是不支持dml操作吗,因为我在官方文档上也没有明确看见有说明这问题的。

2、因为上面不好使,我想给select 放试图里面然后insert从这试图查询,同样看执行计划也是该hint失效。

3、请问就在此需求基础上,两表跨库关联还有是什么解决思路没有,dblink这是肯定给用了,不好使也没辙,同步数据软件工具不考虑,而且必须考虑的是在ADG读库上关联,尝试过在读库上建全局临时表可以写入,但是又不好控制事务,还有dblink还给手动关的问题。求助。。奇葩需求我也很头疼,欢迎吐糟。。。

收藏
分享
4条回答
默认
最新
文成

实验了几个方案,似乎没啥效果

  1. 通过视图

  2. 使用merge

你也可以试试建立物化视图,看看是否可行


暂无图片 评论
暂无图片 有用 0
d7z

首先感谢文成的回答,这两天我又测试了一下,可以通过视图的方法解决dml导致driving_site这hint失效的问题,也就是说在远程反向建一个dblink连本地的小表,把视图建在远程,insert into c select *from mv@dbl就可以解决该问题,我之前测试建的视图的是在本地的,这种建本地视图是不好使的。

1、当然我这只是举个例子,在我项目中建视图这种方案是不可行的,因为我这程序是用于抽取数据的,我说的大表都是分库分表的,小表存了一些资源号,批次号啊,还有一些路由的标志等等等,所以要建视图的话可能要上万张了,本来存储过程就不好维护,如果使用视图这程序以后很难维护和迭代了,所以很难采取视图的方案。

2、这两天又想到另一种方案,其实遇到这个困难就是为了避免我程序开并发后,小表和大表关联取结果的时候占用我大系统写库的物理资源,影响大系统的性能(领导要求的),所以要把表关联在读库进行操作,小表是根据前台还有java分配取得的一些路由信息等,所以要写入到写库中,利用adg的同步到读库,我本地创建dblink连接连读库在读库做关联,请问这种方案有什么问题吗。

暂无图片 评论
暂无图片 有用 0
文成

感觉挺绕的方案,会不会因为关联太多,耦合太强,导致系统比较难维护?

如果小表是不太频繁dml的,其实可以在分库通过存储过程或者其他程序做一些关联,再把结果从分库把数据直接写回主库。

最终,我感觉还是需要根据实际业务来去实现,如果实际性能影响问题不大,是不是可以跟领导解释一下,把架构做简单一些,省的后期不停维护

暂无图片 评论
暂无图片 有用 0
d7z
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏