【问题标题】:deletion of data older then 90 days in procedure在程序中删除超过 90 天的数据
【发布时间】:2021-03-03 06:09:42
【问题描述】:

您能否建议,需要对超过 90 天的数据进行清理程序。

我们需要从 J_DOC 表创建 TEMP TABLE WILL HAVE 记录超过 90 天和 STATUS SENT。

create table TEMP_ID_STAT_TIME_FRM_JOB_DOC as select JOB_ID, last_update_time_utc, status from J_DOC where 
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 90 and status='Sent'; 

total records are: 4659140
select count(*) from TEMP_ID_STAT_TIME_FRM_JOB_DOC;
4659140

so we have created index on JOB_ID column to perform deletion operations faster any suggestion for faster performance:-

CREATE INDEX JOB_ID_INDEX 
ON TEMP_ID_STAT_TIME_FRM_JOB_DOC(JOB_ID);


CREATE INDEX JOB_ID_INDEX_JOB_DOC
ON J_DOC(JOB_ID);

CREATE INDEX JOB_ID_INDEX_HUB_SIG
ON HUB_SIG(JOB_ID);

we need to first delete from hub_sig table for records older than 90 days and STATUS SENT 

 delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC);
  
after that we need to delete from main table J_DOC table

delete from J_DOC
 where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC);

请建议我们可以包括哪些更快的删除操作,以及当天工作完成后
我们需要将此临时表重命名为 TEMP_JOB_ID_FROM_J_DOC_1119

我们需要在程序中包含所有这些步骤,请建议。

【问题讨论】:

  • 您说“更快”,但没有描述任何性能问题。您是否对您的删除语句运行了解释计划?
  • 每个删除语句需要多长时间,您的目标是什么。你能分享一下解释计划吗?
  • 顺便说一句,对于您展示的用法 - 如果这是一个重复操作,您应该为您的“临时”表使用全局临时表 (GTT)。无需反复删除和重新创建它。
  • @BarbarosÖzhan - 请不要建议人们在未提醒他们在企业版上额外收费的情况下使用分区。我们不想误导人们违反他们的 Oracle 许可证。 (它免费包含在 Oracle 18c XE 中,但很少用于生产平台。)

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

你根本不需要临时表!

对于 otherHUB_SIG 使用 delete 语句,该语句直接从 masterJ_DOC 获取 job_id 使用 delete 谓词

delete from HUB_SIG where JOB_ID in 
(select JOB_ID from J_DOC
 where LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 90 and status='Sent')

您需要一个使用HASH JOIN 和两个全表扫描 的执行计划,类似于下面的计划。这是您应该处理大部分表格的方式(如果您处理几行,索引很有用!)

---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT    |         | 97945 |  3825K|       |   597   (1)| 00:00:08 |
|   1 |  DELETE             | HUB_SIG |       |       |       |            |          |
|*  2 |   HASH JOIN SEMI    |         | 97945 |  3825K|  2392K|   597   (1)| 00:00:08 |
|   3 |    TABLE ACCESS FULL| HUB_SIG | 97945 |  1243K|       |    92   (0)| 00:00:02 |
|*  4 |    TABLE ACCESS FULL| J_DOC   |   104K|  2767K|       |   193   (2)| 00:00:03 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("JOB_ID"="JOB_ID")
   4 - filter("STATUS"='Sent' AND "LAST_UPDATE_TIME_UTC"<=TRUNC(SYSDATE@!)-90)

J_DOC 删除更简单,使用WHERE 子句中删除行的标准

delete from J_DOC  
where LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 90 and status='Sent' 

再次不需要索引,将完成一次全表扫描

----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |       |   104K|  1434K|   193   (2)| 00:00:03 |
|   1 |  DELETE            | J_DOC |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| J_DOC |   104K|  1434K|   193   (2)| 00:00:03 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter("STATUS"='Sent' AND "LAST_UPDATE_TIME_UTC"<=TRUNC(SYSDATE@
              !)-90)

当然,正如其他人所评论的,如果您获得了分区的许可,请重新组织您的表使用它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多