在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的功能索引。谷歌“甲骨文批量删除”,看看是否有什么可以帮助