Oracle11g 如何从Oracle大表中删除多行?
我们有一张大约3.8亿张唱片的大桌子。我们需要删除早于2013年1月1日的前2.5亿条记录。我在谷歌上搜索了一些方法,但我并不满意。常见且最快的方法如下所示:Oracle11g 如何从Oracle大表中删除多行?,oracle11g,delete-row,multiple-records,Oracle11g,Delete Row,Multiple Records,我们有一张大约3.8亿张唱片的大桌子。我们需要删除早于2013年1月1日的前2.5亿条记录。我在谷歌上搜索了一些方法,但我并不满意。常见且最快的方法如下所示: create table newbig_table unrecoverable as select * from oldhuge_table where <condition is reverse of delete condition> create table newbig_table不可恢复为 从表格中选择* 哪里
create table newbig_table unrecoverable as
select * from oldhuge_table
where <condition is reverse of delete condition>
create table newbig_table不可恢复为
从表格中选择*
哪里
最后,将新表重命名为原始名称,但将继续插入哪些新记录
主要问题是,;此表是一个在线表,供许多代理使用。因此,我需要通过不减慢系统速度和不影响新记录的方式进行删除。我自己尝试过这个方法:
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;
}
使用(SqlConnection connData=newsqlconnection(“数据源=xxx;用户ID=xxx;密码=xxx;初始目录=xxx”))
{
connData.Open();
int-cnt=0;
长总计=0;
长startID=1039142601;
long-endID=1385795368;
long recCount=endID-startID;
cnt++;
long delRange=400;//按400删除400
用于(长i=1;i=”+startID.ToString()+
ID最好的方法是对表进行分区,这样就可以删除旧的分区
但是,如果您需要修改该表,并且不要忘记该表可能具有特权、索引、触发器等,并且需要在整个过程中保持其可用性,那么您需要使用DBMS_重新定义
此外,“不可恢复”是一种古老的语法,但您不希望使用现代的等效语法,因为如果系统上出现介质故障,您将丢失表和数据。按日期对表进行分区会有很大帮助。特定分区的内容可以比逐个删除行更快地删除
看一看;这描述了如何从非分区表移动到分区表。将delRange
从400更改为40000或400000
根据我的计算,您的进程将在Thread.Sleep(200)
中花费5.015天。网络、写入控制台等都有额外的时间。修改数据块并非总是可以避免的,但您至少应该尝试使用较大的数据块
正如其他人所提到的,分区可能非常有用。但是分区有很多缺点,如果这是一个罕见的过程,那么用简单的方法来完成它可能是值得的。您是否尝试过使用rownum进行正常删除?没有。它比标准删除快吗?标准删除是什么?如果您遇到同样的条件,它会更好在数据上创建分区表!并删除特定的分区。这要容易得多!!!!您需要那个解决方案吗?