“索引”实验小例
由索引引出简单实验几例 ***********************************************声明************************************************ 原创作品,出自 深蓝的blog 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。 表述有错误之处
由索引引出简单实验几例
***********************************************声明************************************************
原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。
表述有错误之处,请您留言,不胜感激。
提醒:点击目录,更有助于您的查看。
*****************************************************************************************************
对之前的小例子重新归纳了一下,希望可以帮助对索引有进一步的理解。
【例1】数据量小不需建索引
//如果表的数据量很少,全表扫描和走索引成本相差很小,使用索引是不是就没有必要了。 实验操作: SQL> SELECT ENAME,JOB,SAL FROM SCOTT.EMP; //先找到一张小表以作实验,查看表中信息,只有14行 ENAME JOB SAL ---------- --------- ------ SMITH CLERK 800 ALLEN SALESMAN 1600 WARD SALESMAN 1250 JONES MANAGER 2975 MARTIN SALESMAN 1250 BLAKE MANAGER 2850 CLARK MANAGER 2450 SCOTT ANALYST 3000 KING PRESIDENT 5000 TURNER SALESMAN 1500 ADAMS CLERK 1100 JAMES CLERK 950 FORD ANALYST 3000 MILLER CLERK 1300 已选择14行。 SQL> SET AUTOTRACE ON SQL> SET AUTOTRACE TRACEONLY SQL> SELECT * FROM SCOTT.EMP WHERE ENAME='JAMES'; //全表扫描查找JAMES的信息 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 1 | 38 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- SQL> CREATE INDEX IND_EMP_ENAME ON SCOTT.EMP(ENAME); //为ENAME列建索引 SQL> SELECT * FROM SCOTT.EMP WHERE ENAME='JAMES'; //走列索引查找JAMES的信息 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_EMP_ENAME | 1 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------- //全表扫描成本是3%,走索引成本是2% //从以上实验发现,在表的数据量很小的情况下,全表扫描和走索引成本上相差不大。
【例2】全表扫描IO成本低于使用索引情况
************************************************************************** 举一个例子,不恰当的使用索引,比用全表扫描的的IO成本更加高。 ************************************************************************** 解答: 思路:创建一组rowid是散落在多个表数据块中的索引,这样由于索引列数据的分布情况和索引中的顺序差异很大,致使通过全表扫表比走索引更能降低IO的使用成本。 操作如下: SQL> CREATE TABLE TAB_HYL AS SELECT * FROM DBA_OBJECTS; //创建了一个TAB_HYL表以作实验 SQL> ANALYZE TABLE TAB_HYL COMPUTE STATISTICS; //分析这张TAB_HYL实验表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME ='TAB_HYL'; //查找出实验表上的行数、块数 NUM_ROWS BLOCKS ---------- ---------- 72606 1033 SQL> SELECT 72606/1033 FROM DUAL; //计算平均每个块中的行数为70行 72606/1033 ---------- 70.286544 SQL> DROP TABLE TAB_HYL PURGE; //删除这张表,这张表就是为了计算出每块所占的行数,从而对其进行构建完成实验 SQL> CREATE TABLE TAB_HYL AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM<=70; //重新创建实验表让它装入70行形成第一个块 SQL> INSERT INTO TAB_HYL SELECT * FROM TAB_HYL; //复制相同的70行插到实验表中,即实验表中共有140行数据,两个块 SQL> / //再次执行相同操作,但此时基准的实验表为140行,因此第三次插入了140行数据,即现在实验表有280行数据 SQL> / //按照上面的方法以下连续创建,形成多个块,让每个块中都有相同的键值而形成一组实验用的ROWID SQL> / SQL> / SQL> / SQL> / SQL> COMMIT; SQL> CREATE INDEX IND_H1 ON TAB_HYL(OBJECT_ID); //创建实验表中OBJECT_ID列的索引,之后通过该列值进行查询,来说明查询的成本 SQL> ANALYZE TABLE TAB_HYL COMPUTE STATISTICS; //分析一下实验表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME ='TAB_HYL'; //查看一下此时实验表的行数、块数已经达到实验准备条件,可以开始试验了 NUM_ROWS BLOCKS ---------- ---------- 8960 103 SQL> SET AUTOTRACE ON SQL> SET AUTOTRACE TRACEONLY //设定跟踪 SQL> SELECT * FROM TAB_HYL WHERE OBJECT_ID=70; //通过上面创建了索引的列来查找,得到下面的分析结果,记住cpu的成本为30,并且数据库自动完成的是走全表扫描,说明数据库已经判断出什么方式查询,成本更低了。 ---------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 128 | 10112 | 30 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| TAB_HYL | 128 | 10112 | 30 (0)| 00:00:01 | ---------------------------------------------------------------------- //之后我们人为让查询走索引再看一下分析结果。 SQL> SELECT /*+INDEX(TAB_HYL IND_H1)*/ * FROM TAB_HYL WHERE OBJECT_ID=70; //强制查询走索引,输出一下结果,看到成本是102,要远高于全表扫描的成本(全表扫描是30,见上表)。 ---------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time ---------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 128 | 10112 | 102(0)| 00:00:02 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB_HYL | 128 | 10112 | 102(0)| 00:00:02 | |* 2 | INDEX RANGE SCAN | IND_H1 | 128 | | 1(0)| 00:00:01 | ---------------------------------------------------------------------- 通过以上实验说明,当索引列数据的分布情况和索引中的顺序差异很大这种情况出现时,做索引范围扫描效率偏低。
【例3】构造表时集簇因子数分别为接近块数、接近行数
************************************************************************** 建两张表,各建一个索引。要求A表的索引集簇因子接近表块数,B表的索引集簇因子接近表行数。 ************************************************************************** (一)、创建A表:索引集簇因子接近表块数 操作: SQL> CREATE TABLE TAB_HYL AS SELECT * FROM DBA_OBJECTS; //先创建了一个TAB_HYL表以作实验源表,为了通过这个表分析出表中一个块所占的行数 SQL> ANALYZE TABLE TAB_HYL COMPUTE STATISTICS; //分析这张TAB_HYL实验表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME ='TAB_HYL'; //查找出实验表上的行数、块数 NUM_ROWS BLOCKS ---------- ---------- 72606 1033 SQL> SELECT 72606/1033 FROM DUAL; //计算平均每个块中的行数为70行 72606/1033 ---------- 70.286544 SQL> DROP TABLE TAB_HYL PURGE; //删除这张表 SQL> CREATE TABLE TAB_HYL AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM<=70; //重新创建实验表让它装入70行形成第一个块 SQL> INSERT INTO TAB_HYL SELECT * FROM TAB_HYL; //复制相同的70行插到实验表中,即实验表中共有140行数据,两个块 SQL> / //再次执行相同操作,但此时基准的实验表为140行,因此第三次插入了140行数据,即现在实验表有280行数据 SQL> / //按照上面的方法以下连续创建,这是为了构造实验表的集簇因子 SQL> / SQL> / SQL> / SQL> / SQL> COMMIT; SQL> CREATE TABLE TAB_A AS SELECT * FROM TAB_HYL ORDER BY OBJECT_ID; //根据实验表创建出表A,表A是通过OBJECT_ID排序的,因此就得到了键值相同的分布较集中的块 SQL> CREATE INDEX IND_H1 ON TAB_A(OBJECT_ID); //创建A表中OBJECT_ID列的索引 SQL> ANALYZE TABLE TAB_A COMPUTE STATISTICS; //分析一下A表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME = 'TAB_A'; NUM_ROWS BLOCKS ---------- ---------- 8960 102 SQL> SELECT BLEVEL,LEAF_BLOCKS,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,CLUSTERING_FACTOR 2 FROM USER_INDEXES 3 WHERE INDEX_NAME = 'IND_H1'; //查看A表索引列的b-tree级别、叶的块数、不同的key值、平均每个key所占的叶块的数量、聚集的因子 BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY CLUSTERING_FACTOR ------- ----------- ------------- ----------------------- ----------------- 1 18 70 1 102 //得到了A表索引列的集簇因子数(102)与上面的A表的块数(102)是相同的。 (二)、创建B表:索引集簇因子接近表行数 操作: SQL> CREATE TABLE TAB_HYL AS SELECT * FROM DBA_OBJECTS;//创建了一个实验表以作实验 SQL> ANALYZE TABLE TAB_HYL COMPUTE STATISTICS;//分析这张TAB_HYL实验表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME ='TAB_HYL';//查找出实验表上的行数、块数 NUM_ROWS BLOCKS ---------- ---------- 72606 1033 SQL> SELECT 72606/1033 FROM DUAL;//计算平均每个块中的行数为70行 72606/1033 ---------- 70.286544 SQL> DROP TABLE TAB_HYL PURGE;//删除这张表 SQL> CREATE TABLE TAB_B AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM<=70;//创建B表让它装入70行形成第一个块 SQL> INSERT INTO TAB_B SELECT * FROM TAB_B;//复制相同的70行插到B表中,即B表中共有140行数据,两个块 SQL> / //再次执行相同操作,但此时基准的B表为140行,因此第三次插入了140行数据,即现在B表有280行数据 SQL> / //按照上面的方法以下连续创建,这是为了构造B表的集簇因子 SQL> / SQL> / SQL> / SQL> / SQL> COMMIT; SQL> CREATE INDEX IND_H2 ON TAB_B(OBJECT_ID);//创建B表中OBJECT_ID列的索引 SQL> ANALYZE TABLE TAB_B COMPUTE STATISTICS; //分析一下B表 SQL> SELECT NUM_ROWS,BLOCKS FROM USER_TABLES WHERE TABLE_NAME ='TAB_B';//查看一下此时B表的行数、块数 NUM_ROWS BLOCKS ---------- ---------- 8960 103 SQL> SELECT BLEVEL,LEAF_BLOCKS,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,CLUSTERING_FACTOR 2 FROM USER_INDEXES 3 WHERE INDEX_NAME = 'IND_H2'; //查看B表索引列的b-tree级别、叶的块数、不同的key值、平均每个key所占的叶块的数量、集簇因子 BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY CLUSTERING_FACTOR ------- ----------- ------------- ----------------------- ----------------- 1 18 70 1 7070 //B表索引列的集簇因子(7070)和B表中的行数(8960)相对接近.
【例4】有关索引监控
************************************************************************** 对一张表的索引开监控,看是否有使用到。 ************************************************************************** 会话A: SQL> ALTER INDEX IND_H1 MONITORING USAGE; //对上面练习中用到的IND_H1索引开监控 SQL> SELECT * FROM V$OBJECT_USAGE; //通过查看V$OBJECT_USAGE视图查看对IND_H1索引的监控信息,MON为YES代表已经开监控了,当前没有人用到 INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING ------------------- ---------------------- --- --- ------------------- ------------------- IND_H1 TAB_A YES NO 03/18/2014 16:54:29 会话B: SQL> SET AUTOTRACE ON; //开监控,确认下面的操作是走索引的 SQL> SELECT * FROM TAB_A WHERE OBJECT_ID=70; //使用带索引列查询,分析结果如下 -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 128 | 10112 | 3 (0)| 00:0 0:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB_A | 128 | 10112 | 3 (0)| 00:0 0:01 | |* 2 | INDEX RANGE SCAN | IND_H1 | 128 | | 1 (0)| 00:0 0:01 | -------------------------------------------------------------------------------- 会话A: SQL> SELECT * FROM V$OBJECT_USAGE; //再次通过V$OBJECT_USAGE视图查看对IND_H1索引的监控信息,MON为YES代表已经开监控了,USE为YES代表当前有人在使用 INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING ------------------- ---------------------- --- --- ------------------- ------------------- IND_H1 TAB_A YES YES 03/18/2014 16:54:29
***********************************************声明************************************************
原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。
表述有错误之处,请您留言,不胜感激。
提醒:点击目录,更有助于您的查看。
*****************************************************************************************************

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Le numéro de série du disque dur est un identifiant important du disque dur et est généralement utilisé pour identifier de manière unique le disque dur et identifier le matériel. Dans certains cas, nous pouvons avoir besoin d'interroger le numéro de série du disque dur, par exemple lors de l'installation d'un système d'exploitation, de la recherche du pilote de périphérique approprié ou de la réparation du disque dur. Cet article présentera quelques méthodes simples pour vous aider à vérifier le numéro de série du disque dur. Méthode 1 : utilisez l’invite de commande Windows pour ouvrir l’invite de commande. Dans le système Windows, appuyez sur les touches Win+R, entrez « cmd » et appuyez sur la touche Entrée pour ouvrir la commande

Comment rédiger un générateur simple de rapports sur les performances des étudiants en utilisant Java ? Student Performance Report Generator est un outil qui aide les enseignants ou les éducateurs à générer rapidement des rapports sur les performances des élèves. Cet article explique comment utiliser Java pour rédiger un simple générateur de rapports sur les performances des étudiants. Tout d’abord, nous devons définir l’objet étudiant et l’objet note étudiant. L'objet étudiant contient des informations de base telles que le nom et le numéro de l'étudiant, tandis que l'objet score de l'étudiant contient des informations telles que les résultats des matières et la note moyenne de l'étudiant. Voici la définition d'un objet étudiant simple : public

Comment écrire un système de réservation en ligne simple via PHP. Avec la popularité d'Internet et la recherche de commodité des utilisateurs, les systèmes de réservation en ligne deviennent de plus en plus populaires. Qu'il s'agisse d'un restaurant, d'un hôpital, d'un salon de beauté ou d'un autre secteur de services, un simple système de réservation en ligne peut améliorer l'efficacité et offrir aux utilisateurs une meilleure expérience de service. Cet article explique comment utiliser PHP pour écrire un système de réservation en ligne simple et fournit des exemples de code spécifiques. Créer une base de données et des tables Tout d'abord, nous devons créer une base de données pour stocker les informations de réservation. Dans MonS

Les types d'index Oracle incluent : 1. Index B-Tree ; 2. Index Bitmap ; 3. Index de fonction ; 5. Index de clé inversée ; Index de connexion bitmap ; 10. Index composite. Introduction détaillée : 1. L'index B-Tree est une structure de données arborescente auto-équilibrée qui peut prendre en charge efficacement les opérations simultanées. Dans la base de données Oracle, l'index B-Tree est le type d'index le plus couramment utilisé. 2. L'index Bit Graph est basé sur un type d'index ; sur l'algorithme bitmap et ainsi de suite.

Comment écrire un jeu simple de démineur en C++ ? Minesweeper est un jeu de réflexion classique dans lequel les joueurs doivent révéler tous les blocs selon la disposition connue du champ de mines sans marcher sur les mines. Dans cet article, nous présenterons comment écrire un jeu simple de dragueur de mines en utilisant C++. Tout d’abord, nous devons définir un tableau bidimensionnel pour représenter la carte du jeu Minesweeper. Chaque élément du tableau peut être une structure utilisée pour stocker l'état du bloc, par exemple s'il est révélé, s'il y a des mines, etc. De plus, nous devons également définir

Comment écrire un système simple de recommandation musicale en C++ ? Introduction : Le système de recommandation musicale est un point névralgique de la recherche dans les technologies de l'information modernes. Il peut recommander des chansons aux utilisateurs en fonction de leurs préférences musicales et de leurs habitudes comportementales. Cet article explique comment utiliser C++ pour écrire un système simple de recommandation musicale. 1. Collecter les données des utilisateurs Tout d'abord, nous devons collecter les données sur les préférences musicales des utilisateurs. Les préférences des utilisateurs pour différents types de musique peuvent être obtenues via des enquêtes en ligne, des questionnaires, etc. Enregistrer les données dans un fichier texte ou une base de données

Introduction à l'utilisation de PHP pour développer des fonctions simples de gestion de fichiers : Les fonctions de gestion de fichiers sont une partie essentielle de nombreuses applications Web. Il permet aux utilisateurs de télécharger, télécharger, supprimer et afficher des fichiers, offrant ainsi aux utilisateurs un moyen pratique de gérer les fichiers. Cet article expliquera comment utiliser PHP pour développer une fonction simple de gestion de fichiers et fournira des exemples de code spécifiques. 1. Créer un projet Tout d'abord, nous devons créer un projet PHP de base. Créez le fichier suivant dans le répertoire du projet : index.php : page principale, utilisée pour afficher la table d'upload

Les solutions sont les suivantes : 1. Vérifiez si la valeur d'index est correcte : confirmez d'abord si votre valeur d'index dépasse la plage de longueur du tableau. L'index du tableau commence à 0, donc la valeur maximale de l'index doit être la longueur du tableau moins 1 ; Vérifiez les conditions aux limites de la boucle : si vous utilisez des index pour accéder au tableau dans une boucle, assurez-vous que les conditions aux limites de la boucle sont correctes ; 3. Initialisez le tableau : avant d'utiliser un tableau, assurez-vous que le tableau a été correctement initialisé ; 4. Utilisez la gestion des exceptions : vous pouvez utiliser le mécanisme de gestion des exceptions dans le programme pour détecter les erreurs lorsque l'index dépasse les limites du tableau. et gérez-le en conséquence.
