ORACLE表、索引和分区

2023-05-16

ORACLE表、索引和分区

一、数据库表

 每种类型的表都有不同的特性,分别应用与不同的领域

  堆组织表

  聚簇表(共三种)

  索引组织表

  嵌套表

  临时表

  外部表和对象表

1.行迁移

建表过程中可以指定以下两个参数:

   PCTFREE:自由空间,默认值10

  PCTUSED(只适用于MSSM):默认值40

设置这两个参数很重要:

   一方面避免迁移过多的行,影响性能

   一方面避免浪费太多的空间 

当自由空间存不下更新后的某一行时,这一行将会发生行迁移,在两个块上存储这一行数据,如下图:

2.堆组织表

基本上我们使用的表都是堆组织表(heap organized table),堆是无序的数据结构,数据的存取都是随机的,想要排序必须使用order by子句

对于ASSM有三个重要的选项:

  PCTFREE

   INITRANS:默认值 2,高并发会设置更大一些 

  COMPRESS/NOCOMPRESS:启用/禁用压缩 

3.索引组织表(IOT

以索引结构存储的表

使用场景:

  信息检索

  空间数据

  OLAP应用

  创建,使用organization index子句:

create table tbl( name varchar2(20),  age int ) organization index

与堆组织表对比:

   提高缓冲区缓存效率,因为需要的块更少

  减少缓冲区缓存访问

  获取数据快,工作量少

  完成查询的物理I/O更少

  因为所有数据都放入索引,所以当表的数据量很大时,会降低索引组织表的查询性能 

4.散列聚簇表

 

  散列聚簇表与索引聚簇表非常相似,一个主要区别就是:聚簇索引被一个散列函数所取代,表中的数据就是索引,散列聚簇表会预分配(hashkeys/trunc(blocksize/SIZE))个块的存储空间,SIZE为设置的SIZE向上取最小的质数,hash冲突时会分配溢出块与原来的块连接起来

创建步骤:

  创建聚簇对象:create cluster hash_cluster(hash_key number) hashkeys 1000 size 1024;

   创建表: create table hash_table(x number, y varchar2(4000), z varchar2(400)) cluster hash_cluster(x);

注意:

  无法对散列聚簇中的表进行区间扫描来定位数据,需要建立传统索引实现

  建立散列聚簇表的目的是根据散列值快速定位数据,减少缓冲区缓存链闩,而不是平凡的全表扫描

  散列是CPU密集型操作,但索引所需的I/O会是散列的3倍,可以根据I/OCPU资源选择

5.有序散列聚簇表

有序散列聚簇不仅有散列聚簇的特性,还结合了IOT的一些性质

场景:

  按照某个键查询在按某一列排序

  select * from where key=:x order by sorted_column;

创建步骤:

  创建聚簇:create cluster shc(clust_id number, order_col number sort) hashkeys 100 hash is cust_id size 8192;

  创建表:create table cust_orders(clust_id number, order_col number, z varchar2(400)) cluster shc(clust_id, order_col);

6.对象表

一种基于Oracle类型的表

特点:

由于对象表实际上就是伪装的关系表,这么做与Oracle表功能没什么区别,但效率更高

创建:

create or replace type address_type as object(city varchar2(20), street varchar2(20));

create or replace type person_type as object(name varchar2(20), home_addr address_type, work_addr address_type);

create table people of person_type;

插入:

Insert into people values(‘ruphy’, address_type(‘gy’, ‘zunyi’), address_type(‘sz’, ‘bantian’));

查询:

Select name, p.home_addr home, p.work_addr work from people p;

7.嵌套表

 

创建:

create or replace type emp_type as object(empno number, ename varchar2(40), job varchar(9));

create or replace type emp_tab_type as table or emp_type;--对象表

create table dept(deptno number primary key, dname varchar2(40), emps emp_tab_type);

查询:

Select d.deptno, d.dname, emp.* from dept d, table(d.emps) emp;

插入:

Insert into table(select emps from dept where deptno = 10) values(123, ‘new’, ‘java’);

更新/删除

update/delete table(select emps from dept where deptno = 10) set job = ‘C#’;

8.临时表

可以使用临时表(temporary table)来保存事务或者会话内的临时结果集

特点:

  隔离性

  无并发性问题

  静态定义

  效率高,产生重做日志少

  可以有触发器、检查约束、索引,但不能有完整性约束、不能有嵌套列、不能是IOT、不能有聚簇、不能分区、不能使用analyze命令生成统计信息

类型:

  基于会话:create global temporary table temp_table_session on commit preserve rows ;

  基于事务:create global temporary table temp_table_session on commit delete rows ;

二、数据库索引

最好在应用设计期间考虑索引应该如何设计,不要事后才想起来,这样有助于清楚地知道需要建立什么样的索引

Oracle提供几种类型的索引:

  B*TREE索引

  T*TREE聚簇索引

  降序索引

  反向键索引

  IOT位图索引

  位图级联索引

  函数索引

  应用域索引

1.B*TREE索引

--类似于二叉树结构的索引,扩展性非常

 

分析一下几种情况:

  Where x between 20 and 30

  Where x = 10047

2.反向键索引
      --B*TREE索引键反转建立的索引

主要用途是减少“右手”索引中索引页块的竞争

创建: create index idx on t(x,y) reverse;

分析一下几种情况:

  Where x > 5

  Where x = 5

3.降序索引
      --B*TREE索引扩展,以从大到小的方式存储

主要用途是对多个列进行排序,且顺序要求不一致时使用降序索引可以避免数据库额外的排序

创建:create index desc_t_idx on t(owner desc, object_type asc)

分析:select * from t where owner between ‘T’ and ‘Z’ order by owner desc, object_type asc;

4.什么时候走B*TREE索引

两个“经验”:

  访问表中非常少的部分,到底多少与列数有关

  访问表中大量数据时,数据可以直接从索引中拿到(覆盖索引)

5.位图索引
      --位图索引是为数据仓库/即席查询设计

B*TREE索引不同,位图索引的一个索引键会指向多行数据

位图索引特别不适用于OLTP系统(平凡的更新)

创建:create bitmap index b_idx on t(owner);

位图索引对or and not会执行位操作,存储结构如下:

  

6.位图级联索引

在一个表上建立的索引基于另一个表的列(主键或者唯一键),将数据在索引中逆规范化

场景:销售部门多少人?谁在销售部工作?销售部业绩最好的三个人?

创建:create bitmap index ed_idx on emp(d.dname) from emp e, dept d where  e.deptno = d.deptno

 

7.什么时候位图索引

位图索引特别适用于低基数(相异基数低)

相异基数大小取决于结果集行数,相异基数与总行数之比趋近与0才算低相异基数,如2000行的表,相异基数为3,那么3/2000=0.0015很小,适合位图索引

系统会运行大量的即席查询,特别是查询会使用多列数据或者使用诸如count之类的聚合函数

 

8.函数索引

可以基于函数建立索引,本质上也是位图索引或者B*TREE索引的扩展

使用场景:

  通过计算结果建立索引,方便需要使用函数计算后比叫时能够立即用上

  不用修改任何逻辑或查询,就可以加快现有应用

  只对感兴趣的值键索引

创建:

create index f_idx on t(lower(owner));

create index f_idx on t(case owner when ‘PUBLIC’ then ‘PUBLIC’ end);

9.虚拟列索引

虚拟列

不占用存储过程,在查询表数据时sql函数动态计算的返回值,不超过6398字节

创建:alter table t add cal as (lower(owner));

可以在虚拟列建立一个索引,以提高查询效率

创建: create index v_idx on t(cal);

10.组合索引

联合索引时列的选择原则

  最左匹配原则

  最左匹配原则

  最少空间原则

创建如下索引

  alter table T add constraint id_key primary key (OBJECT_ID);

  create index u_idx on t(upper(object_type), owner);

  create index f_idx on t(owner);

分析:

  Select * from t where object_id = 5;

  Select * from t where owner = ‘SYS’;

  Select * from t where object_type = ‘INDEX’;

  Select * from t where upper(object_type) = ‘INDEX’;

  Select * from t where upper(object_type) = ‘INDEX’ and owner = ‘SYS’;

  Select count(*) from t;

11.不走索引原因

谓词不在组合索引的最前列(最前列值比较少也会走索引)

Select count(*) from t;有索引但没有索引列没有非空约束

Select * from t where f(x) = :x;对非函数索引列使用了函数

Select * from t where y = 5; (y为字符串)发生了隐式转换

查询的结果集超过了阈值

表上的统计信息不是最新的,dbms_stats.gather_table_stats(user, ‘T’);

将索引标记为invisible

三、数据库分区

分区将一个表或索引物理地分解为多个更小、更易管理的部分,使用了一种“分而治之”的方法,设用于管理非常大的表

注意,分区不一定能提高性能,会产生三种情况:

  应用可能运行更慢

  可能运行更快

  也可能没有任何变化

1.分区的优势

提高数据可用性(独立性)

将大段分解为小段,从而减轻管理负担

改善某些SQL语句(SIUD)性能性能(读取信息语句、修改信息语句(PDML))

把数据修改分散,减少并发下系统的竞争

实现数据滑动窗口(去除旧数据,加载新数据并建立索引,将新数据纳入分区表)

2.分区机制

区间分区(范围分区)

散列分区

列表分区

间隔分区:区间分区+自动创建分区

引用分区

间隔引用分区

虚拟列分区

组合分区

系统分区:比较少见

3.区间分区

创建:

create table range_t(range_key_column data not null, data varchar2(20)) partition by range(range_key_column)(partition part_1 values less than(to_date(‘20180101’, ‘yyyymmdd’)) ,partition part_2 values less than(to_date(‘20190101’, ‘yyyymmdd’)),partition part_3 values less(maxvalue));

4.散列分区

创建:

create table hash_t(range_key_column date, data varchar2(20)) partition by hash(range_key_column) (partition part_1 tablespace p1,partition part_2 tablespace p2);

5.列表分区

创建:

create table list_t(list_key_column varchar(2), data varchar2(20)) partition by list(list_key_column)(partition part_1 values('A', 'B'),partition part_2 values('C'));

6.虚拟列分区

创建:

create table res(res_code varchar(2), region as (decode(substr(res_code,1,1), 'A', 'NE', 'C', 'NE','B','SW','D','NW'))) partition by list(region)(partition p1 values('NE'), partition p2 values('SW'), partition p3 values('NW'));

7.组合分区

创建:

create table composite_t(range_c date, hash_c int, data varchar(2)) partition by range(range_c) interval (numtoyminterval(1, ‘year’)) subpartition by hash(hash_c) subpartitions 2 (partition p1 values less than(to_date(‘20180101’, ‘yyyymmdd’))(subpartition p1s1,subpartition p1s2), partition p2 values less than(to_date(‘20190101’, ‘yyyymmdd’))(subpartition p2s1,subpartition p2s2));

8.索引分区

 

本地索引:按表分区的方式对所有分区

  本地前缀索引

  本地非前缀索引

  创建: create index l_idx on t(owner, object_type) local;

全局分区索引:按区间或散列对索引分区

  创建:create index g_p_idx on t(owner, object_type, object_name) global partition by hash(owner) partitions 16;

全局索引

 

转载于:https://www.cnblogs.com/muphy/p/11595413.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORACLE表、索引和分区 的相关文章

  • GNOME 3.28 启用桌面图标

    原由 GNOME 3 28合并了移除桌面图标支持 Nautilus从此不在支持桌面图标 xff0c 直到找到新的解决方案 Issues地址 xff1a https gitlab gnome org GNOME nautilus issues
  • session和cookie的区别

    1 xff0c session 在服务器端 xff0c cookie 在客户端 xff08 浏览器 xff09 2 xff0c session 默认被存在在服务器的一个文件里 xff08 不是内存 xff09 3 xff0c session
  • Spring常用配置

    上篇文章我们简单介绍了Spring的基本配置 xff0c 算是一个简单的入门 xff0c 这篇文章我们再一起来看看Spring在使用的过程中一些其他的常见配置 Bean的Scope Spring中的Scope注解主要是为了解决Bean的实例
  • iOS开发网络篇 —— OC加载HTML代码

    html代码 图1 样式一 xff1a 34 lt p gt lt img src 61 34 upload image 20170609 1496978712941664 jpg 34 title 61 34 14969787129416
  • Python 安装与环境变量配置

    一 软件下载 Python安装包下载地址 xff1a https www python org 二 安装过程 xff08 略 xff09 三 环境变量配置 xff1a 方法一 xff1a 使用cmd命令添加path环境变量 在cmd下输入
  • USB串口导致鼠标乱跳

    近期在工控机上安装USB串口 xff0c 结果装上没几天 xff0c 就有反馈开机后鼠标乱跳 然后 xff0c 开始解决问题 环境 xff1a 工控机操作系统Windows 7专业版 xff0c USB串口Z TEK USB RS232 1
  • Minimum Depth of Binary Tree 二叉树的最小深度

    Given a binary tree find its minimum depth The minimum depth is the number of nodes along the shortest path from the roo
  • 【Android Studio】成功解决 “gradle project sync failed”

    更新Android Studio后报错 xff1a gradle project sync failed Basic functionality e g editing debugging will not work properly 网上
  • 我失败的程序员生涯

    我 xff0c 一个普普通通的人 普通本科毕业 xff0c 来到北京成为了一个普通的程序员 2013年 xff0c 我本科毕业 xff0c 然后就踏上了北漂的征程 来之前想的很清楚 北京技术发达先进 我可以在这里工作三四年 xff0c 学习
  • gdb+gdbserver远程串行协议[zz]

    转载地址 xff1a http blog sina com cn s blog 71ed04f70100qhxc html gdbserver debug remote debug mount hello Usage gdbserver O
  • python 远程关机_python实现微信远程电脑关机完整源码

    这是python实现微信远程电脑关机完整源码下载 xff0c 通过手机微信发送QQ邮件给sina邮箱 xff0c 然后利用python的pop3定时检查sina邮箱的邮件主题以及邮件来源 xff0c 并在电脑执行相应的命令行实现关机 软件介
  • html设计思路,网页设计思路7个方法

    网页设计思路7个方法 网页设计除了要设计的漂亮 xff0c 体验优秀 xff0c 还要让用户对网站难以忘怀 xff0c 这就需要设计师进行深入的思考 xff0c 通过更加走心的设计 xff0c 来抓住用户的心 毕竟没有哪个站长不想让自己的网
  • 安卓网络类型设置的实现

    工作背景 xff1a 公司出口国外某国的设备 xff0c 因为该国对4G认证要求较高 xff0c 流程非常麻烦 xff0c 客户不想取得4G方面认证 xff0c 因此订单机器设备需禁用4G xff0c 且不能手动恢复4G xff0c 默认3
  • 硬件虚拟化

    硬件虚拟化也称作完全虚拟化 在计算机科学中 xff0c 硬件虚拟化 xff08 英语 xff1a Hardware virtualization xff09 是一种对计算机或操作系统的虚拟 虚拟化对用户隐藏了真实的计算机硬件 xff0c 表
  • 计算机语言怎么学才学得好,如何正确开始学习计算机编程语言?

    原标题 xff1a 如何正确开始学习计算机编程语言 xff1f 俗话说 xff0c 好的的开始是成功的一半 学习编程语言任重而道远 xff0c 如何准备学习是一个很关键的问题 今天小助手给大家分享如何开始学习编程语言的建议 xff0c 希望
  • html中如何传递数组,如何将数组从select html元素组件传递到数组中具有不同值的两个文本组件...

    我正在尝试在选择值之后从select元素中获取价格值 例如股票描述 数字发票QT 售价 100 但是我已经写了下面的代码 当我运行它时 我会得到这个错误 销售价格返回 未定义 所以我非常感谢你能帮我 因为我整天都在上网寻找帮助 import
  • Codeforces Round #589 div.2 C,D

    感觉这一场的复杂度非常的玄学 也可能是我偷懒太长时间变菜了QAQ C 题意 给出 x n 求x质因子的从1到n的g i p 的连乘思路 求出x的每个质因子 直接连乘到n计算即可 code include lt bits stdc 43 43
  • 微信支付报调用支付JSAPI缺少参数: sign

    检查后台返回参数中没有paySign字段 转载于 https www cnblogs com muou2125 p 11604456 html
  • Windows下使用命令打开远程桌面

    如果在Windows系统下找不到 远程桌面 入口 xff0c 可以使用命令方式打开 方法如下 xff1a 在命令提示符中输入如下命令 xff1a start mstsc exe 如果感觉每次都输入命令太麻烦 xff0c 可以新建一个bat批
  • 设置input 中placeholder的样式

    webkit input placeholder Chrome Opera Safari position relative top 4px moz placeholder Firefox 19 43 position relative t

随机推荐

  • 如何为Redis中list中的项设置过期时间

    问题 两种解决方法 有序集合 多个集合以及TTL Redis是一个伟大的工具 xff0c 用来在内存中存储列表是很合适的 不过 xff0c 如果你想要快速搜索列表 xff0c 同时需要让列表中每项都在一定时间后过期 xff0c 应该怎么做呢
  • Python 函数的 return 是否是必须的?

    Python 函数的 return 是否是必须的 xff1f return 表达式 语句用于退出函数 xff0c 选择性地向调用方返回一个表达式 不带参数值的return语句返回None 来看一段关于 return 的描述 xff1a re
  • Flutter 获取控件尺寸和位置

    1 插件必须渲染好 final RenderBox box 61 globalKey currentContext findRenderObject final size 61 box size final topLeftPosition
  • kepserver中文手册,kepserver使用教程,kepserver设置

    下面介绍一下KepServer模拟器的使用 xff0c 以下示例使用服务器随附的 Simulator 驱动程序来演示创建 配置和运行项目的过程 Simulator 驱动程序是基于内存的驱动程序 xff0c 能为演示提供静态数据和变化数据 1
  • 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

    Here are 15 facts that EVERY GIRL should know about her vagina Don t be shy Your vagina is part of your body and it will
  • 生产者/消费者模式的理解及实现

    简介 生产者消费者模式并不是GOF提出的23种设计模式之一 xff0c 23种设计模式都是建立在面向对象的基础之上的 xff0c 但其实面向过程的编程中也有很多高效的编程模式 xff0c 生产者消费者模式便是其中之一 xff0c 它是我们编
  • ios如何翻外墙_华强北版本Airpods值得入手吗?如何避坑?

    和许多同行一样 xff0c 本该还是读书的年纪就来到华强北摸爬滚打 xff0c 已然过了78个年头 今天 xff0c 我们就来谈谈华强北版的Airpodspro是否值得入手以及入手如何避坑 对于华强北Airpods网上的评价褒贬不一 有的人
  • 《大数据时代》读书笔记

    大数据时代 英国人Viktor Mayer Schonberger的著作 最重要的一点是介绍了一种思维模式的变化 主要观点 xff1a 大数据是指获取全部数据样本 xff0c 分析全部数据 xff0c 而不是只做抽样分析 大数据分析更关注相
  • Spring中Bean管理的常用注解

    在Spring中 xff0c 主要用于管理bean的注解分为四大类 xff1a 1 用于创建对象 2 用于给对象的属性注入值 3 用于改变作用的范围 4 用于定义生命周期 这几个在开发中经常接触到 xff0c 也可以说每天都会遇见 其中创建
  • 解决Duplicate class xxx found in modules编译报错的问题

    如果在Android工程编译失败 xff0c 并出现如下错误 xff1a Duplicate class com mygroup mylib MyBean found in modules jetified baselib1 1 0 1 r
  • 课后作业3:个人项目(词频统计及其效能分析)

    1 个人信息 学号 xff1a 2017 7189姓名 xff1a 李博文码云地址 xff1a https gitee com libowena9 word frequency tree ES7189 2 程序分析 读取文件到缓冲区 def
  • IdentityServer4与ocelot实现认证与客户端统一入口

    关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了 ocelot与IdentityServer4组合认证博客园里也有很多 xff0c 但大多使用ocelot内置的认证 xff0c 而且大多都是用来认证A
  • JAVA: 接入YSDK遇到的问题

    JAVA后台接口 1 腾讯开放平台 http wiki open qq com wiki E9 A6 96 E9 A1 B5 2 YSDK介绍 大概流程 http wiki open qq com wiki YSDK E4 BB 8B E7
  • 红白黑球组合问题

    从3个红球 6个白球和7个黑球中 xff0c 任意取出8个球作为一组输出 xff0c 在每组中 xff0c 可以没有黑球 xff0c 但必须要有红球和白球 求总的组数以及每组的红球 白球 黑球的数目 思路 红球取值范围为1个到3个 xff0
  • 让我持续下去的理由

    牛仔裤 格子衬衫 运动鞋和双肩包 如果把这四个词放在一个人的身上 xff0c 似乎不用描述长相 xff0c 大家就对他的职业有了猜测 八成是个程序员吧 这个被笑称 月入五万过成月入五千样子 的群体 xff0c 以 收入高 脑回路简单 一成不
  • .NET程序集

    主要内容 64 将源代码编译为托管模块 64 将模块组合为程序集 64 共享程序集 xff08 强签名 xff09 概念阐述 64 将源代码编译为托管模块 1 在 NET框架里 xff0c 我们可以用任何支持CLR xff08 Common
  • android alertdialog横竖屏旋转_如何在哔哩哔哩做横竖屏直播

    哔哩哔哩 以下简称B站 xff0c 说到这个名字 xff0c 可能有些朋友比较陌生 xff0c 对于大多数的年轻人 xff0c 尤其是喜欢二次元文化的年轻人来说 xff0c B站是他们非常钟爱的直播平台 现在的B站已经不单单是一个视频网站
  • 读书小记--<态度>

    前言 前段时间再读了吴军老师的 态度 xff0c 分享的是和女儿的日常书信 觉得收获很多 xff0c 同事推荐他的 浪潮之巅 数学之美 系列书籍 下面是个人的觉得认同或值得深入学习的一些点 xff0c 特此记录一下 态度决定命运 文中写道撒
  • Oracle大表改为分区表及表空间切换方案

    Oracle大表改为分区表及表空间切换方案 一 背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快 xff0c 文件数量即将达到Oracle表空间的限制 xff0c 需要对表 没有分区 xff0c 有些表数据量多达几十亿
  • ORACLE表、索引和分区

    ORACLE 表 索引和分区 一 数据库表 每种类型的表都有不同的特性 xff0c 分别应用与不同的领域 堆组织表 聚簇表 共三种 索引组织表 嵌套表 临时表 外部表和对象表 1 行迁移 建表过程中可以指定以下两个参数 xff1a PCTF