oracle中merge into查询越来越慢,大家知道什么原因吗,

qq_29851443 2019-05-14 09:19:01

MERGE INTO ADMIN.JHJ_SBJLXX t1
USING (select count(*) c from JHJ_SBJLXX t2 where t2.pjh='9B35882F2F' ) x ON (x.c > 0)
when matched then
update set t1.ckh='4013501' , t1.jhsj=to_date('2019-05-14 16:41:37', 'yyyy-mm-dd hh24:mi:ss') , t1.YWBJSJ='' , t1.SFJH='1' where t1.pjh='9B35882F2F'
when not matched then
insert (t1.sbmc, t1.sbbh, t1.xzqh, t1.xzqhmc, t1.sxbm, t1.sxmc, t1.pjh, t1.jhrxm, t1.jhrzjhm, t1.jhrlxdh, t1.qhsj, t1.sfjh, t1.jhsj, t1.ckh, t1.bmmc, t1.ywlx, t1.ywbjsj) VALUES ('2楼排号机', '2L01', '420105007000', '湖北省武汉市汉阳区五里墩街办事处', '99', '不动产解押', '9B35882F2F', '李航', '412823199212103659', '',to_date( '2019-05-14 16:41:00', 'yyyy-mm-dd hh24:mi:ss') , '1', to_date('2019-05-14 16:41:37', 'yyyy-mm-dd hh24:mi:ss'), '4013501', '公安局', '0','')

下面是我的代码,用excutemany进行批量插入,总共1000条数据,有时候用了10分钟,有时30分钟都完成不了,这个是为什么啊。

jh_insert_sql="""MERGE INTO ADMIN.JHJ_SBJLXX t1
USING (select count(*) c from ADMIN.JHJ_SBJLXX t2 where t2.pjh=:pjh1 and t2.xzqh=:xzqh1) x ON (x.c > 0)
when matched then
update set t1.ckh=:ckh1 , t1.jhsj=to_date(:jhsj1, 'yyyy-mm-dd hh24:mi:ss') , t1.YWBJSJ=:ywbjsj1 , t1.SFJH=:sfjh1 where t1.pjh=:pjh
when not matched then
insert (t1.sbmc, t1.sbbh, t1.xzqh, t1.xzqhmc, t1.sxbm, t1.sxmc, t1.pjh, t1.jhrxm, t1.jhrzjhm, t1.jhrlxdh, t1.qhsj, t1.sfjh, t1.jhsj, t1.ckh, t1.bmmc, t1.ywlx, t1.ywbjsj) VALUES (:sbmc, :sbbh, :xzqh, :xzqhmc, :sxbm, :sxmc, :pjh, :jhrxm, :jhrzjhm, :jhrlxdh,to_date(:qhsj, 'yyyy-mm-dd hh24:mi:ss') , :sfjh, to_date(:jhsj, 'yyyy-mm-dd hh24:mi:ss'), :ckh, :bmmc, :ywlx,:ywbjsj)"""
count += 1
# 每次插入300条数据
if count >= 30:
try:
hyzw_mysql_cursor.executemany(jh_insert_sql, insert_jh_list)
hyzw_mysql_conn.commit()
print('执行'+str(3*num)+'条')
except Exception as e:
print(e)
print(insert_jh_list)
insert_jh_list = []
count = 0
num+=1
if count > 0:
hyzw_mysql_cursor.executemany(jh_insert_sql, insert_jh_list)
hyzw_mysql_conn.commit()
...全文
1699 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2019-05-18
  • 打赏
  • 举报
回复
随着目标表越来越大,merge的速度也会随之变慢,表上的索引越多,越会影响数据的插入速度。如果希望merge的速度保持一定,分区插入是一个可以考虑的方案,当然每个分区的数据量要稳定。
miqi_oracle 2019-05-17
  • 打赏
  • 举报
回复
库配置不同,运行速度可以差很远很远很远远远远
qq_29851443 2019-05-16
  • 打赏
  • 举报
回复
引用 2 楼 whhhhh1991 的回复:
之前我也遇到相似的问题,我在测试环境中跑了一个多小时,还是没有结果;但是在生产环境中十分钟就结束了。 我分析的原因就是,这个与服务器的配置有关。缓存资源不足,会导致IO次数增多,也就会影响执行效率了,你按照这个思路考虑下,看看你的问题是怎么样的?
主要是我的测试的数据库表之前存储是空的,生产环境的表之前有80w条数据,
qq_29851443 2019-05-16
  • 打赏
  • 举报
回复
引用 1 楼 nayi_224 的回复:
你这是批量执行merge而不是插入。 先试着每300条执行executemany将数据插入到临时表里,然后用一个merge处理300条数据。
merge into这条语句就是pjh存在就更新,不存在就插入,和insert into和update的语法是一样的就。
whhhhh1991 2019-05-16
  • 打赏
  • 举报
回复
之前我也遇到相似的问题,我在测试环境中跑了一个多小时,还是没有结果;但是在生产环境中十分钟就结束了。
我分析的原因就是,这个与服务器的配置有关。缓存资源不足,会导致IO次数增多,也就会影响执行效率了,你按照这个思路考虑下,看看你的问题是怎么样的?
nayi_224 2019-05-15
  • 打赏
  • 举报
回复
你这是批量执行merge而不是插入。 先试着每300条执行executemany将数据插入到临时表里,然后用一个merge处理300条数据。
课程简介:Oracle 11G 完整的课程体系,从安装到入门到项目实战开发,整个学习过程,都以实践操作为主,大量的案例,实例,作业,来保证学习,练习,直到具备数据分析师,掌握SQL部分,能达到数据库开发工程师的能力要求与水平,SQL查询,数据库对象,索引,视图,分区表,优化等等实现从事数据分析师所具备的的数据处理能力,结合存储过程开发与使用,能更好的结合业务需求来完成对指标的统计与分析。 课程收益你将获得:    数据分析师SQL实战    掌握Oracle数据库全部技能    数据分析师入门操作    数据库开发工程师    独立开发数据库需求    SQL纯实战应用    具备数据处理,数据存储技能    具备数据仓库架构师思维与应用 1、建议每天保证2个小时学习时间,加以练习实操2、每节课后的练习案例动手实践,方能记忆深刻3、学完知识点后举一反三,应用到实际工作 课程亮点:Oracle全集包含服务器搭建,客户端使用,入门步骤,SQL各查询实现,条件查询,分组,聚合函数,正则表达式,高级函数,连接查询,多表查询,子查询,数据插入,更新,删除,数据库对象,如表,视图,索引,同义词,分区表,存储过程,存储过程大量案例,项目开发等等内容丰富,各知识点都配置相应的作业及解答过程,真正实例与案例操作,学会Oracle各种操作,满足实际业务工作需要,真正做到事半功倍,以实践工作出发完成各知识点的学习与应用,掌握数据库相关的技能 适合人群: 数据分析师,数据库开发人员,技能提升,数据库应用,在校学生,零基础入门,项目开发,初,,高级数据库开发工 程师,ETL开发,数据仓库架构,数据运维,企业开发,数据管理,数据质量等。 老师介绍:SUN老师高级数据分析专家,有着丰富的BI项目开发工作经验,具备数仓各方面的数据治理,指标开发,业务梳理,口径开发,曾相继在国移动,亚信,文思任职高级项目开发,专业领域BI,数据分析,维度与指标展示,数仓流程开发,可视化等相关技术 ,有完备的数据分析理论知识与应用,在数据分析,数据处理,数据可视化数据建模等应用,指标统计,维度分析,多维分析等有深入研究,具备更严谨的实践技能操作。 课程大纲:

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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