急!!!为什么不能delete 50万条纪录。(100分)

L

ljzboy

Unregistered / Unconfirmed
GUEST, unregistred user!
我的sql server 里面有张表有大概50万条纪录,我现在想清空张表(不能drop了它),但是
运行的时候总是提示说超时,我试过用相同的语句来删除几千条纪录的时候就没有任何问题。
我试过用adoquery,adocommand都不行。求救,这是什么原因??难道delphi不能一次删除甘多
纪录吗???
 
用SQL语句: TRUNCATE TABLE 表名
 
数据库的log文件可能太小了。
 
你不需要用Delphi来进行这样的删除操作,用数据库提供的相关
SQL就行了,要不你何必用SQL数据库呢?
 
to Sachow & 一个过客,可不可以讲得详细些呢?谢谢
 
用Ttable控件
table1.emptytable;
table1必须先处于关闭状态,否则会报错
 
我是用bde连接,ado没这功能
 
to yanghaijun,我知道用数据库自带的query analysis可以做,我也都试过OK,但是现在我是要
在程序里面实现呢个功能波。还有一点我要处理的表有好几十个波。
谢谢你的关注,请继续。
 
大型数据库,存在一个回滚区
如果你一次操作记录超过回滚区限制,无论你是用数据库本身还是用delphi都会出错
解决方式有两个:
1、如果清空这个表,一条记录也不留,采用Sachow的办法
truncate table 你的表名
这是一个DDL语句,无需回滚,操作速度快
2、删除部分记录,那你就只有写个过程,分若干次删了
(每次删除的条数与你的数据库回滚区大小配置有关,以刚好不出错为上限)
每删除一次,提交一次



 
来自:Sachow, 时间:2002-10-24 12:34:00, ID:1392069
用SQL语句: TRUNCATE TABLE 表名

有两种原因:
1、数据库操作超时
2、数据库回滚段太小。
主要看你是如何删除表的,你是使用SQL语句还是AdoQuery.Delete?如果是后者,出错很正常。
如果是使用SQL语句,就应该考虑是回滚段/超时的问题了。
Sachow的办法不错,那个不保留日志删除,所以速度应该很快的。
 
//清空一个名为“MyTable”的数据表
var
SQLStr: String;
begin
SQLStr := 'Truncate table MyTable';
DataModule1.Query1.Close();
DataModule1.Query1.SQL.Clear();
DataModule1.Query1.SQL.Add(SQLStr);
DataModule1.ExecSQL();
end;
用“Truncate Table”删除有大量数量的数据表时速度很快,而如果你用“Delete From MyTable”
的话,数据量大的时候就会比较慢。
 
同意Sachow的
 
删除的记录太多,事物日志文件满了,Sachow的方法应该可以,也可以把事物日志设置大些。
 
adotable1.DeleteRecords(arall);
不知道能不能删除50万条,这么大的表
 
OK啦,谢谢楼上各位大虾热心帮助
 
分分不合理,agangr有分,我为什么没有
 
顶部