Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Oracle 9i DB中删除大数据?_Oracle_Oracle9i - Fatal编程技术网

如何从Oracle 9i DB中删除大数据?

如何从Oracle 9i DB中删除大数据?,oracle,oracle9i,Oracle,Oracle9i,我有一个5 GB的表,现在我正在尝试删除,如下所示: delete from tablename where to_char(screatetime,'yyyy-mm-dd') <'2009-06-01' 但我也没有发现任何阻塞 如何删除这些大数据而不出现任何问题? 使用必要的行查询 截断表 导入行 使用必要的行查询 截断表 导入行 如果screatetime上有索引,则您的查询可能未使用该索引。更改语句,以便where子句可以使用索引 delete from tablename

我有一个5 GB的表,现在我正在尝试删除,如下所示:

delete  from tablename
where to_char(screatetime,'yyyy-mm-dd') <'2009-06-01' 
但我也没有发现任何阻塞

如何删除这些大数据而不出现任何问题?

  • 使用必要的行查询
  • 截断表
  • 导入行
      • 使用必要的行查询
      • 截断表
      • 导入行

      如果screatetime上有索引,则您的查询可能未使用该索引。更改语句,以便where子句可以使用索引

      delete from tablename where screatetime < to_date('2009-06-01','yyyy-mm-dd')
      
      从表名中删除,其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
      
      如果screatetime上有索引,则您的查询可能未使用该索引。更改语句,以便where子句可以使用索引

      delete from tablename where screatetime < to_date('2009-06-01','yyyy-mm-dd')
      
      从表名中删除,其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
      
      首先锁定表时,它的运行速度要快得多。根据Rene的建议,还应更改where子句

      LOCK TABLE tablename IN EXCLUSIVE MODE;
      
      DELETE FROM tablename
      where screatetime < to_date('2009-06-01','yyyy-mm-dd');
      
      在独占模式下锁定表tablename;
      从表名中删除
      其中screatetime<截止日期('2009-06-01','yyyy-mm-dd');
      
      编辑:如果由于表不断被访问而无法锁定,则可以选择salami策略删除这些行:

      BEGIN
        LOOP
          DELETE FROM tablename
            WHERE screatetime < to_date('2009-06-01','yyyy-mm-dd')
              AND ROWNUM<=10000;
          EXIT WHEN SQL%ROWCOUNT=0;
          COMMIT;
        END LOOP;
      END;
      
      开始
      环
      从表名中删除
      其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
      
      ROWNUM当您首先锁定表时,它运行得更快。根据Rene的建议,还应更改where子句

      LOCK TABLE tablename IN EXCLUSIVE MODE;
      
      DELETE FROM tablename
      where screatetime < to_date('2009-06-01','yyyy-mm-dd');
      
      在独占模式下锁定表tablename;
      从表名中删除
      其中screatetime<截止日期('2009-06-01','yyyy-mm-dd');
      
      编辑:如果由于表不断被访问而无法锁定,则可以选择salami策略删除这些行:

      BEGIN
        LOOP
          DELETE FROM tablename
            WHERE screatetime < to_date('2009-06-01','yyyy-mm-dd')
              AND ROWNUM<=10000;
          EXIT WHEN SQL%ROWCOUNT=0;
          COMMIT;
        END LOOP;
      END;
      
      开始
      环
      从表名中删除
      其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
      
      ROWNUM5GB不是一个有用的表大小度量。行的总数很重要。要删除的行数占总事务数的比例。行的平均长度很重要

      如果要删除的行的比例很小,那么在
      screatetime
      上创建索引时可能值得一试,之后您将删除该索引。这可能意味着整个操作需要更长的时间,但至关重要的是,它将减少删除行所需的时间

      另一方面,如果要删除大量行,您可能会发现

    • 使用创建表的副本 '创建表t1_复制为从t1选择* 其中screatedate>=截止日期('2009-06-01','yyyy-mm-dd')`
    • 使用
      rename
      命令交换表
    • 将约束、索引重新应用于新T1
    • 要记住的另一件事是,删除比其他事务消耗更多的撤消,因为它们需要更多的信息来回滚。因此,如果您的记录很长和/或很多,那么DBA可能需要检查UNDO表空间(或者如果您仍在使用它们,则需要回滚seg)


      最后,你有没有做过调查,看看时间到底在往哪里走?DELETE语句只是另一个查询,可以使用常规的调优技巧来处理它们

      5GB不是表大小的有用度量。行的总数很重要。要删除的行数占总事务数的比例。行的平均长度很重要

      如果要删除的行的比例很小,那么在
      screatetime
      上创建索引时可能值得一试,之后您将删除该索引。这可能意味着整个操作需要更长的时间,但至关重要的是,它将减少删除行所需的时间

      另一方面,如果要删除大量行,您可能会发现

    • 使用创建表的副本 '创建表t1_复制为从t1选择* 其中screatedate>=截止日期('2009-06-01','yyyy-mm-dd')`
    • 使用
      rename
      命令交换表
    • 将约束、索引重新应用于新T1
    • 要记住的另一件事是,删除比其他事务消耗更多的撤消,因为它们需要更多的信息来回滚。因此,如果您的记录很长和/或很多,那么DBA可能需要检查UNDO表空间(或者如果您仍在使用它们,则需要回滚seg)


      最后,你有没有做过调查,看看时间到底在往哪里走?DELETE语句只是另一个查询,可以使用常规的调优技巧来处理它们

      多谢各位。我有个问题。需要导出吗?如果我将需要的数据插入到临时表中,然后截断并插入回原始表中,可以吗??如果我走这条路有什么问题吗?谢谢。我有个问题。需要导出吗?如果我将需要的数据插入到临时表中,然后截断并插入回原始表中,可以吗??如果我这样做有什么问题吗?如果你试图删除的记录只是总数的一小部分,那么索引可能是有用的。如果要删除表的很大一部分,则查询可能会执行完整的表扫描,而不使用索引。其他可能会减慢速度的因素:触发器。是否有任何触发器在删除时触发。外键。如果存在级联外键,您可能会从该表中删除更多内容。谢谢。您的反馈索引可能会减慢速度,因为它需要从索引和表中删除。最好将Oracle中的函数应用于不变数据(文字、常量或绑定变量),而不是将函数应用于变量数据,如列值。调用to_date()会为每个exec花费一些CPU,而最快的方法是避免这样做。如果您试图删除的记录只是总数的一小部分,则索引可能会很有用。如果要删除表的很大一部分,则查询可能会执行完整的表扫描,并且不会删除