Détails de l'index Oracle (index)

1 Concept

1. 索引具有两个功能:
	(1) 强制实施 "主键约束""唯一性约束"
	(2) 提高性能
	
2. 提示:
	(1) 对于使用 where 子句的 selectupdatedeletemerge 语句而言,
	    索引可以起到辅助作用
	(2) 但对于 insert 而言,索引会降低处理速度。
	    原因:每次在表中插入一行时,必须在表的每个索引中插入一个新键。

2 Type d'index

2.1 Index de l'arbre B

1. B-Tree 索引(B 代表 "平衡(balanced)") 是一种树结构 -- 不是 "二叉树" 哦
2. 树的 '根节点' 指向 '第二级别' 的多个节点,'第二级别' 的节点又指向 '第三级别' 的多个节点,以此类推。
3. B-Tree 索引是 Oracle 默认的索引类型

Scénarios applicables à l'indice B-Tree:

1. 列的基数很大(不同值的个数很多)
2. 一般认为,如果查询要检索 "低于" 2%~4% 的行,'B-Tree 索引' 合适,
	        如果查询要检测 "高于" 2%~4% 的行,则 '全表扫描' 更快

Schéma de principe: Démonstration du processus de lecture du bloc de données
Insérez la description de l'image iciEtude de cas: Processus de positionnement de la valeur 82

  1. Lisez le nœud racine, jugez que 82 est compris entre 0-120 et prenez la branche gauche
  2. Lisez le nœud de branche gauche, jugez que 82 est compris entre 80-120, allez à la branche droite
  3. Lisez le nœud leat sur la droite, trouvez les données 82 et le rowid correspondant dans ce nœud
  4. Utilisez rowid pour lire le bloc de la base de données d'enregistrement dans la table physique (s'il s'agit de count ou sélectionnez rowid uniquement, vous n'avez pas besoin de lire cette fois)

Dans le cas ci-dessus:
1. Pendant tout le processus de positionnement d'index, le bloc de données n'est lu que 3 fois. Seulement 三次I/Oaprès le positionnement sur rowid.
2. Pendant tout le processus d'expansion, B-Tree lui-même peut toujours maintenir un équilibre, et la profondeur des nœuds Leaf peut toujours être cohérente. (Par conséquent “平衡树”)

2.2 Index Bitmap (bitmap)

Scène applicable:

1. 列的基数很小(不同值的个数少)
2. 列用于布尔代数运算(andornot

Schéma de principe:

Nom Le genre Carte d'identité (ID_Card) État matrimonial (matrimonial)
n1 Masculin 421… célibataire
n2 Femme 422… marié
n3 Femme 421… célibataire
n4 Masculin 422… divorce
n5 Femme 422… célibataire
。。。 。。。 。。。 。。。

Étude de cas: les requêtes suivantes sont disponibles

SELECT * FROM table t WHERE t.Gender = "女" AND t.Marital = "未婚";

Analyse de l'utilisation des index Full Table Scan FULL et B-Tree:

1. 不适用索引
	(1) 不使用索引时,数据库只能一行行扫描所有记录,然后判断该记录是否满足查询条件
	(2) 一般情况下,当取出来的数据超过表 2%~4% 时,比较合适

2. B-Tree 索引
	(1) 对于 "性别(Gender)",可取值的范围只有 '男','女',并且男和女可能各站该表的 '50%' 的数据,
	    这时添加 'B-Tree 索引' 还是需要取出一半的数据, 因此完全没有必要。
	(2) 相反,如果某个字段的取值 "范围很广,几乎没有重复",比如 "身份证号",使用 'B-Tree 索引' 比较合适
	(3) 事实上,当取出来的数据超过表 2%~4% 时,即使添加了 'B-Tree 索引', 
	    Oracle 也不一定会使用 'B-Tree 索引',很可能 Oracle 解析器认为 '全表扫描' 更加好

位图索引原理:

  • Si le sexe (Gender) établi dans la colonne 位图索引, pour le genre (Gender) la colonne, pour chaque ligne de rowid(rowid可以理解为每行的物理位置)formation de deux vecteurs, un index bitmap,
  • Homme: 10010, Femme: 01101
  • Parmi eux, 1: signifie homme, 0: signifie femme.
Rowid 1 2 3 4 5
Masculin 1 0 0 1 0
Femme 0 1 1 0 1

De même: l'index bitmap de l' état matrimonial est le suivant

Rowid 1 2 3 4 5
marié 0 1 0 0 0
célibataire 1 0 1 0 1
divorce 0 0 0 1 0

位图检索过程: (Et l'opération, tout 1 obtient 1)

Rowid 1 2 3 4 5
Femme 0 1 1 0 1
et
célibataire 1 0 1 0 1
résultat 0 0 1 0 1

3 Grammaire

Préparation des données: (indice: la clé primaire est livrée avec un index de contrainte unique: les valeurs en double ne sont pas autorisées)

CREATE TABLE odsdata.student_info (
   student_no VARCHAR2(10),
   NAME       VARCHAR2(30),
   sex        VARCHAR2(2),
   age        NUMBER(3)
);

ALTER TABLE odsdata.student_info ADD CONSTRAINT fk_student_info_student_no PRIMARY KEY(student_no);

Requête des informations de contrainte:

SELECT t.*
  FROM all_constraints t -- dba_constraints
 WHERE t.owner = 'ODSDATA'
   AND t.table_name = 'STUDENT_INFO';

3.1 Créer un index

grammaire:

create [unique | bitmap] index [schema.] 索引名
on [schema.] 表名 (列名1, .., 列名N);
-- 创建一般索引(B-Tree 索引)
CREATE INDEX odsdata.idx_student_info_name ON odsdata.student_info (name);

-- 创建位图索引
CREATE BITMAP INDEX odsdata.bidx_student_info_sex ON odsdata.student_info (sex);

3.2 Supprimer l'index

drop index [schema.] 索引名;

DROP INDEX odsdata.idx_student_info_name;

3.3 Modifier l'index

-- 修改索引名称 idx_student_info_name -> idx_student_info_new_name
ALTER INDEX odsdata.idx_student_info_name RENAME TO odsdata.idx_student_info_new_name;

-- 修改索引为无效
ALTER INDEX odsdata.idx_student_info_name UNUSABLE;

-- 重建索引
ALTER INDEX odsdata.idx_student_info_name REBUILD [ONLINE];

3.4 Index de requête

SELECT t.*
  FROM dba_indexes t -- all_indexes, user_indexes
 WHERE t.owner = 'ODSDATA'
   AND t.table_name = 'STUDENT_INFO';

4 extensions

Comment interroger les informations de l'index, telles que la hauteur?

> ANALYZE INDEX odsdata.idx_student_info_name VALIDATE STRUCTURE;
>
> SELECT t.* FROM index_stats t;

Je suppose que tu aimes

Origine blog.csdn.net/qq_34745941/article/details/83649859
conseillé
Classement