Oracle11g 如何从Oracle大表中删除多行?

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不可恢复为 从表格中选择* 哪里

我们有一张大约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不可恢复为
从表格中选择*
哪里
最后,将新表重命名为原始名称,但将继续插入哪些新记录

主要问题是,;此表是一个在线表,供许多代理使用。因此,我需要通过不减慢系统速度和不影响新记录的方式进行删除。我自己尝试过这个方法:

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进行正常删除?没有。它比标准删除快吗?标准删除是什么?如果您遇到同样的条件,它会更好在数据上创建分区表!并删除特定的分区。这要容易得多!!!!您需要那个解决方案吗?