簡體   English   中英

提高oracle刪除查詢性能

[英]improve oracle delete query performance

這是我的查詢,我計划以大約5000的批次運行它,因此rownum <5000

delete my_table
where  rownum < 5000 
and    type = 'Happy'
and    id not in 
       ( select max_id
         from   ( select max(log_id) max_id
                  ,      object_id
                  ,      type
                  from   my_table
                  where  type = 'Happy'
                  group
                  by     id
                  ,      type
                )
        )

我想刪除快樂記錄,但保留每個對象ID的最大日志ID

我希望這是有道理的。

我應該使用某種聯接來提高性能嗎?

我認為這可能會以相關子查詢的形式運行得更快:

Delete
    from my_table
    where type = 'Happy' and
          exists (select 1
                  from my_table t2
                  where t2.object_id = my_table.object_id and
                        t2.type = my_table.type and
                        t2.id > my_table.id
                 );

然后, my_table(object_id, type, id)上的索引my_table(object_id, type, id)也可能有助於此查詢。

由於您只想刪除類型='Happy'的任何5000條日志條目,只要它不是任何object_id的最新條目,那么您可以執行以下操作:

delete
from my_table
where log_id in (
    select log_id from (
        select log_id, 
            row_number() over (partition by object_id order by log_id desc) rnk
        from my_table
        where typ = 'Happy' 
        and rownum <= 5000
    )
    where rnk > 1
)

這與您所擁有的不同,因為在您的方法中,您仍然需要計算整個表中每個對象的max(id),這是不必要的(日志表可能會變得非常大)。 您只需要確保不刪除5000個批處理行中的“最新”行(每個對象)即可。 就個人而言,我更喜歡使用分區來設置日志表,但並非每個人都具有此選項。

希望能有所幫助。

您可以將查詢簡化為:

delete my_table
where  rownum < 5000 
and    type = 'Happy'
and    id not in (select   max(log_id) max_id
                  from     my_table
                  where    type = 'Happy'
                  group by object_id, type)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM