首页 > 数据库 >PART1-Oracle关系数据结构-索引和索引组织表

PART1-Oracle关系数据结构-索引和索引组织表

时间:2024-07-24 15:54:37浏览次数:10  
标签:last name PART1 创建 数据库 索引 Oracle ID

3. 索引组织表

3.1. 索引概述

索引是与表或表簇关联的可选结构,有时可以加快数据访问速度。通过在表的一个或多个列上创建索引,在某些情况下,您可以从表中检索一小部分随机分布的行。索引是减少磁盘I/O的众多方法之一。
如果堆组织表没有索引,那么数据库必须执行全表扫描才能找到一个值。例如,没有索引的情况下,查询 hr.departments 表中 location=2700 的记录需要数据库搜索每个表块中的每一行。这种方法随着数据量的增加,扩展性很差。
打个比方,假设一位人力资源经理有一排纸箱。员工信息的文件夹随机插入这些箱子中。Whalen(ID 200)的文件夹在箱子1从底部数起第10个位置,而King(ID 100)的文件夹在箱子3的底部。为了找到一个文件夹,经理需要从箱子1的底部逐一查看每一个文件夹,然后逐个箱子查找,直到找到目标文件夹。为了加快查找速度,经理可以创建一个索引,按顺序列出每个员工ID及其文件夹位置:

ID 100: Box 3, position 1 (bottom) 
ID 101: Box 7, position 8 
ID 200: Box 1, position 10 . . .

类似地,经理可以为员工的姓氏、部门ID等分别创建独立的索引。这样,无论是按员工ID、姓氏还是部门ID查找,经理都可以通过相应的索引快速定位到所需的文件夹位置,而无需逐一查找每个文件夹。
一般来说,在以下任何情况下,都可以考虑在列上创建索引:

  • 索引列经常被查询 并且返回表中总行数的一小部分。
  • 索引列存在参照完整性约束。索引可以避免在更新父表主键、合并到父表或从父表删除时,所需的全表锁。
  • 在表上放置唯一键约束,并且您希望手动指定索引及所有索引选项。

3.1.1. 索引特征

索引是独立于其关联对象中的数据的逻辑和物理独立的模式对象。因此,可以在不实际影响索引表的情况下删除或创建索引。

注意:如果删除索引,应用程序仍然可以正常工作。然而,访问之前已索引的数据可能会变慢。

索引的存在与否不需要更改任何SQL语句的措辞。索引是一条快速访问单行数据的路径。它只影响执行速度。给定已索引的数据值,索引会直接指向包含该值的行的位置。

数据库在索引创建后会自动维护和使用这些索引。数据库还会自动将数据的更改(例如添加、更新和删除行)反映在所有相关索引中,无需用户执行额外操作。即使插入行,索引数据的检索性能仍保持几乎恒定。然而,表上存在过多索引会降低DML(数据操作语言)性能,因为数据库还必须更新这些索引。

索引具有以下属性:

  • 可用性:索引可以是可用的(默认)或不可用的。不可用的索引不会被DML操作维护,并且会被优化器忽略。不可用的索引可以提高批量加载的性能。与其删除索引后再重新创建,不如将索引设为不可用,然后重建它。不可用的索引和索引分区不占用空间。当您将一个可用的索引设为不可用时,数据库会删除其索引段。

  • 可见性:索引可以是可见的(默认)或不可见的。不可见的索引会被DML操作维护,但默认情况下不会被优化器使用。将索引设为不可见是替代将其设为不可用或删除它的一种方法。不可见的索引在删除前进行测试或临时使用索引而不影响整个应用程序时特别有用。

3.1.1.1. 索引键和列

键是可以用于构建索引的一组列或表达式。尽管术语经常互换使用,但索引和键是不同的。索引是存储在数据库中的结构,用户可以使用SQL语句管理它们。键严格来说是一个逻辑概念。

以下语句在示例表 oe.orders 的 customer_id 列上创建一个索引:

CREATE INDEX ord_customer_ix ON orders (customer_id);

在上述语句中,customer_id 列是索引键。索引本身被命名为 ord_customer_ix

注意:主键和唯一键会自动创建索引,但您可能需要在外键上创建索引。

3.1.1.2. 复合索引

复合索引,也称为连接索引,是在表的多个列上创建的索引。复合索引中的列应按照最适合查询检索数据的顺序排列,而不必在表中相邻。

复合索引可以加速 SELECT 语句中 WHERE 子句引用了所有或前导部分复合索引列的数据检索。因此,定义中列的顺序非常重要。一般来说,最常访问的列应放在前面。

例如,假设一个应用程序经常查询employees表中的last_namejob_idsalary列。并且假设last_name具有高基数,这意味着相对于表的行数,不同值的数量很大。您可以按以下列顺序创建索引:

CREATE INDEX employees_ix ON employees (last_name, job_id, salary);

访问所有三列、仅 last_name 列或仅 last_namejob_id 列的查询会使用此索引。在此示例中,不访问 last_name 列的查询不会使用该索引。

注意:在某些情况下,例如当前导列的基数非常低时,数据库可能会使用跳跃扫描(skip scan)来使用该索引。

如果每个索引的列排列方式不同,则同一张表可以有多个索引。如果指定不同的列排列顺序,可以使用相同的列创建多个索引。例如,以下SQL语句指定了有效的排列方式:

CREATE INDEX employee_idx1 ON employees (last_name, job_id); CREATE INDEX employee_idx2 ON employees (job_id, last_name);

3.1.1.3. 唯一和非唯一索引

索引可以是唯一索引或非唯一索引。唯一索引保证表中的任意两行在键列或键列组合中没有重复的值。例如,没有两个员工可以有相同的员工ID。因此,在唯一索引中,每个数据值只有一个行号(rowid)。叶块中的数据仅按键排序。

非唯一索引允许索引列或列组合中存在重复值。例如,employees 表中的 first_name 列可能包含多个 "Mike" 值。对于非唯一索引,行号(rowid)被包含在键中并按排序顺序排列,因此非唯一索引按索引键和行号(升序)排序。

Oracle数据库不会对所有键列均为NULL的表行进行索引,除非是位图索引或当簇键列值为NULL时。

3.1.1.4. 索引类型

Oracle 数据库提供了几种索引方案,提供了互补的性能功能。索引可以分类如下:

  • B-树索引
    这些索引是标准的索引类型。它们非常适合主键和高度选择性的索引。作为串联索引使用时,B-树索引可以按索引列排序检索数据。B-树索引有以下子类型:

    • 索引组织表(Index-organized tables)
      索引组织表与堆组织表不同,因为数据本身就是索引。
    • 反向键索引(Reverse key indexes)
      在这种类型的索引中,索引键的字节被反转,例如,103 存储为 301。字节的反转将插入分散到多个块中。
    • 降序索引(Descending indexes)
      这种类型的索引按降序存储特定列或列的值。
    • B-树簇索引(B-tree cluster indexes)
      这种类型的索引用于索引表簇键。键指向包含与簇键相关的行的块,而不是行。
  • 位图和位图连接索引
    在位图索引中,索引条目使用位图指向多个行。相反,B树索引条目指向单个行。位图连接索引是用于两个或多个表连接的位图索引。

  • 函数索引
    这种类型的索引包括通过函数(如UPPER函数)转换的列,或包含在表达式中的列。B树索引或位图索引都可以是函数索引。

  • 应用域索引
    这种类型的索引由用户为特定应用领域的数据创建。物理索引不需要使用传统的索引结构,可以存储在Oracle数据库中作为表,也可以作为文件存储在外部。

标签:last,name,PART1,创建,数据库,索引,Oracle,ID
From: https://www.cnblogs.com/crispy-bro/p/18320937

相关文章

  • 获取一行中字符串中第一个字符(五个正确字符中的第一个字符)的索引
    我正在尝试压缩我的代码(与朋友进行最少行数和字符挑战),但我遇到了问题。outputWord=""deftranslate(inp):output=[]words=inp.split()foriinrange(len(words)):outputWord=""curWord=words[i]ifcurWord[0]in("a","o",......
  • 如何解决 TypeError:列表索引必须是整数或切片,而不是 str
    我想建造一个刮刀。我写了这段代码,但它不断出错。如果有人可以提供帮助,我将不胜感激。deffetch_json(api_link,timeout=10):try:response=requests.get(api_link,timeout=timeout)ifresponse.status_code==200:returnresponse.js......
  • oracle大表性能优化
    1不修改表结构的优化1.1收缩表,降低高水位线ALTERTABLETESTENABLEROWMOVEMENT;ALTERTABLETESTSHRINKSPACE;1.2对表收集统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname=>user,tabname=>'TEST');END;1.3使用oracle的并行查询功......
  • Day8 字符串part1
    任务344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。思路这道题比较简单,只需用双指针法交换头尾的值,然后往中间缩进即可。注意......
  • Oracle 中 LISTAGG 函数的介绍以及使用
    原文地址:https://www.cnblogs.com/codeLearn/p/17931924.htmlLISTAGG函数介绍listagg函数是Oracle11.2推出的新特性。其主要功能类似于wmsys.wm_concat函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG使用listagg函数有两个参数: 1、要合并的......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 记录一下oracle 19c的集群节点移除、新增操作
    虽然掌握得不够深入,但越来越讨厌oracle数据库这个软件了,实在不愿意再孤岛这个笨重、复杂的oracle了。今天花了好几个小时操作一个实验环境的迁移、配置,记录几个步骤吧,也许后续会有用。■查看数据库配置信息[oracle@node1:0~]$srvctlconfigdatabase-dblikingdbDatabaseu......
  • Oracle 和 MySQL 介绍及适用场景
    Oracle和MySQL介绍及适用场景Oracle介绍OracleDatabase是甲骨文公司开发的一款关系数据库管理系统。Oracle数据库是目前市场上最流行的数据库之一,广泛应用于大型企业和复杂业务系统中。Oracle提供了全面的数据管理和分析功能,支持事务处理、大规模数据库管理、高并......
  • 第四十七天 第九章 动态规划part13 647. 回文子串 516.最长回文子序列
    647.回文子串 dp和双指针。dp[i][j]的含义:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。在确定递推公式时,就要分析如下几种情况。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的......
  • win10 下通过cmd 控制 Oracle Vbox
    win10下命令行控制VBox虚拟机今天虚拟机突然自己休眠了,各种按钮不能用,只能想其他办法了我的安装路径是C:\ProgramFiles\Oracle\VirtualBoxcdC:\ProgramFiles\Oracle\VirtualBox虚拟机的名称是Oracle强制关机C:\ProgramFiles\Oracle\VirtualBox>VBoxManage.execon......