oracle update 效率低 怎么办呢

create or replace procedure P_CRM_UPDATE_VIP_CARD_STATE AS

CURSOR CC IS
SELECT A.SERIAL_NUMBER,
A.REMOVE_TAG,
A.VIP_CARD_END_DATE
FROM TF_F_CUST_VIP A
WHERE A.REMOVE_TAG = '0'
AND A.VIP_CARD_END_DATE < SYSDATE;
CCREC CC%ROWTYPE;
BEGIN
OPEN CC ;
LOOP
FETCH CC
INTO CCREC;
EXIT WHEN CC%NOTFOUND;

UPDATE TF_F_CUST_VIP
SET VIP_CARD_STATE = '4'
WHERE REMOVE_TAG = CCREC.REMOVE_TAG
AND VIP_CARD_END_DATE = CCREC.VIP_CARD_END_DATE;

UPDATE TF_R_CARD_VIP
SET CARD_STATE_CODE = '1',
SERIAL_NUMBER = '',
end_date = to_date('2050-12-31 23:59:59',
'yyyy-mm-dd hh24:mi:ss')
WHERE RES_NO = CCREC.SERIAL_NUMBER;
COMMIT;
END LOOP;
CLOSE CC;

end P_CRM_UPDATE_VIP_CARD_STATE;
这是我写的存储过程 ,哪位大侠给看看吧,怎么能提高一下效率呢?

0
liuyinhuan0409
liuyinhuan0409 有没有楼主想要的答案咧
接近 7 年之前 回复

3个回答

我大概看了一下你的procedure,无非是做了两件事:
1.根据TF_F_CUST_VIP中的某些数据去update TF_R_CARD_VIP中的数据(这个可以用Merge语法)
2.update TF_F_CUST_VIP本table中的某些数据(这个就直接update)
其实这些动作没必要用游标去循环了,用游标全表循环自然效率低,可以参考下面修改的:

[code="sql"]
create or replace procedure P_CRM_UPDATE_VIP_CARD_STATE AS
BEGIN

Merge into TF_R_CARD_VIP t
using (SELECT A.SERIAL_NUMBER, A.REMOVE_TAG, A.VIP_CARD_END_DATE
FROM TF_F_CUST_VIP A
WHERE A.REMOVE_TAG = '0'
AND A.VIP_CARD_END_DATE < SYSDATE) aa
on (aa.SERIAL_NUMBER = t.RES_NO)
When matched then
update
SET CARD_STATE_CODE = '1',
SERIAL_NUMBER = '',
end_date = to_date('2050-12-31 23:59:59',
'yyyy-mm-dd hh24:mi:ss');

UPDATE TF_F_CUST_VIP
SET VIP_CARD_STATE = '4'
WHERE A.REMOVE_TAG = '0'
AND A.VIP_CARD_END_DATE < SYSDATE;

COMMIT;

end P_CRM_UPDATE_VIP_CARD_STATE;
[/code]

手写,未测试..

0
liuyinhuan0409
liuyinhuan0409 呵呵,希望能帮到你就好,大家共同学习~~
接近 7 年之前 回复
maomimi2213
maomimi2213 恩,数据库不好,都不知道什么时候该用什么,谢谢你 ,呵呵
接近 7 年之前 回复
liuyinhuan0409
liuyinhuan0409 看你的游标用的很熟练了,只是这个地方个人感觉没必要用游标了啦,仅供参考
接近 7 年之前 回复
maomimi2213
maomimi2213 其实我不知道该用什么去写,刚好会游标,就用了, 呵呵
接近 7 年之前 回复

不知道update表的数据量有多少,给个思路
1.看where条件执行要多久,如果数据量大,where条件没有索引,会很慢的。
2.看set字段是否建立了索引,如果有索引,update也会更新索引。

0
maomimi2213
maomimi2213 上万的数据,比较大
接近 7 年之前 回复

估计是数量较大吧

1.如果有索引的话,先drop掉,再build。

2.如果有制约的话,先disable,再enable

3.不用循环,用一句SQL处理。比如第一个处理
[code="sql"]
UPDATE TF_F_CUST_VIP B
SET VIP_CARD_STATE = '4'
WHERE EXISTS
(SELECT *
FROM TF_F_CUST_VIP A
WHERE A.REMOVE_TAG = '0'
AND A.VIP_CARD_END_DATE < SYSDATE
AND b.REMOVE_TAG =a.REMOVE_TAG
AND b.VIP_CARD_END_DATE =a.VIP_CARD_END_DATE
)
[/code]

未测试!

0
j_clxy
clxy大叔 有区别。 你的是查询出来,一条条循环做。 我的是一句SQL文处理掉。 区别就是不用再在存储过程里循环了。 特别这句 [code="sql"] UPDATE TF_F_CUST_VIP SET VIP_CARD_STATE = '4' WHERE REMOVE_TAG = CCREC.REMOVE_TAG AND VIP_CARD_END_DATE = CCREC.VIP_CARD_END_DATE; [/code] 我的猜测,这个where条件不足以限定只有1条数据吧?! 假如满足where条件的数据是复数的,那么你对同一条数据重复循环做update!
接近 7 年之前 回复
maomimi2213
maomimi2213 数据量是相当大,上午执行了好久也没执行完,你这样 写跟我那样写有什么区别吗?
接近 7 年之前 回复
j_clxy
clxy大叔 刚看到Dead_knight的回复,发现自己没说清楚。 正如他说的那样,上面的1,2也是指set字段,不是where字段。 比如索引,先drop掉,update,再build。
接近 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
提高数据更新效率(UPDATE/INSERT)
有多种方法可以提高更新的效率.简单说来:1、暂停索引,更新后恢复.避免在更新的过程中涉及到索引的重建.2、批量更新,每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.3、创建一临时的大的表空间用来应对这些更新动作.=========================================================================不同看法如果UPDAT
merge与update效率比较系列1
建立测试用表 CREATE TABLE test1 AS SELECT * FROM dba_objects; CREATE TABLE test2 AS SELECT * FROM Dba_Objects; ALTER TABLE test2 ADD constraints pk_test2 PRIMARY KEY (object_id); ALTER TABLE test1 ADD con
Update关联查询不走索引,效率低下
优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段。形如Sql代码  update A set A.a=(select B.b from B where A.id=B.id);  原SQLupdatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(select distinctb.scrm_rptpnt_proces
merge into 效率好低
场景:三张表分别是t_organization_sync, t_organization_relation, t_organization ,刚好是一一映射关系,每个表都有40万条数据。 任务:从sync表同步数据通过关系表同步数据到 t_organization 中,如果t_organization表中没有找到数据,就插入一条,并维护关系表。 运行结果:2个多小时都没跑完, 来大师指导。
ORACLE 大数据批量更新 MERGE INTO 代替 UPDATE/INSERT INTO 提升性能
最近写存过的时候,从备份表中更新字段到正式表中,使用 UPDATE 批量更新大量的数据,会出现效率低下,有时候甚至卡死的情况,后面通过使用 MERGE INTO 代替 UPDATE 执行批量更新,会提升执行效率。 MERGE INTO语法如下:MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join cond
使用子查询提高查询效率
故障现象:多查询一个字段时效率很低,少一个字段时效率快10倍 解决方案:使用子查询提高查询效率   实例: SELECT BTS.EMS_NE_NAME AS DEVICE_NAME,'3G' AS DEVICE_CATEGORY ,'光缆' AS COMPARE_TYP,SEG_ROAD. OP_CABLE_SEG_NAME AS OBJ_NAME , --ROAD.OP_ROA...
oracle创建索引会降低更新的效率?
需要看创建索引的字段 是在 WHERE条件后面充当条件, 还是索引字段就为更新字段 :比如UPDATE 表 SET A = 1     WHERE  B = 2如果 B  列有索引,那么提高效率。如果 A  列有索引,那么降低效率。因为:更新的列上建有索引,数据库不但要更新表里的数据,而且要更新相应的索引。所以这个索引就会降低update执行的效率。...
oracle解决游标多维度循环查询效率过低方案
多维度查询时通常需要建立多个游标循环,查询效率无法得到保障,现在通过游标和substr()函数相结合的方式提高查询效率
mysql用in效率低?
子查询指的是一个查询是另外一个查询的条件,之间关系是用in来构建 虽然有时候用explain显示是用到索引 但是看到rows的时候就发现还是扫描了最外边表中的大多数数数据 (这种情况出现在了mysql5.5和5.6版本里边。5.7得到了优化) 看两个例子 UPDATE    task_manager    INNER JOIN      (SELECT        task
oracle 百万条数据 update所有记录时的 sql 执行效率问题
需求: 有一张临时表 , 数据总数100w条, 其中 50w条 , state = 1 50w条 , state = 0 因为数据无用 , 所以需要 更新 所有数据的 state 为 1 ; 环境 数据库 : oracle 11g 操作系统 : win10 开发工具: PL/SQL 方案: ...
使用jdbcTemplate BatchUpdate批量插入效率慢的问题
原因是没加jdbc连接参数导致多条插入被识别成一条一条执行,在jdbc连接URL后加上如下参数:   rewriteBatchedStatements=true   examp: url: jdbc:mysql://xxxx:3306/syncdata_test?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;rewriteBatchedSt...
update字段执行效率慢的解决办法
update字段时,执行效率慢可以换成下边这种方式: 解决办法: 用merge into tableA using (括号里面是你需要的字段,来自于其它表的数据 比如 tableB) on(tableA 跟tableB 的关联条件) when matched then update set tableA.id=tableB.id ; 这是句式,下边用案列来证明及 这个句式的具体使用...
线程安全与效率的问题
线程的安全是以牺牲效率为代价的,所谓线程安全就是多了个加锁、解锁的操作,比如100亿个操作中都要加锁和解锁,线程是安全了,但效率就下降了。而有些软件是以效率为主的,为了提高效率,就少了加锁,解锁的操作,虽然容易出现并发访问问题,但效率却提高了。                例如: StringBuffer 是线程安全的而StringBuilder是线程非安全的,所以StringBu
oracle sql中使用了 or 会影响sql执行的效率的解决方法
在oracel  中,  写的SQL用到了 or,  如果太多的话会影响执行的效率,  那么我们可以指定 让优化器执行  将 where后面的or 条件转化为  union  all  的组合查询。/*USE_CONCAT*/ SELECT  /*USE_CNCAT*/  FROM TABLE WHERE id = '123' OR name = '张三'  转化后的结果select * from...
使用临时表关联数据时效率低的问题
临时表关联数据时效率低的问题
当发现Oracle的Order by严重的影响了SQL性能,我们该怎么办?
原因分析:由于内存区域不够,Oracle 使用磁盘的内存空间进行排序操作,这样就导致了I/O影响SQL性能 解决方式: 1.在排序字段上加索引,但是这个对性能的提升不明显,因为排序是在返回的结果集中完成。 2.可以尝试配置PGA,使其进行自动管理这块内存区域,让Oracle的排序在内存中完成。 不用重启DB,直接在线修改。 SQL&amp;gt;alter system set workar...
工作效率低,怎么办?
曾有一段时间,我的工作效率很低,老是出差错,导致领导同事的差评,这又让我很是苦恼,情绪也很差,几乎快进入恶性循环。后经高人点拨,自我反思与总结,经过不断调整,情况得到好转,同时也找到了提高工作效率的切实可行的办法,觉得有必要分享出来,希望对职场中想提高工作效率的朋友有所帮助。 先说下自己的工作历程。我刚工作的初期,激情满怀,充满好奇心,学习动力十足。写 SQL、存储过程、shell 程序,data...
解决Hibernate效率低下问题
  前几天,客户反馈说使用系统某一个模块十分缓慢,有时候还会崩溃; 客户机器数据量大概在1W5左右,加大请求超时时间后,虽然不会崩溃,但是依然慢的吓人,1W5的数据,居然需要30~40多秒钟; 系统是使用SSH框架开发,因为关联关系比较多,所以使用Hibernate进行管理数据库,是最合适的; 问题查找: 1.出现这个问题,还得说到以前的开发人员,当时在完成项目的阶段中,在设计表的时候,...
oracle中的 exists 和 in 的效率问题
转自:http://www.cnblogs.com/ztf2008/archive/2009/02/01/1381996.html 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;     T1数据量小而T2数据量非常大时,T1
oracle 批量更新四种方法比较
转ORACLE批量更新四种方法比较软件环境 Windows 2000 + ORACLE9i 硬件环境 CPU 1.8G + RAM 512M现在我们有2张表 如下: T1–大表 10000笔 T1_FK_ID T2–小表 5000笔 T2_PK_ID T1通过表中字段ID与T2的主键ID关联模拟数据如下: –T2有5000笔数据 create table T2 as selec
Oracle表字段更新存储过程效率优化思路
Oracle存储过程优化思路以及思路下优化效果比较
oracle中查找执行效率低下的SQL
oracle中查找执行效率低下的SQL kt431128 发布于 9个月前,共有 0 条评论 v$sqltext:存储的是完整的SQL,SQL被分割 v$sqlarea:存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息(统计) v$sql:内存共享SQL区域中已经解析的SQL语句。(即时)     select opname, ta
当要在 Oracle 中之心批量 INSERT、UPDATE 和 DELETE 操作时,可以使用 FORALL 语句。比for loop效率高
==index_name:一个无需声明的标识符,作为集合下标使用; ==sql_statement:静态语句,例如:UPDATE或者DELETE;或者动态(EXECUTE IMMEDIATE)DML语句。 ==SAVE EXCEPTIONS:可选关键字,表示即使一些DML语句失败,直到FORALL loop执行完毕才抛出异常。可以使用SQL%BULK_EXCEPTIONS 查看异常信息。 =
update慢如何处理?
update慢: 1.表的pctfree参数设置? 2.执行计划用索引还是全表扫? 3.SQL语句写法问题? 4.update慢还是commit慢? 5.更新多少条数据? 6.表是否频繁update造成碎片过多? 7.考虑使用merge? 8.应用问题? 9.数据库参数设置?
Oracle的update语句优化研究 批量更新
Oracle的update语句优化研究 一、 update语句的语法与原理 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1' where year='2011' 更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了
oracle 10046事件,解决dblink跨oracle server复制数据效率慢踩到的坑
最近机器学习很火,公司也想着往这方面做一些试水项目,想着从大量的历史数据中预测用户行为。由于需要用到大量的数据做分析,所以得从生产环境中获取这些数据进行相关的分析。那么问题来了,我们总不可能直接对生产环境的数据进行操作然后分析吧(以免影响生产环境的业务),所以必须从生产环境中将大量的数据复制到本地oracle db,再做分析。本人对于这次的跨环境跨库数据复制有着深深的体会,特别是oracle db
mybatis 进行批量更新以及效率比较
https://www.cnblogs.com/parryyang/p/5586873.html https://blog.csdn.net/xyjawq1/article/details/74129316 https://blog.csdn.net/xu1916659422/article/details/77971696
【SQL】—Oracle之row_number()与rownum效率大比拼
取前面11条数据的时间:rownum<row_number() 取后面11条数据的时间:rownum<row_number() rownum:取前面11条数据的时间<取后面11条数据的时间 row_number():取前面11条数据的时间<取后面11条数据的时间 相对取出11条数据(无论前后),rownum比row_number()大概节省一半的时间。 Ok,这就是对比的结果,看来,经典的分页查询,通过rownum还是很有道理的。因为它比ro
mysql 的优化(如何查询mysql中执行效率低的sql语句)
配置my.cnf/my.ini,增加 --log-slow-queries 配置,记录所有的slow query,然后挨个优化 本文来源于 WEB开发网 select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID cre
为什么学习效率如此低,我很迷茫?
一天一天的过的真的是太快了,常常感到时间在前进,而我们还在停滞不前,看似每天努力的工作学习着,仔细想想其实又会发现,一天下来我们好像还真的什么都没干,看似忙碌的一天,我们把时间都用在哪了?学习!可是为什么我觉得什么也没学到呢?其实不是没有学到东西,只是我们的学习效率太低而已!为什么我们的学习效率如此的低呢?我们在上学一来一直都羡慕那种玩的多但是考的又好的人,他学习的时候你也在学习,他玩的时候你也在学
oracle中update语句的性能优化
http://www.jbxue.com/db/13211.html
关于Unity刷新帧率低的问题
Unity新建的项目的刷新帧率一直在20左右徘徊。 垂直同步已关,没有影响 删掉所有东西,没有影响 在贴吧提问,据说是Unity认为当前没有东西要刷新,20帧左右是引擎自动调整的,但我在代码中强制设置刷新帧率为100,没有影响。 当前唯一能改变刷新帧率的就是将游戏窗口缩小,能略微提升刷新帧率 最后发现其实是我的显卡问题,在设备管理器里面发现集显上显示这个设备异常,已经被停止了。更新驱动的...
ORACLE:大数据update(部分转载)
批量更新,MERGE语句性能最好,因为它可以多块读,并且可以并行执行,但是缺点就是消耗比较多的UNDO,一旦down机死事物恢复较慢。 ORDER BY ROWID 在 buffer cache 不够大的情况下性能较好好(没Merge快,因为Merge可以多块读,走ROWID只能单块读)。
Oracle多表关联update优化
       我们都知道,在Oracle数据库中,对单表进行更新采用标准update语法效率是非常高的,语法为UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,如下SQL所示:  update t_join_situation set join_state = '1' where year='2011'       如果涉及关联表,并把一个表的字段值更新到另一个表中...
ORACLE 使用 LIKE 模糊查询效率慢
ORACLE 使用 LIKE 模糊查询效率慢   原因: 1、使用 LIKE 模糊查询效率慢会索引失效从而引起全表扫描。   解决方法: 1、将like '%%' 改成 ‘% ' 或 ’%‘. 2、使用Oracle内部函数:INSTR()。 如: SELECT S_PORT_ID,S_MOI_NAME,S_NATIVE_NE_NAME,S_PORT_NO,S_REMARK FRO...
oracle大量数据更新优化(merge)
有两张1.5亿数据量的表,一张表中有字段name,大概有5000万左右为null,另一张表name字段不为null,两张表可通过主键id关联。现在省略去不必要的字段,以及分区等构造两张实验表: SQL> CREATE TABLE p_t AS SELECT ROWNUM ID,CASE WHEN MOD(ROWNUM,3)=0 THEN NULL ELSE DBMS_
数据库视图效率低下一例
最近发现一个sql效率比较低,虽然条件选择范围比较窄(选择性很好),却全表扫描而无法使用索引,导致效率很低。 后来问开发人员,因为在框架中需要一个主键,自己就在视图中增加了一列,ROWNUM AS serialno(oracle数据库),其实一般来说视图的建立都是先选择基表的,一般基表的主键或者唯一键就直接当框架中的主键就可以了,不要偷懒增加单独一列。 还有一种情况是表本身没有建立主键,业务理
Oracle的Insert、Update、Delete等DML操作速度的提高
在Oracle数据库中,Insert、Update、Delete三个操作是对数据库中的数据进行插入、更新以及删除。在进行这些操作时,如果数据库中的记录比较多时,则所需要的时间比较长。如需要利用一个Update语句更新大量记录时,即使更新的内容很简单,如只是将价格提升10%,但是仍然需要花费比较成的时间。所以从某种程度上来说,进行这些操作时其执行速度跟内容的大小关系不大,反而跟记录的多少却有很大的关
效率低的日子怎么办?
英文原文:asianefficiency,翻译:JianShu – @cmm要给力_ 每个人都会有效率低的时候,即使是 Efficient Asian™ 也不能保证他们的时间可以 100% 的利用。 有些时候我们会感觉日子过得不对,例如:你的网络瘫痪了,于是就没有了工作的动力,或者是你发现自己每天都在各种事情上面忙碌,但回顾自己的任务列表的时候却发现任务并没有完成。有时候你
Hibernate——大量save()效率低下的解决方法
在用Hibarnate进行大量数据save时,速度会变得很慢,先举个例子如下: 主表-订单:order.hbm.xml [code=&quot;java&quot;] [/code] 子表-订单分录:entry.hbm.xml [code=&quot;java&quot;] [/code] 通过查看Hibernate在执行save操作的sql...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 大数据培训呢 区块链培训班呢