首页 > 解决方案 > 删除分区后,索引变得不可用,我该怎么办,

问题描述

由于我按月对目标表进行了间隔分区,并且只保留 27 个月的数据(因此需要每月删除最旧的分区)。在我使用下面的 SQL 删除它之后,我运行了 SP,SP 非常慢。

alter table target_table drop partition target_eldest_partition;

所以我取消了SP并分析了表格

ANALYZE TABLE target_table  COMPUTE STATISTICS;     

但它遇到了一个错误

Error starting at line : 12 in command -
ANALYZE TABLE per_limra COMPUTE STATISTICS
Error report -
ORA-01502: index 'target_index' or partition of such index is in unusable state
01502. 00000 -  "index '%s.%s' or partition of such index is in unusable state"
*Cause:    An attempt has been made to access an index or index partition
           that has been marked unusable by a direct load or by a DDL
           operation
*Action:   DROP the specified index, or REBUILD the specified index, or
           REBUILD the unusable index partition

所以我google了一下,有一些问题,请帮忙。

问题1:ANALYZE TABLE 不会重建索引,对吧?

问题2:索引错误原因,是什么*Cause: ........ by a direct load意思?

问题3:背景,实际上我的目标表的索引现在通过下面的SQL检查不可用。

SELECT owner, index_name, tablespace_name
FROM   dba_indexes
WHERE  status = 'UNUSABLE';

我在使用以下 SQL 创建分区表时创建了索引

  CREATE INDEX "schema_name"."target_index1" ON "schema_name"."target_table" ("col1") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "target_tablespace" ;

我知道在使用分区表时,索引有两种类型,全局索引和本地索引,我的索引定义属于什么?似乎我没有使用分区索引,因为我在这里没有找到我的目标表分区名称。在此处输入图像描述

在此处输入图像描述 问题4:如何解决索引不可用的问题,我需要一个成熟的解决方案,在我删除分区后。

问题5:我的目标表有5000万条数据,每个月大概有190万条,所以我认为使用DBMS_STATS.GATHER_TABLE_STATSANALYZE TABLE target_table COMPUTE STATISTICS 更新统计信息是必要的,但是太慢了,有什么其他的解决方案。

请帮忙指教。谢谢。

标签: oracleindexingpartitioning

解决方案


  • ANALYZE TABLE 不会重建索引,对吧?

    我不知道,但现在你应该使用DBMS_STATS.GATHER_TABLE_STATS而不是ANALYZE TABLE

  • 直接加载意味着数据不是逐行插入,而是作为批量插入,请参阅直接路径加载

  • 如果您的索引变为UNUSABLE,那么它必须是全局索引。

  • 使用该UPDATE GLOBAL INDEXES子句,即alter table target_table drop partition target_eldest_partition UPDATE GLOBAL INDEXES;或创建本地索引。

  • 取决于您索引了哪些列。您也可以运行而不是整个表DBMS_STATS.GATHER_INDEX_STATSDBMS_STATS.GATHER_TABLE_STATS您还可以仅指定单个分区甚至单个列。

顺便说一句,对于许多问题,我的回答实际上应该是:“您是否查阅过 Oracle 文档”?或“你知道谷歌”吗?根据您的屏幕截图,您为用户对象使用模式SYS和表空间SYSAUX。你不应该那样做。创建您自己的用户并在此架构中创建任何对象。

一般来说,有三种类型的分区索引:

  1. 全局索引:您有一个跨越整个表的大索引。如果索引列不是分区键的一部分,则这是强制性的,例如 UNIQUE INDEXES。实际上这样的索引是没有分区的。(如图所示ALL_INDEXES
  2. LOCAL INDEX:此索引的分区方式与基础表相同。每个表分区都有一个相应的索引分区。
  3. PARTITIONED INDEX:此索引已分区但与基础表不同。我认为甚至可以在非分区表上创建分区索引。分区索引仅限于非常特殊的用例。实际上我无法想象这样的索引在哪里有意义。

推荐阅读