我们可以从分区中删除一些行,而不是遍历大表的所有记录吗?

时间:2020-04-17 09:33:29

标签: sql database oracle plsql

我是SQL和数据库世界的新手,我遇到了这种情况:

我每天都有一个分区表:每天创建一个分区,并收集当天添加的所有行。

但是现在由于数据库的大小越来越大,我们正在尝试减少数据量,因此我们决定根据某些条件删除一些行。

我们想要做的是:仅删除最近两天的一些未使用数据行。 所以我的问题是:

我们可以从分区中删除一些行吗?如果是这样,它会从实际表中删除数据并释放一些空间吗? 示例:

  delete from MyTable where condition1 and time >= (sysdate -2) ;
  -- is it the same as (from a performance perspective)
  delete from Mytable partition (MyTble_Partition) where condition1; 

在这种情况下是否需要在删除某些行后对索引进行碎片整理或重建?

如果我说的是愚蠢的话,请纠正我。 感谢您的指导,谢谢。

1 个答案:

答案 0 :(得分:0)

主要规则:您几乎永远没有理由显式访问分区。
谓词(join \ where条件)必须向数据库提供所有必需的信息,以便仅将正确的目标定位到所需的分区。
如果您要删除最近两天的某些数据,则可以,通过时间> =谓词即可。 Oracle仅扫描所需的分区。
您不需要重建索引。这项工作将由DBMS完成。

您的下一个问题-清除数据以留出更多空间。这有点棘手。
您必须将表的每个分区想象成DB中的“独立表”。
在很多方面都是。
删除时,硬盘上没有任何可用空间。您只需在表中获得一些“可用空间”。您可以将此空间用于进一步的插入。
但是(注意!)您必须知道您确实将来希望在“该旧日”分区中添加一些记录。
如果不是这样,那么您从DELETE中得不到任何好处。完全没有

Also read this article to understand how to free real disk space after table rows deleting

相关问题