数据库小技能:Oracle基础【中篇】

简介: 提高数据库运行效率的方法:从数据库系统级优化、数据库设计级优化和程序实现级优化。

引言

QPS: 请求进入的速度
并发数: 系统中同时存在的请求数
并发数 = QPS * 耗时

I 锁

什么是锁?
锁(lock)机制用于管理对共享资源的并发访问。

1.1 锁定数据行

for update for update nowait 是对操作的数据行进行加,在事务提交前防止其他操作对数据的修改。

锁定了emp表中id=1的那行数据
select * from emp  where emp.id=1 for update nowait
--通过for update锁定后,这些行不能修改了,但是还可以查询。
--for  update wait n (n是时间,单位:秒),即会等待n秒。
  • 使用for update锁定行,对这行执行update,delete,select , for update语句都会阻塞,即等待锁的释放后继续执行。
  • 使用for update nowait锁定行,对这行执行update,delete,select , for update语句,会马上返回一个“ORA-00054:resource busy”错误,不用一直等待锁的释放后继续执行.

1.2 锁类型

  1. DML锁:用于确保一次只能修改某一行,而且别人不能删除你正在处理的表, DML锁包括
  • 事务锁(TX锁),事务发起第一个修改时会得到TX锁,而且会一直持有这个锁,直至事务commit或者rollback
  • DML Enqueue (TM)锁:用于确保在修改表的数据时,表的结构不会改变,当更新了一个表的数据时,你就会得到这张表的一个TM锁
  1. DDL锁:DDL操作过程中会自动为对象加DDL锁,保护这些对象不会被其它会话修改。
  2. latch:轻量级的串行化设备,用于协调对共享数据结构、对象和文件的多用户访问。 这是Oracle的内部锁,用于协调对其共享数据结构的访问,Latch用于保护某些内存结构,如数据库快缓冲区或共享池中的库缓存。
  3. 乐观锁: 给表加一个version字段,保存数据行的版本。查询时,得到version的值,假设为100。通过类型下面语句保存
   update emp set value=500
   where id=1 and version=100
--   如果更新条数等于1,说明保存成功,更新version值加1。
--如果更新条数等于0,说明保存失败,说明有其它用户修改了这条记录。
  1. 悲观锁: 数据库级别的解决办法,从而有效的保证的数据的正确性;通过各种途径操作数据库(java项目,pl/sql developer…),都会得到很好的保护。
悲观锁性能差,不能并发操作,只能排队等待处理。实际上,查询的操作完全可以并发处理的。

可移植性差,依赖于特定数据库,而且并不是所有数据库提供悲观锁。

II 事务

事务是包含一系列步骤的完整操作。https://kunnan.blog.csdn.net/article/details/128387690

2.1 事务ACID特性

  1. 原子性(atomicity):事务的所有步骤,要么都成功,要么都失败。
  2. 一致性(consistency):事务将数据从一种一致状态转变为下一种一致状态。
  3. 隔离性(isolation):一个事务的执行不能被其他事务干挠,在该事务提交之前对其它事务都不可见。
  4. 持久性(durability):事务一旦提交,其结果就是永久性的。

2.2 事务控制语句

commit:提交事务,将事务期间所做修改保存。
rollback:回滚事务,撤销事务期间所做的修改。
savepoint:在事务中创建“标记点”,可以回滚到这些标记点。
rollback to :回滚到标记点,而不回滚标记点之前的修改,rollback to savepoint不会结束事务。
set transaction:设置事务属性,如事务的隔离级别以及事务是只读还是可读写的。

III 关系

关系是笛卡尔积的有限子集, 三元组表示关系R<U,F>,关系作为一张二维表,对他有一个最起码的要求,即每一个分量(元组)必须是不可分的数据项。满足这一条件的关系模式就属于第一范式。
三种类型:

  • 基本表:实际存在的表,它是实际存储数据的逻辑表示。
  • 查询表:查询结果对应的表
  • 视图表:由基本表或其他的视图表导出的表,是虚表,它不对应实际存储的数据。

原文链接:https://blog.csdn.net/z929118967/article/details/128468792

3.1 表

  • 表:由行和列组成,也称为二维表。
  • 记录:表中一行,称为一条记录
  • 字段:构成记录的各数据项,比如姓名、性别。

3.2 基本表的性质

  • 原子性: 基本表中的字段是不可再分解的
  • 原始性:基本表中的记录是原始数据的记录
  • 演绎性: 由基本表与代码表中的数据可以派生出所有的输出数据。
  • 稳定性:基本表的结构是相对稳定的,表中的记录是长期保存的。

3.3 中间表、临时表和视图

  • 中间表: 是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的。
  • 临时表是程序员个人设计的,存放临时记录,为个人所用。
基本表和中间表由dba维护,临时表由程序员自己采用程序来自动维护。
  • 视图技术在数据库设计中的作用
  1. 视图是供程序员使用数据库的一个窗口,是一种虚表,视图依赖基本表而存在。它是基本表的数据综合的一种体现,是数据处理的一种方法,更是一种数据保密的手段。
  2. 为了进行复杂处理、提高运算速度和节省存储空间,视图的定义深度一般不得超过三层。如果超过三层视图还是不够用,则应该在视图上定义临时表,在临时表上再定义视图。

3.4 约束

oracle自动为主键和唯一约束创建索引。

主键约束

---添加主键
alter table EMP add constraint pk_emp_id primary key (EMP_ID);

唯一约束

alter table EMP add constraint uq_emp_code unique (EMP_CODE);

外键约束

  alter table EMP
  add constraint fk_dept_id foreign key (DEPT_ID)
  references dept (DEPT_ID);

IV 索引

4.1 索引类型

  • 标准索引(B*树):数据量非常大的情况下,查找依然很快。
  • 唯一索引(Unique Index):比如员工编号,唯一索引查找最快。
  • 位图索引(Bitmap):适合基数小的字段,比如性别,节约空间。
  • 基于函数的索引(FBI)

4.2 创建索引

创建标准索引

create index IDX_DEPT_NAME 
on DEPT (dept_name);

创建唯一索引

create unique index IDX_DEPT_CODE 
on DEPT (dept_code);

创建位图索引

create bitmap index IDX_EMP_SEX 
on EMP (sex);

创建函数索引

create index IDX_EMP_BDATE 
on EMP (TO_CHAR(B_DATE,'YYYY-MM-DD'));

4.3 建议建立索引的字段

  1. 表间关联字段(外键)
  2. 查询的字段
  3. group by的字段
  4. order by的字段
select emp.e_mail,count(*) ct 
from emp
join dept on emp.dept_id=dept.dept_id
where dept.dept_name = 'IT'
group by emp.e_mail
order by emp.e_mail
  • 身份证这类唯一属性,应建唯一索引
  • 性别,只有男、女、未定等少数几种状态值,应创建位图索引,位图索引更节约空间
  • 对字段使用函数,会停用索引,可创建函数索引

4.4 索引的优缺点

  • 优点:某些情况下,数据查找快。
  • 缺点:
  1. 在通过索引查找,返回结果比较多的情况下,由于需要占用非常多的磁盘I/O,这时全表扫描比索引查找更快
  2. 索引占用空间惊人,甚至超过表数据所占空间,不利于管理。
  3. 创建索引后,会降低插入,修改,删除等操作的效率。

V 提高数据库运行效率的方法

从数据库系统级优化、数据库设计级优化和程序实现级优化:

  1. 在数据库物理审计时,降低范式、增加高级冗余、少用触发器和多用存储过程。
  2. 当计算非常复杂,而且记录条数非常巨大时,复杂的计算要先在数据库外以文件系统方式采用编程语言处理完毕之后,最后才入库追加到表中。
  3. 如果表的记录太多,可以以主键的某个值为界限,将该表的记录分割为两个表;如果表的字段太多,则垂直分割表。

5.1 好的E-R图标准

结构清晰,关联简洁、实体个数适中、属性分配合理和没有低级冗余。

5.2 字段的设计

  1. 数据类型尽量用数字类型
  2. 数据类型尽量的小
  3. 尽量不允许null,可以使用not null 和default 来代替null
  4. 少用text和image类型的字段
  5. 自增字段要慎用,不利于数据迁移。

雪花ID:https://blog.csdn.net/z929118967/article/details/128307222

5.3 主键与外键

一般而言,一个实体不能既无主键又无外键。在E-R图中处于叶子部位的实体,可以定义主键也可不定义主键(因为它无子孙),但必须要有外键(因为他有父亲)。主键是实体的高度抽象,主键与外键的配对表示实体之间的连接。

主键的取值方法:主键是供程序员使用的表间连接工具,可以是一个由程序实现的自动递增的序列(无物理意义的数字串),也可以有物理意义的字段名或字段组合。建议组合字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

雪花ID:https://blog.csdn.net/z929118967/article/details/128307222

5.4 正确处理多对多的关系

如果两个实体之间存在多对多的关系,则应该消除这种关系,消除的办法是在两者之阿增加第三实体
这样原来一个多对多的关系,现在变成两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中。

5.5 数据冗余

提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

高级冗余举例:消费流水表的字段有原余额、现余额和消费金额。其中原余额是冗余的,但是也要保留。

5.6 SQL优化

  1. 优化时,在既有选择操作和链接操作时,应当先做选择操作,这样参加连接的元组就可以大大减少。(代数优化)
  2. 选择操作算法有全表扫描和索引扫描,应当选用索引扫描。
  3. 表的连接采用index join代价页较小。这是物理优化。
目录
相关文章
|
1月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
264 28
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回表
本文介绍了Oracle数据库中的闪回表(Flashback Table)功能,它能够将表的数据快速恢复到特定时间点或系统改变号(SCN),无需备份。文章通过实战示例详细演示了如何使用闪回表恢复数据,包括授权、创建测试表、记录时间与SCN号、删除数据、启用行移动功能、执行闪回操作以及验证恢复结果等步骤。同时,还展示了如何通过触发器禁止插入操作,并在闪回过程中处理触发器的启用问题。文末附有视频讲解,帮助读者更好地理解闪回表的使用方法。
90 10
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
|
14天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
14天前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
2月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
439 82
|
21天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。

热门文章

最新文章

推荐镜像

更多