300分求救,一个比较有挑战性的问题!!!!

pinghero 2005-01-19 05:28:21
各位大哥好,偶是新手,现需要优化一个存储过程。基本需求如下:
1. 有一个每天上报数据的表 T1,上报的数据直接先Insert到T1,每天的数据量大概为1-2万,该T1表总数据量大概有快100万。
现在需要对T1表中每天上报数据进行相关状态的update。
2. update前要先对当前上传的数据进行验证,需要和另外一个表T2联合判断,(T2数据巨大,大约有几百万条),如判断字段A(主键),同时需要判断是否已在当前上报时间之前,也就是T1历史记录中存在,如果存在,就要分别进行12种状态判断,并分别对应update。
-- 这部分小弟觉得似乎只能用游标来做了,大家有什么更好的建议吗?!
3. 对于没有重复的那部分上报数据,需要批量更新更新,也是和其他表需要关联

------------------------------------------------------------
以前的那个存储过程对当天上报的所有数据用游标逐条处理,执行时间居慢,一般3。4小时以上,现在我想把它拆成两部分,因为当天上报数据中重复的比例比较少,这部分用游标来处理。 请问各位大哥还有什么好的方法吗??!希望能举例给小弟!!!万分感谢, 准备狂发分!!!谢谢
...全文
266 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
华1829 2005-01-20
  • 打赏
  • 举报
回复
为什么不用存储过程呀?
闲思暇想 2005-01-20
  • 打赏
  • 举报
回复
为什么不数据批量处理,先把要处理的数据都提取出来,处理完了再放回去不就好了嘛。
zjcxc 元老 2005-01-20
  • 打赏
  • 举报
回复

楼主的描述不是很清楚,根据楼主目前的描述

楼主的主要问题包括:
1.判断是否已在当前上报时间之前,也就是T1历史记录中存在
2.存在,就要分别进行12种状态判断,并分别对应update
3.对于没有重复的那部分上报数据,需要批量更新更新,也是和其他表需要关联
4.T1表数据允许重复,T2表有主键字段A

鉴于这种情况,个人建议做如下处理:
1.建立一个上传数据临时表 temp_T1,结构与T1相同,增加一个标志字段 flag,默认值为0
2.每天上传的数据上传到临时表 temp_T1
3.与T1表进行关联,设置重复记录的 flag 为1,可以用类似下面的语句
update a set flag=1
from temp_T1 a
where exists(
select * from T1 where 字段A=a.字段A)
4.根据 flag 状态与与其他表关联进行对应的更新处理(这部分处理楼主未描述,应该是能批量处理)
5.将更新后的 temp_T1 表数据插入到 T1
6.清空 temp_T1 以备接收后续数据
truncate table temp_T1
Merissa_0306 2005-01-20
  • 打赏
  • 举报
回复
我也有同样的问题,楼上的能不能给个明确的指示?谢谢了
子陌红尘 2005-01-20
  • 打赏
  • 举报
回复
也就是T1历史记录中存在,如果存在,就要分别进行12种状态判断,并分别对应update。
-- 这部分小弟觉得似乎只能用游标来做了,大家有什么更好的建议吗?!

----------------------------------------------------

具体情况具体对待,未必需要通过游标,一个在楼主看来复杂的问题,用一条SQL语句解决也未尝不可
honey888 2005-01-20
  • 打赏
  • 举报
回复
接分
Softlee81307 2005-01-20
  • 打赏
  • 举报
回复
接分
Softlee81307 2005-01-20
  • 打赏
  • 举报
回复
恭喜
pinghero 2005-01-20
  • 打赏
  • 举报
回复
谢谢各位的热情相助,经过努力,现在我已经从原来执行时间3小时优化到了3分钟,非常感谢!!!
txlicenhe 2005-01-19
  • 打赏
  • 举报
回复
pbsql(风云) ( )
可以举个简单例子说明一下吗?!非常感谢!!!
-----------------------
应该是楼主自己说出具体要求才能确定。
lishengyu 2005-01-19
  • 打赏
  • 举报
回复
只要你说的详细,让我们帮写SQL语句
我相信你的更新时间可降到5分种左右
Littleming 2005-01-19
  • 打赏
  • 举报
回复
解决问题要注意方法,要稍微理解sql工具的工作原理,对大量数据的处理最好想办法使用批处理
Littleming 2005-01-19
  • 打赏
  • 举报
回复
我是这么觉得:
方案一、前提是更新的数据和更新前的数据无关
1.删除T1中要更新的数据
2.批量插入数据
方案二、和更新前的数据有关
1.从T1中搬出要更新的数据到临时表
3.临时表和要插入的数据做对照更新临时表
2.批量插入数据来自临时表

这样的做法就省去对旧数据的判断
千万不要用游标

pinghero 2005-01-19
  • 打赏
  • 举报
回复
pbsql(风云) ( )
可以举个简单例子说明一下吗?!非常感谢!!!
daijingjie2002 2005-01-19
  • 打赏
  • 举报
回复
pbsql 2005-01-19
  • 打赏
  • 举报
回复
两表联合更新的方法不对,不该用游标,游标效率低下,特别是在大数据量下

粗略看了一下,基本可以不用游标,直接更新

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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