BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


奥运快报: 
奥运热点:
 

[ASE] 利用存储过程删除历史数据如何做到不写日志(已解决)

首页 » 论坛 » Sybase »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
回族四少
骑士




UID:487215
注册:2006-11-8
最后登录: 2008-09-06
帖子:78
精华:0

可用积分:83 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-6-3 14:38 
我的存储过程
create proc del_one_day_data_not_to_RS ( @beg_date varchar(32), @end_date varchar(32) )
as
begin
        set replication off

        delete from HIS_EWS_TASK where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date )
        delete from HIS_EWS_SERV_PARA where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
        delete from HIS_EWS_SERV where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
        delete from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date

        set replication on
end

避免写入历史数据库,删除历史表中06年一年的数据库,不能删除06年之后的数据。最小的表为HIS_EWS 其中数据量为3000万条 其余表中的数据至少是该表中的两倍,我郁闷一天一天的删除好慢,不知道有没有什么好办法没有,求大侠解答一下。有办法不写日志吗?真郁闷,一天一天的执行下去速度也奇慢。。。。

[ 本帖最后由 回族四少 于 2008-7-19 00:08 编辑 ]



您对本贴的看法:鲜花[1] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
版主 chuxu   帅哥
版主-精灵使




UID:26327
注册:2002-11-2
最后登录: 2008-09-05
帖子:3088
精华:1

可用积分:4768 (小富即安)
信誉积分:100
专家积分:176 (本版:35)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2008-6-3 15:27 
是没有办法不写日志的。

1、在 HIS_EWS_TASK等3个表上ews_id 是索引吗?如果不是,考虑加一个。
2、用showplan 看一下
delete from HIS_EWS_TASK where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date )

delete from HIS_EWS_TASK  from HIS_EWS where HIS_EWS_TASK.ews_id =HIS_EWS.ews_id where crt_date >= @beg_date and crt_date < @end_date
哪个更好些。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
回族四少
骑士




UID:487215
注册:2006-11-8
最后登录: 2008-09-06
帖子:78
精华:0

可用积分:83 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-6-3 16:30 
谢谢,是有索引的。对于您给出的第二个提示,show plan具体如何操作?
对sybase不是非常了解。。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
版主 chuxu   帅哥
版主-精灵使




UID:26327
注册:2002-11-2
最后登录: 2008-09-05
帖子:3088
精华:1

可用积分:4768 (小富即安)
信誉积分:100
专家积分:176 (本版:35)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-6-3 19:47 
isql里执行
set showplan on
go
set noexec on
go   
  delete from HIS_EWS_TASK where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date )
go
delete from HIS_EWS_TASK  from HIS_EWS where HIS_EWS_TASK.ews_id =HIS_EWS.ews_id where crt_date >= @beg_date and crt_date < @end_date
go
要把@beg_date 和@end_date 用实际的日期带进去。
把结果贴出来。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
回族四少
骑士




UID:487215
注册:2006-11-8
最后登录: 2008-09-06
帖子:78
精华:0

可用积分:83 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-6-3 22:38 
谢谢

set rowcount 10000
go
while (select min(crt_date) from  awsdyndb..HIS_EWS) < '20061123'
begin
set replication off
    delete from awsdyndb..HIS_EWS_TASK where ews_id
in(select ews_id from awdyndb..HIS_EWS where crt_date <='20061123')
    delete from awsdyndb..HIS_EWS_SERV_PARA where ews_id
        in(select ews_id from awsdyndb..HIS_EWS where crt_date<='20061123')
    delete from awsdyndb..HIS_EWS_SERV where ews_id
in(select ews_id from awsdyndb..HIS_EWS where crt_date <='20061123')
    delete from awsdyndb..HIS_EWS where crt_date <='20061123'
    set replication on
end
go
我写了这个.sql,然后用sqlrun运行的,等一个小时了还没有删除完呢,郁闷,让我遇到大批量删除数据的体力活了。。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
版主 chenfeng825
版主-精灵使



UID:36539
注册:2002-12-27
最后登录: 2008-09-04
帖子:2521
精华:4

可用积分:2509 (小富即安)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:ShangHai
状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-6-4 08:33 
看需求似乎是删除一次的动作,并且有replication。
如果是,不需要写procedure,直接删除,如过慢,还有一个方法可以使用,直接把复制定义停止,把需要的数据倒入新表,然后改名,然后重起复制,了不得就是一次表扫描,也没有太可怕的!



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

MSN:ASE_Support@HotMail.Com
Mail: AseSupport@gmail.com
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
回族四少
骑士




UID:487215
注册:2006-11-8
最后登录: 2008-09-06
帖子:78
精华:0

可用积分:83 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-6-11 21:11 
谢谢你



QUOTE:
原帖由 chenfeng825 于 2008-6-4 08:33 发表
看需求似乎是删除一次的动作,并且有replication。
如果是,不需要写procedure,直接删除,如过慢,还有一个方法可以使用,直接把复制定义停止,把需要的数据倒入新表,然后改名,然后重起复制,了不得就是一次 ...

我们那个表中的数据有3000万条记录,要删除07年6月份之前的表中的记录,数据库日志空间只有10g,不够一次性删除记录的日志使用。
暂时用了下面一个方法

要删除四张表HIS_EWS_TASK ,HIS_EWS_SERV_PARA ,HIS_EWS_SERV ,HIS_EWS 。只有HIS_EWS 表中有日期,所以其他表只能用ews_id字段进行关联,创建每天删除数据的存储过程如下
create proc del_one_day_data_not_to_RS ( @beg_date varchar(32), @end_date varchar(32) )
as
begin
        set replication off--关闭RS

        delete from HIS_EWS_TASK where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date )
        delete  from HIS_EWS_SERV_PARA where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
        delete from HIS_EWS_SERV where ews_id in
                (select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
        delete from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date

        set replication on--开启RS
end

然后写了一个sql脚本,填写好每个要删除的日期

use awsdyndb
go
del_one_day_data_not_to_RS '20070101','20070102'
go
del_one_day_data_not_to_RS '20070102','20070103'
go
del_one_day_data_not_to_RS '20070103','20070104'
go
del_one_day_data_not_to_RS '20070104','20070105'
go
del_one_day_data_not_to_RS '20070105','20070106'
go
del_one_day_data_not_to_RS '20070106','20070107'
go
del_one_day_data_not_to_RS '20070107','20070108'
go
del_one_day_data_not_to_RS '20070108','20070109'
go
del_one_day_data_not_to_RS '20070109','20070110'
go
del_one_day_data_not_to_RS '20070110','20070111'
go
del_one_day_data_not_to_RS '20070111','20070112'
go
del_one_day_data_not_to_RS '20070112','20070113'
go
exit
然后写了个简单的shell
#!/bin/sh

/sybase/OCS-12_5/bin/isql -数据库服务名 -U用户名 -P密码 -i /tel/bin/delet_his_ews.sql

然后写入crontab,定时晚上12点开始执行
00 0 * * * /tel/bin/delethisews.sh


这个方法的缺点是不能一次性大量的删除数据,只能分成多个事务进行执行,然后白天dump掉日志。
没有办法,对sybase不是太精通,只好暂时用这种笨方法了,希望高手补充方案。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
版主 chenfeng825
版主-精灵使



UID:36539
注册:2002-12-27
最后登录: 2008-09-04
帖子:2521
精华:4

可用积分:2509 (小富即安)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:ShangHai
状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-6-12 08:54 


QUOTE:
原帖由 回族四少 于 2008-6-11 21:11 发表


我们那个表中的数据有3000万条记录,要删除07年6月份之前的表中的记录,数据库日志空间只有10g,不够一次性删除记录的日志使用。
暂时用了下面一个方法

要删除四张表HIS_EWS_TASK ,HIS_EWS_SERV_PARA  ...

重点在这里
直接把复制定义停止,把需要的数据倒入新表,然后改名,然后重起复制,了不得就是一次表扫描,

另外,抛开别的不谈,那个procedure我们可以稍微改进一下
首先,删除可以使用exists应当会比in性能好些,注意索引情况
或者select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date既然四个delete语句都从上面取值,建议办法就是直接将结果取到临时表连接,可能会更好,如果是索引不合理,这样将会有重大改进!


还有一个像了解的是,3000w数据,要delete的多少,行很宽?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

MSN:ASE_Support@HotMail.Com
Mail: AseSupport@gmail.com
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
回族四少
骑士




UID:487215
注册:2006-11-8
最后登录: 2008-09-06
帖子:78
精华:0

可用积分:83 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-6-14 07:14 


QUOTE:
原帖由 chenfeng825 于 2008-6-12 08:54 发表



重点在这里
直接把复制定义停止,把需要的数据倒入新表,然后改名,然后重起复制,了不得就是一次表扫描,

另外,抛开别的不谈,那个procedure我们可以稍微改进一下
首先,删除可以使用exists应当会 ...

呵呵,的确是用临时表保存ews_id也即工单号比较号。四张表存放的是97系统送过来的营业厅的工单。目前改进后是每天晚上1点5分执行
sql
sp_stop_rep_agent awsdyndb,nowait

dbcc settrunc (ltm, ignore)
go
dump tran awsdyndb with truncate_only
go
dbcc settrunc(ltm,valid)
sp_start_rep_agent awsdyndb
进行日志dump
然后晚上两点,开始调用存储过程,进行数据的删除。
这两天发现了一个新问题。就是sp_helpdb awsdyndb 后日志剩余空间的显示问题。
刚已发帖子说了,在这里再给你说下

昨天已经发现日志空间显示剩余不正常
(1 row affected)
device_fragments               size          usage                created             free kbytes      
------------------------------ ------------- -------------------- ------------------- ----------------
awsdyndb_dev                      32000.0 MB data only            Feb 15 2006  3:04AM          6260528
awsdyndb_log                      10000.0 MB log only             Feb 15 2006  3:04AM not applicable   
awsdyndb_dev2                     32000.0 MB data only            Sep 27 2007 10:20AM           445600
phsdb06_dev                        2048.0 MB log only             Jun  1 2008 11:23PM not applicable   
                                                                                                                  
-----------------------------------------------------------------------------------------------------------------
log only free kbytes = 15600608        
第二天再看

         ------------------------------------------------------------------------------------------------------
awsdyndb                    76048.0 MB telstar                       7 Feb 15, 2006  
         select into/bulkcopy/pllsort                                                                           

(1 row affected)
device_fragments               size          usage                created             free kbytes      
------------------------------ ------------- -------------------- ------------------- ----------------
awsdyndb_dev                      32000.0 MB data only            Feb 15 2006  3:04AM          7208832
awsdyndb_log                      10000.0 MB log only             Feb 15 2006  3:04AM not applicable   
awsdyndb_dev2                     32000.0 MB data only            Sep 27 2007 10:20AM           445600
phsdb06_dev                        2048.0 MB log only             Jun  1 2008 11:23PM not applicable   
                                                                                                                  
-----------------------------------------------------------------------------------------------------------------
log only free kbytes = 73938248                  

狂晕中。。。。显示剩余空间大大超出了分配的12G空间。。。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘

首页 » 论坛 » Sybase »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.082686 second(s), 4 queries , Gzip enabled