2.加where条件 where id is not null;
问:什么时候在表的非空列建有索引时,COUNT(*)语句用索引效率不如全表扫描
答:这张表只有一个字段,索引加rowid会比全表扫描还浪费资源
hint强制走索引,cost 213,明显比全表扫描大很多。
2.加where条件 where id is not null;
跟count(*)优化思路一致。所以建议设计表结构一定要注意null值。
TABLE ACCESS BY INDEX ROWID:回表
根据业务优化返回字段,如果返回值不多,可以考虑创建组全索引
外键表外键字段不创建索引会导致主表delete删除主键时卡住。
问:一张大表有一个字段创建为普通索引(没有重复值),如何快速把这个字段变为主键
alter table t add constraint t_id_pk primary key(id);
原理:主键就是生成一个与外键相关的约束,产生一个能保证唯一性的索引。
SQL> create table a as select * from dba_objects;
SQL> create index idx_a on a(object_id);
SQL> alter table a add constraint a_id_pk primary key(object_id);
SQL> create table b as select * from dba_objects;
SQL> insert into b select * from dba_objects;
SQL> create index idx_b on b(object_id);
SQL> alter table b add constraint b_id_pk primary key(object_id);
alter table b add constraint b_id_pk primary key(object_id)
ORA-02437: cannot validate (T1.B_ID_PK) - primary key violated
2.组合列返回数据量越少越高效。比如a=1,ab=2 跟a=1 and b=2返回条数差不多,就不推荐创建组合索引,反之可。
组合索引的两列,当一列是范围查询,一列是等值查询的情况下,等值查询列在前,范围查询列在后,这样的索引才最高效!
5.如果单列的查询列和联合索引的前置列一样,那单列可以不建索引,直接利用联合索引来进行检索数据
6、索引过多对insert,update,delete的影响
对 insert 语句的负面影响最大,百害而无一利,只要有索引,插入就慢,索引越多越慢!
对 delete 语句来说,有好有坏。在海量数据库中定位删除少数记录时,这个条件列是索引列显然是必要的,但是过多列有索引还是会有明显影响,因为其他列的索引也要因此被更新。在经常要删除大量记录的时候,危害加剧!
对update语句的负面影响最小,快速定位少量记录并更新的场景和delete类似,但是具体修改某列时却有差别,不会触及其他索引列的维护。
alter index 索引名 monitoring usage;
alter index 索引名 nomonitoring usage;
注:12c版本以上直接查v$index_usage_info
对技术感兴趣的同学,可以加入钉钉一起学习探讨