我们有一个大约 3.8 亿条记录的大表。我们需要删除前 2.5 亿条早于 2013 年 1 月 1 日的记录。我搜索了一些方法,但并不满意。常见且最快的方式如下所示:
create table newbig_table unrecoverable as
select * from oldhuge_table
where <condition is reverse of delete condition>
最后将新表重命名为原始名称,但新的记录会不断插入吗?
主要问题是;此表是一个在线表并被许多代理使用。所以我需要通过不减慢系统速度和不影响新记录来删除。我自己试过这个方法:
using (SqlConnection connData = new SqlConnection("Data Source=xxx;User ID=xxx;password=xxx;Initial Catalog=xxx"))
{
connData.Open();
int cnt = 0;
long total = 0;
long startID = 1039142601;
long endID = 1385795368;
long recCount = endID - startID;
cnt++;
long delRange = 400; //deletes 400 by 400
for (long i = 1; i < endID; i++)
{
startTime = DateTime.Now;
string deleteSql = "delete from DivaSessionFlowLog " +
" where ID >= " + startID.ToString() +
" and ID <= " + (startID + delRange).ToString();
int strID = (int)((new SqlCommand(deleteSql, connData)).ExecuteNonQuery());
total = total + strID;
Console.WriteLine(i.ToString() + ":" + strID.ToString() + " OK DelCnt:" + total.ToString() + " ID:" + startID.ToString() + " Rest:" + String.Format("{0:#,#}", (recCount - total)) + " Time:" + DateTime.Now.ToString("HH':'mm':'ss"));
Thread.Sleep(200);
startID = startID + delRange;
i = startID;
}
为了不减慢系统程序休眠 200 毫秒。但是,我计算了大约2 周的完成时间。总之,我需要找到;
- 快速地
- 不会减慢数据库速度
- 不会持续影响新插入的记录
从大表中删除多行的方法。有什么建议么?