Oracle 基础表管理(Heap-Organized Table Management)

news2024/10/2 10:38:34

表是数据库中负责数据存储的对象,在RDBMS中,数据以行、列的形式存储在表中。Oracle中表有很多种类型,最基础且应用最常用的类型就是堆表(Heap-Organized Table),本文列举了Oracle堆表的常用管理操作。

一、表的类型简介

数据可以有不同的组织形式,生命周期等特点,面对不同的数据存储场景需求,Oracle提供了很多类型的表,主要类型有:

  • 堆表(Heap-Oragnized Tables)
  • 索引组织表(Index-Organized Tables)
  • 分区表(Partitioned Tables)
  • 外部表(External Tables)
  • 聚簇表(Clustered Tables)

根据表的其他特点还可以划分出临时表(Temporary Tables)、不可变表(Immutable Tables),区块链表(Blockchain Tables)等。

而堆表(Heap-Organized Tables)是Oracle种最基础的数据存储对象,之所以叫做堆表是由于其底层存储的数据结构是堆(Heap,一种无序的数据集合)。当使用create table创建表时,默认创建的就是堆表。

二、表的创建方法

表在逻辑上由行(Row)和列(Column)组成,在创建一张表时,需要定义下列内容:

  • 表名
  • 一个或多个列(列的定义至少包含列名和数据类型,也可以从已有表复制定义)
  • 表的其他属性(分区、存储、类型等等),这些是可选项,如果没有特殊指定,Oracle会按默认配置创建表。

2.1 使用create table语句创建表

表由create table语句创建,创建一个最简单的表,只需要指定表名,列名(列的数据类型)即可:

create table mytab (
id int,
name varchar2(32));

在这里插入图片描述
上面示例中我们仅指定了最少信息,实际上表还有许多其他属性,可以用dbms_metadata.get_ddl来查询表的DDL语句:

select dbms_metadata.get_ddl('TABLE','MYTAB') from dual;

在这里插入图片描述
可以看到实际存储的定义比我们指定的复杂的多,由于很多属性没有显式指定,所以它们都是默认值:

  • 表名变成了hr.mytab,这里使用hr用户连接,因此表创建在该用户的默认schema中(create any table权限可以在别人的schema中创建表)。
  • int类型显示的是number(*,0),int实际是number的子类型,小数部分为0。
  • segment creation deffered,段延迟创建,即仅创建了表定义,实际存储数据的段会在第一条数据插入时才创建(可以节省空间,特别是存在大量小表的环境)。与之对应的选项是segment creation immediate, 创建表定义时,同时分配存储段。
  • pctfree 10 pctused 40 是数据块容量使用策略,普通用户不建议调整。
  • initrans 1 maxtrans 255 是事务数量管理
  • nocompress 表内数据不压缩
  • logging 表上操作的记录redo日志
  • tablespace “users” 表创建在users表空间

注:schema是Oracle为每个用户分配的一个对象逻辑容器(和用户名相同),当某个用户创建数据库对象时,默认就会创建在自己的schema中。你可以把它当作一个命名空间,不同schema中的同名对象不会冲突,可以使用schema.object_name的命名方式来引用对象。

除了让Oracle自动创建和管理数据段,还可以使用storage子句来自己指定表的物理存储属性(指定表的初始/最大大小):

create table mytab2 (
id int,
name varchar2(32))
storage (initial 12m next 4m maxsize 1G);

在这里插入图片描述

  • 这里使用storage子句指定表初始大小为12m,每次扩展大小为4m,最大为1G

2.2 复制已有表定义

create table …. as select ….; 语句可以复制一张已存在的表定义,这个语句包含2个部分,建表部分create table (DDL)和查询部分select(DML)。

下面语句从employees表复制一张employees_copy,仅复制表结构,不填充数据:

create table employees_copy as select * from employees where 1=2;

  • where 1=2 是一个永远无法成立的条件,所以不会复制数据,去除该条件则所有数据也将填充到新表中。
  • select * 代表复制所有的列,也可以显式的指定列名(复制过程中也可以修改列名),仅复制部分表结构。

2.2.1 使用nologging提升复制性能

使用create table … as select …; 语句复制一张表并填充数据时,如果表的数据量非常大,那么复制的操作可能给系统带来比较大的压力。在复制时使用nologging选项可以提升性能,nologging会减少数据复制时生成的redo日志(从源表复制数据,redo日志并不重要,就算操作失败了重新复制就行)。

而且nologging选项仅影响create table时数据复制操作(不影响表本身的logging属性),后续该表上的insert,update语句都会正常生成redo日志,不用担心崩溃时数据会丢失:

create table employees_copy2 as select * from employees nologging;

在这里插入图片描述

三、表基础维护

表在创建后经常随着业务需求进行调整,表的可变更选项非常多,这些变更选项可以在create table时指定,也可以在表创建完成后通过alter table修改。

3.1 新增/修改/删除/重命名列

列的定义通常是变更最频繁的,随着业务的需求的变化经常需要对列的属性进行修改。

3.1.1 新增列

alter table …. add [column] … 语句可以在表中新增列,新增时需要指定列的名称,数据类型等其他属性(和建表时相同)。当一个新的列被添加至表中,已有数据该列上的值都是null,你也可以指定default,为已有的数据填充默认值。

alter table mytab add salary number(8,2) default 1000;
alter table mytab add bonus number(8,2);

在这里插入图片描述

  • 示例为表mytab新增了salary和bonus列,其中salary列指定了默认值属性(默认1000)
  • 表中已有数据salary列都被更新为默认值1000,而bonus列全部为null

3.1.2 修改列

修改列是对已有数据列定义的更新,例如数据类型,大小,默认值等,语法和新增列基本相同,只是将关键字add替换为modify。

alter table mytab modify salary number(10,2) not null;

在这里插入图片描述

  • 示例将salary列的数据类型修改为number(10,2) 删除了default属性,新增了not null约束

3.1.3 删除列

通过 alter table … drop … 可以删除1个或多个列,删除列时,列的定义及数据都会被清除,存储空间会被回收,注意在大表此操作可能会影响性能:

alter table mytab drop column bonus;

在这里插入图片描述

3.1.4 重命名列

通过alter table …. rename column … to …语句可以重命名指定列,同时对该列上的依赖对象(函数索引,check约束等)Oracle也会自动进行更新并保持有效。

alter table mytab rename column salary to salary2;

在这里插入图片描述

3.2 不可用列

在3.1.3中提到,删除某列时会清除该列数据,如果表的数据量非常大,这个操作可能会占用大量系统资源,造成性能下降。Oracle提供了另一个折中的方案:先将列标记为不可用(逻辑删除),等待系统负载较轻时再清除数据(物理删除)。当列被标记为不可用时,它不会被select查询查出来,对于应用来说该列仿佛真的被删除了(你甚至可以重用列名)。

使用 alter table …. set unused … 将某1列或多列标记为不可用,注意列一旦被标记为不可用之后就无法恢复了,后续只能将其删除:

alter table mytab set unused(salary2);

在这里插入图片描述

  • 示例将salary2列标记为不可用,select语句不再能查出该列
  • 后续又新增了一个同名salary2列,也不会冲突

将列标记为不可用后,通过视图dba/all/user_unused_col_tabs可以查看表上不可用列的数量:

select * from user_unused_col_tabs where table_name='MYTAB';

在这里插入图片描述

待系统空闲时,使用 alter table … drop unused columns [checkpoint 300]; 物理清除该列的数据并回收空间(使用dorp column显式删除其他列时,不可用列也会被一并删除)。可选的checkpoint子句可以指定清理多少行执行一次检查点(示例中是300),防止在大表上操作时undo表空间过度扩张:

alter table mytab drop unused columns checkpoint 300;

在这里插入图片描述

  • 删除不可用列后,通过user_unused_col_tabs可以看到该列已经真正被删除了(清理数据)

3.3 隐形列

Oracle隐形列,可以将列对应用隐藏起来,但可以显式调用。例如应用升级前,可以预先对数据库升级,升级中新增的列设置为隐形,不影响当前应用。隐形列可以通过显式指定列名来查询和更新(select */ desc等命令不会显式)。和不可用列只能删除不同,隐形列你可以随意在隐藏和显示两种状态间切换。

隐形列的使用方法可以参考下面的文章:
Oracle 隐形列(Oracle Invisible Columns)

3.4 虚拟列

Oracle虚拟列是没有实际存储数据的,它的值是基于实体列计算而来,所以你不能更新虚拟列,但可以像正常的列一样查询它(虚拟列的值只有在查询时才会进行计算)。虚拟列只能在普通的堆表上使用,例如索引组织表,外部表,临时表等都是不支持虚拟列的。

虚拟列通过as关键字创建,以包含实体列的表达式定义(虚拟列不能引用其他虚拟列):

alter table mytab add salary number(8,2) default 1000;
alter table mytab add income as (salary*1.1);    -- 基于salary列的虚拟列

在这里插入图片描述

  • 示例中新增了实体列salary,随后基于salary新增了虚拟列income,并将值提升了10%

当实体列被虚拟列引用时是无法直接删除的,必须先删除虚拟列:

alter table mytab drop column salary;

在这里插入图片描述

  • 删除被虚拟列引用的实体列会报错

3.5 移动表至新表空间

用alter table … move [online] tablespace …可以将表移动至新表空间,新表空间可能放在不同的存储设备上,用于均衡I/O负载。online是可选关键字,如果指定则表上运行的DML语句在移动过程中不会被阻塞。

下面将表移动至新表空间new_tbs:

alter table mytab move online tablespace new_tbs;

在这里插入图片描述

  • 这里切换至sys用户,新建了new_tbs表空间(hr用户没权限)
  • 随后切换至hr用户,将表在线移动至new_tbs表空间

3.6 只读模式

alter table … read only/write 可以将表在只读/读写模式之间切换。当表在只读模式下,会禁止一切DML更新或截断表(truncate table),也不可以重命名或删除列,但是会允许新增/修改列,以及对索引,约束等不影响数据的对象进行操作。

对于一些配置表,若表中数据不经常变动,那么非常适合将其置于只读模式来防止程序对其进行意外修改:

alter table mytab read only;
alter table mytab read write;

在这里插入图片描述

四、闪回删除

Oracle在执行drop table命令时,并不会直接删除表,而是将其重命名并放入回收站(Recyclebin),如果用户发现误删,可以用闪回删除功能将表恢复(相关索引、约束、触发器等也会一并恢复)。注意只有在drop table命令才可以使用闪回删除,其他例如truncate table, drop user, drop tablespace这些操作都会直接清除表或数据。

闪回删除的具体操作方法可以参考下面文章:
Oracle闪回技术详解及应用

五、闪回表

闪回表的原理是利用undo日志,将整张表的状态(数据)回退到过去某个时间点/SCN/restore_point。该时间点之后的所有变更都会被撤销,而数据库其他的部分不受影响。闪回删除针对的是表这个对象误删除的闪回,而闪回表针对的是表内数据的闪回。

闪回表的具体操作方法可以参考下面文章:
Oracle闪回技术详解及应用

六、常用视图

Oracle提供了一系列数据字典视图,方便查询表的相关信息。视图以dba, all, user开头,分别代表全部/可查看/归属本用户的表信息,只是数据范围不同,部分常用视图列举如下:

  • dba/all/user_tables: 查询表的基本信息
  • dba/all/user_tab_columns: 查询列的基本信息
  • dba/all/user_tab_comments: 查询表和视图的备注信息
  • dba/all/user_col_comments: 查询表和视图的列的备注信息
  • dba/all/user_tab_statistics: 查询表的统计信息(优化器使用)
  • dba/all/user_unused_col_tabs: 查询表中被标记不可用的列

相关阅读:
Oracle分区表详解(Oracle Partitioned Tables)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PX4-AutoPilot教程-仿真环境架构】梳理PX4GazeboMAVLinkMAVROSROSROS2之间的关系

梳理PX4&Gazebo&MAVLink&MAVROS&ROS&ROS2之间的关系 PX4与仿真器PX4支持的仿真器PX4与除Gazebo之外的仿真器的连接PX4与Gazebo仿真器的连接 PX4默认的MAVLink UDP端口PX4 SITL软件在环仿真的架构Gazebo仿真PX4启动仿真的launch文件ROS与PX4的关系 PX4与仿真…

LeetCode 0938.二叉搜索树的范围和:深度优先搜索(可中序遍历)

【LetMeFly】938.二叉搜索树的范围和:深度优先搜索(可中序遍历) 力扣题目链接:https://leetcode.cn/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。…

《武汉市贯彻实施细则》解读房地产经纪活动时效性

时效性【当前有效】 为进一步规范我市房地产经纪活动,保护房地产交易和经纪活动当事人的合法权益,促进行业健康发展,制定《武汉市房地产经纪实施细则》(以下简称《实施细则》)。 (以下简称《实施细则》&am…

《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)

文章目录 5.1 理解 Docker Compose5.1.1 重点基础知识5.1.2 重点案例:部署 Flask 应用和 Redis5.1.3 拓展案例 1:多服务协作5.1.4 拓展案例 2:使用自定义网络 5.2 编排多容器应用5.2.1 重点基础知识5.2.2 重点案例:部署 Flask 应用…

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/136293833 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿…

用html编写的简易新闻页面

用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

内网穿透的应用-如何在群晖配置WebDAV实现云同步Zotero科研文献与笔记【内网穿透】

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…

linux下执行文件包含^M,将window文件格式内容转为linux格式

查看文件内容 cat -v jvm_options 报错信息 ./bin/install-plugin.sh: /bigdata/opt/s/seatunnelsgg/apache-seatunnel-2.3.4/mvnw: /bin/sh^M: bad interpreter: No such file or directory install connector : connector-selectdb-cloud安装工具 yum install -y dos2uni…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l)&#xff0c;头文件搜索路径&#xff0c;库文件搜索路径&#xff0c;连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前&#xff0c;我们首先来…

YOLOv9中的RepNCSPELAN4结构!

RepNCSPELAN4结构出炉啦&#xff0c;收藏起来写论文用&#xff01; 1.代码&#xff1a; 代码路径&#xff1a;yolov9-main->models->common.py&#xff0c;代码如下&#xff1a; class RepNCSPELAN4(nn.Module):# csp-elandef __init__(self, c1, c2, c3, c4, c51): # …

哪些行业适合做小程序?零售电商、餐饮娱乐、旅游酒店、教育生活、医疗保健、金融社交、体育健身、房产汽车、企管等,你的行业在其中么?

引言 在当今数字化时代&#xff0c;小程序成为了各行各业快速发展的数字工具之一。它的轻便、灵活的特性使得小程序在多个行业中找到了广泛的应用。本文将探讨哪些行业适合开发小程序&#xff0c;并介绍各行业中小程序的具体应用。 一、零售和电商 在当今数字化的商业环境中&…

聊聊 Go 边界检查消除

前言 在这篇文章中碰巧看到了Go边界检查消除相关的讨论. 我也借此简单聊聊. 有这样一段代码, 非常简单, 就是一段求向量点积的程序: func sum(a, b []int) int {if len(a) ! len(b) {panic("must be same len")}ret : 0for i : 0; i < len(a); i {ret a[i] * …

tab 切换页面

<template><divclass"syncData"v-loading"fullscreenLoading"element-loading-spinner"el-icon-loading"element-loading-background"rgba(0, 0, 0, 0.8)"element-loading-text"拼命加载中"><el-tabsv-model…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

C/C++有序数组中插入元素

一、不利用指针 代码&#xff1a; int i; void insert(int ,int , int ); int main() {int a[100];int n, m;cout<<"输入数组元素个数\n";cin >> n;cout << "输入数组元素\n";for (i 0; i < n; i) {cin >> a[i];}cout <&…

C语言里面的内存函数

1.memcpy函数 &#xff08;1&#xff09;函数的模拟实现&#xff0c;这个函数的作用就是把arr1拷贝到arr2里面&#xff0c;单位是字节&#xff0c;20字节就是5整 数&#xff0c;所以输出的就是1234500000&#xff1b; &#xff08;2&#xff09;之所以强制类型转换成为char*是…

高德地图与相机

高德地图与相机 1. 演示效果 2. 实现代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>高…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week04 (完结)

Week 04 of Advanced Learning Algorithms 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learning…