请教一个存储过程的优化,一运行这个数据库就占用98%,我想是instr占用内存太多的原因,不知道怎么优化

aysun168 2006-06-01 11:11:04
create or replace procedure TYPE_UPDATESTATE_temp
(
TYPE_TABLE_NAME VARCHAR, --表名
TYPE_ID varchar, --id连起的字符串,例(12,13,14)
Type_State number --状态值
)
is
begin

if TYPE_TABLE_NAME = 'article' then
update t_article set a_state=Type_State where instr(','||TYPE_ID||',',','||a_id||',')>0 ;
update t_article_index set ai_state=Type_State where ai_type=0 and instr(','||TYPE_ID||',',','||ai_src||',')>0;
if Type_state =5 then
update t_topic set t_list=t_list-1 where t_id in (select a_topic from t_article where a_topic>0 and instr(','||TYPE_ID||',',','||a_id||',')>0 ;
--update t_user set u_article=u_article-1 where u_id in (select a_user from a_article where a_topic>0 and instr(','||TYPE_ID||',',','||a_id||',')>0 ;
end if;
end if;
end TYPE_UPDATESTATE_temp;
数据量t_article现在30W以上,t_article_index40W以上
a_topic现在10W,t_user现在100W以上

...全文
201 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kill8108 2006-08-07
  • 打赏
  • 举报
回复
我对oracle不是很熟,instr若在你那大的字符串中速度真的会很慢的了,应该去优化下吧!
BITLJ 2006-08-07
  • 打赏
  • 举报
回复
表里有没有主键啊
另外对查询字段使用函数会降低效率
mu_gua 2006-08-07
  • 打赏
  • 举报
回复
sozdream() 说的是with查询吧,不知道with能否用于update中
mu_gua 2006-08-07
  • 打赏
  • 举报
回复
instr(','||TYPE_ID||',',','||a_id||',')
显然在子串和源串前后都加','是多余且降低效率的
instr(TYPE_ID,a_id)中包含参数,是一个可变函数,因此不能建立函数索引。
在这么大规模的表上作update,无法使用索引只能全表扫描了。
如果硬件不是足够的强大只能修改设计了
龙翔飞雪 2006-08-07
  • 打赏
  • 举报
回复
你程序里经常用到instr(','||TYPE_ID||',',','||a_id||',')>0

那你就声明一个 integer变量, 比如叫 isCorrect;

然后sql里全用isCorrect>0
aysun168 2006-06-01
  • 打赏
  • 举报
回复
没有顶吗?

17,086

社区成员

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

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