Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 sql中删除大型记录_Sql_Oracle_Sql Delete_Delete Row_Large Data - Fatal编程技术网

在oracle sql中删除大型记录

在oracle sql中删除大型记录,sql,oracle,sql-delete,delete-row,large-data,Sql,Oracle,Sql Delete,Delete Row,Large Data,我有KPI\u LOG表,其中包含600000记录,该表每次都在增长。我在这个表中有TIME\u STAMPcoulmn,它指定了创建记录的时间,我必须从这个表中删除超过2天的记录。我正在使用以下查询执行删除: 从KPI_日志中删除,其中SYSDATE-TIMESTAMP>2 但是由于记录的数量太多,如果我在这种情况下使用简单的Delete查询,将会花费很多时间。我正在寻找更快的删除为此目的,但没有找到任何解决方案 从KPI_日志中删除,其中SYSDATE-TIMESTAMP>2 如果删除的行数

我有
KPI\u LOG
表,其中包含
600000
记录,该表每次都在增长。我在这个表中有
TIME\u STAMP
coulmn,它指定了创建记录的时间,我必须从这个表中删除超过2天的记录。我正在使用以下查询执行删除:

从KPI_日志中删除,其中SYSDATE-TIMESTAMP>2

但是由于记录的数量太多,如果我在这种情况下使用简单的Delete查询,将会花费很多时间。我正在寻找更快的删除为此目的,但没有找到任何解决方案

从KPI_日志中删除,其中SYSDATE-TIMESTAMP>2

如果删除的行数更多,则保留在表中,则可以执行CTAS操作,即
创建表为select
,然后删除旧表并重命名新表

确保在
时间戳
列上有一个索引

比如说,

CREATE INDEX tmstmp_indx ON KPI_LOG(TIMESTAMP )
/

CREATE TABLE KPI_LOG_NEW 
  AS 
 SELECT * FROM KPI_LOG WHERE TIMESTAMP > SYSDATE -2
/

DROP TABLE KPI_LOG
/

ALTER TABLE KPI_LOG_NEW RENAME TO KPI_LOG
/
确保在新表上创建了所有必要的索引和约束


删除行不会重置高水位线,通过执行CTA,您将拥有一个新表。因此,您不必扫描高水位线以下的所有行(删除记录时会这样做)。

删除记录需要事务日志记录。这是一致性的组成部分

这也意味着删除记录远不便宜——在这种情况下,当一条语句删除数十万行时,这些行中的每一行都需要先写入事务日志。当您不想删除所有记录时,没有办法解决此问题


如果可能,您可以更频繁地调用delete命令-删除时所用的总时间不会有太大变化,但每个命令所用的时间会短得多(只要您有适当的索引)。

如果您有一个ID作为主键,其数据按升序排列(例如序列),可以在要删除的间隔内选择该ID列的最小值和最大值

然后数据库引擎不必比较日期,而是比较主键值

没有更快的方法,因为主键是聚集索引,这意味着记录在服务器上物理上彼此相邻


要做到这一点,您需要PL/SQL块。

我首先要看的是……1。您的时间戳列上有索引吗?,2。测试“timestamp-2”3的功能索引。谷歌“甲骨文批量删除”,看看是否有什么可以帮助