问题描述:
A表 create table as B表
其中A表有索引,B表没有索引(因为create table只建表和传数据,约束和索引不连同创建)
现在将B表数据再insert into 回来A表(A表清空状态下)
此时A、B两张表数据一致,A表有索引,B表没索引,但是发现B表关联查询很快,A表关联查询很慢,怀疑没有走索引
尝试解决
1. 第一次尝试
重建A表中所有索引
alter index XXX rebuild;
2. 第二次尝试并成功:
因为第一次create table as B 把有索引的数据带过去了,所以B表查询很快,但是将B表insert回来时,由于B表没有索引,所以insert 回来的表数据中不带索引,必须得更新统计信息,才能将索引挂到数据上面,即使重建索引也不会生效
- 解锁用户
call DBMS_STATS.UNLOCK_schema_STATS('user_name');
- 更新统计信息
ANALYZE TABLE table_name COMPUTE STATISTICS; --分析表
ANALYZE TABLE table_name COMPUTE STATISTICS FOR ALL INDEXED COLUMNS; --分析索引列
ANALYZE TABLE table_name COMPUTE STATISTICS FOR ALL INDEXES FOR ALL INDEXED COLUMNS; --分析索引和索引列
- 锁表
CALL DBMS_STATS.LOCK_TABLE_STATS('user_name','table_name');