oracle - 删除分区后,索引变得不可用,我该怎么办,
问题描述
由于我按月对目标表进行了间隔分区,并且只保留 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_STATS
或ANALYZE TABLE target_table COMPUTE STATISTICS
更新统计信息是必要的,但是太慢了,有什么其他的解决方案。
请帮忙指教。谢谢。
解决方案
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_STATS
。DBMS_STATS.GATHER_TABLE_STATS
您还可以仅指定单个分区甚至单个列。
顺便说一句,对于许多问题,我的回答实际上应该是:“您是否查阅过 Oracle 文档”?或“你知道谷歌”吗?根据您的屏幕截图,您为用户对象使用模式SYS
和表空间SYSAUX
。你不应该那样做。创建您自己的用户并在此架构中创建任何对象。
一般来说,有三种类型的分区索引:
- 全局索引:您有一个跨越整个表的大索引。如果索引列不是分区键的一部分,则这是强制性的,例如 UNIQUE INDEXES。实际上这样的索引是没有分区的。(如图所示
ALL_INDEXES
) - LOCAL INDEX:此索引的分区方式与基础表相同。每个表分区都有一个相应的索引分区。
- PARTITIONED INDEX:此索引已分区但与基础表不同。我认为甚至可以在非分区表上创建分区索引。分区索引仅限于非常特殊的用例。实际上我无法想象这样的索引在哪里有意义。
推荐阅读
- reactjs - 两个循环的 React tic-tac-toe 教程增强
- sql - 我错过了这个 CASE WHEN 语句的语法是什么?
- azure - 如何在液体模板中解析科伦分隔的数据
- outlook - Outlook office-js 如何转发选定的电子邮件并添加收件人
- svelte - Svelte 组件没有从数组单个值中获取值?
- linux-kernel - 我可以指定在 Linux 内核中使用的 dma 物理地址,而不是使用 DMA API 请求一个吗?
- asp.net - ASP.NET Core 2.2 WebApi 状态码 415 上的身份验证错误
- laravel - CORS 策略已阻止从源对 X 的 XMLHttpRequest 的 CORS 访问
- reactjs - 如何关闭 CSVToHtmlTable 库中的标题功能
- r - googleway,雷达参数现在已弃用