滚雪球学Oracle[3.2讲]:查询与数据操作基础

news/2024/12/22 2:34:22/

全文目录:

    • 前言
    • 一、复杂查询的优化:索引与查询重写
      • 1.1 使用索引优化查询
        • 索引的原理
        • 索引类型
        • 索引的使用场景
        • 案例演示:创建和使用索引
      • 1.2 查询重写技术
      • 1.3 查询计划分析
        • 案例演示:使用`EXPLAIN`查看查询计划
    • 二、DML操作中的锁定机制与并发控制
      • 2.1 数据库锁定机制
        • 锁的类型
      • 2.2 并发控制策略
        • 乐观锁
        • 悲观锁
        • 案例演示:事务锁定
      • 2.3 死锁与避免策略
        • 避免死锁的策略
    • 三、批量数据处理的最佳实践
      • 3.1 批量插入与更新
        • 批量插入策略
        • 批量更新策略
      • 3.2 分批处理大数据
        • 案例演示:分批处理大数据
    • 四、总结与下期预告

前言

在上一篇文章【SQL语言基础】中,我们介绍了如何使用基本的SQL语句进行数据的查询、插入、更新和删除操作。通过这些基础操作,大家了解了如何与数据库进行交互并从中获取有用的数据。然而,随着数据库规模的增大和复杂业务的需求,SQL的复杂度也随之增加。为了在处理复杂查询和大数据操作时保持系统高效运行,我们需要进一步学习优化查询、锁定机制和批量数据处理的最佳实践。

本期内容将重点讲解查询与数据操作的高级技术。首先,我们将介绍如何通过索引和查询重写来优化复杂查询,提升数据库的响应速度。然后,深入探讨DML(Data Manipulation Language,数据操作语言)操作中的锁定机制与并发控制,保障数据一致性和系统的高可用性。最后,我们将分享批量数据处理的最佳实践,帮助大家高效地执行大数据量的操作。

在文章的最后,我们还会预告下期内容【数据定义语言(DDL)】,让大家对如何创建、修改和删除数据库对象有进一步的了解。


一、复杂查询的优化:索引与查询重写

随着数据库中的数据量和业务复杂度的增加,查询的响应速度可能会显著降低。优化查询是确保系统在处理复杂业务时仍能高效运行的关键。优化的常见方法包括使用索引和对查询进行重写。

1.1 使用索引优化查询

索引数据库中的一种用于加速数据访问的结构。它通过为数据表中的某些列建立快速查找的索引,减少了全表扫描的需求,从而加快查询速度。

索引的原理

索引通过类似目录的方式存储关键列及其对应的数据位置。这样,数据库查询数据时不需要逐个检查所有行,而是直接根据索引找到目标行。

索引类型
  • B-Tree索引:适用于绝大多数查询,包括等值查询和范围查询
  • 哈希索引:适合用于等值查询,通常效率高于B-Tree索引,但不支持范围查询
  • 位图索引:适合用于基数较小的列,如性别、状态等,常用于数据仓库和分析型应用。
索引的使用场景
  • 快速查询特定行:当我们查询的列是有索引的列时,数据库可以通过索引直接定位到相关行,避免扫描整个表。
  • 加速联接操作:在JOIN查询中,索引可以显著减少联接表的扫描量,提升查询效率。
  • 排序与分组:索引可以帮助优化带有ORDER BYGROUP BY查询,减少排序的计算成本。
案例演示:创建和使用索引

我们假设有一张employees表,包含字段emp_idfirst_namelast_name。如果我们经常基于emp_id字段进行查询,可以创建一个索引来优化这些查询

CREATE INDEX idx_emp_id ON employees(emp_id);

创建索引后,当我们执行以下查询时,数据库可以通过索引加快查找速度:

SELECT * FROM employees WHERE emp_id = 1234;

数据库通过索引idx_emp_id直接定位到符合条件的行,而不需要扫描整个表,提升了查询性能。

1.2 查询重写技术

查询重写是通过重构SQL查询,使其在逻辑上等价但性能上更高的一种技术。数据库优化器在某些情况下会自动执行查询重写,但掌握手动重写技巧能够帮助开发人员进一步优化复杂查询

常见的查询重写方法
  • 将子查询转换为JOIN:子查询可能会导致数据库多次扫描表,因此可以通过将子查询转换为JOIN查询,减少对数据表的重复访问。

    例如,以下带有子查询的SQL:

    SELECT * FROM employees WHERE emp_id IN (SELECT emp_id FROM orders WHERE order_date > '2023-01-01');
    

    可以重写为:

    SELECT e.* FROM employees e
    JOIN orders o ON e.emp_id = o.emp_id
    WHERE o.order_date > '2023-01-01';
    

    重写后,数据库在执行时只需一次扫描就能完成查询,效率会更高。

  • 简化ORDER BYGROUP BY:如果查询的结果不需要排序或分组,可以去掉ORDER BYGROUP BY,减少额外的计算开销。

  • 减少函数调用:尽量避免在查询WHERE子句中使用复杂的函数运算,如:

    SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYYY') = '2023';
    

    重写为:

    SELECT * FROM employees WHERE hire_date BETWEEN '2023-01-01' AND '2023-12-31';
    

    通过避免函数运算,可以让数据库利用索引来加快查询

1.3 查询计划分析

数据库查询优化器会根据SQL语句生成查询执行计划,描述查询是如何执行的。通过分析查询计划,我们可以发现查询的潜在性能问题,并做出相应的优化。

案例演示:使用EXPLAIN查看查询计划

我们可以使用EXPLAIN命令来查看SQL语句的执行计划,例如:

EXPLAIN SELECT * FROM employees WHERE emp_id = 1234;

EXPLAIN命令输出的结果会显示查询将使用的索引、全表扫描、排序等操作。通过分析这些步骤,我们可以判断查询是否被正确优化,进而采取措施提升其性能。


二、DML操作中的锁定机制与并发控制

在多用户并发访问数据库的场景中,必须使用锁定机制来确保数据的完整性和一致性。了解数据库如何处理锁定和并发控制,对于设计高效且健壮的应用程序至关重要。

2.1 数据库锁定机制

锁定机制数据库用来管理多个事务并发访问数据的一种方法。通过锁定,可以防止多个用户同时修改同一条记录而引发数据不一致的问题。

锁的类型
  • 共享锁(S锁):允许多个事务同时读取数据,但禁止修改数据。这种锁通常在SELECT查询时使用。
  • 排他锁(X锁):防止其他事务读取或修改被锁定的数据,通常在INSERTUPDATEDELETE操作中使用。

2.2 并发控制策略

数据库的并发控制机制用于处理多个事务同时访问同一数据的冲突。常见的并发控制方法包括乐观锁和悲观锁。

乐观锁

乐观锁假设并发冲突不会频繁发生。每个事务都可以自由读取和修改数据,只有在提交时检查是否有冲突。如果有冲突,事务会回滚并重试。

悲观锁

悲观锁假设并发冲突是常见的,因此在事务开始时就锁定数据,防止其他事务修改数据,直到事务结束为止。

案例演示:事务锁定
BEGIN TRANSACTION;UPDATE employees SET salary = salary * 1.1 WHERE emp_id = 1234;
-- 此时该记录已被排他锁锁定,其他事务无法修改这条记录COMMIT;

在提交之前,其他事务无法修改被锁定的记录。这种方式确保了数据的一致性,防止并发修改时引发冲突。

2.3 死锁与避免策略

死锁是指两个或多个事务彼此等待对方释放锁,导致事务无法完成。数据库可以检测到死锁并选择回滚其中一个事务来解决问题。

避免死锁的策略
  • 按相同顺序锁定资源:所有事务应按相同顺序请求资源,避免循环等待。
  • 减少事务粒度和时间:尽量缩短事务的执行时间,减少长时间持有锁的机会。

三、批量数据处理的最佳实践

在处理大量数据时,逐条执行数据操作的效率较低。为了更好地管理和操作大量数据,数据库提供了一些批量操作的方法。

3.1 批量插入与更新

批量插入策略
  • 一次性插入多条记录:将多条插入语句组合成一个批量操作,减少数据库与应用程序之间的通信开销。
  INSERT INTO employees (emp_id, first_name, last_name)VALUES (1001, 'John', 'Doe'), (1002, 'Jane', 'Smith'), (1003, 'Alice', 'Johnson');
  • 使用COPY命令:某些数据库系统支持将外部文件中的数据批量导入数据库,如PostgreSQL的COPY命令。
批量更新策略

批量更新操作会锁定大量数据,因此应确保操作的高效性。可以通过分批次更新来避免长时间锁定过多记录。

3.2 分批处理大数据

对于超大数据量的操作,分批处理是常用的策略。通过分批次执行操作,可以避免单个事务时间过长,减少资源占用,并提高系统的并发能力。

案例演示:分批处理大数据

假设我们需要批量更新employees表中的记录,可以通过将操作分成若干小批次来执行:

BEGIN TRANSACTION;UPDATE employees SET salary = salary * 1.1 WHERE emp_id BETWEEN 1 AND 1000;COMMIT;

通过循环执行这段操作,可以在不一次性锁定大量数据的情况下完成更新任务。


四、总结与下期预告

本期内容详细介绍了如何优化复杂查询、理解并发控制中的锁定机制,以及批量数据处理的最佳实践。通过这些技巧和方法,大家可以显著提升数据库在处理复杂查询和大规模数据操作时的性能和效率。

在下期内容中,我们将讨论数据定义语言(DDL),帮助大家了解如何使用SQL创建、修改和删除数据库对象,如表、索引和视图,进一步优化数据库结构。


http://www.ppmy.cn/news/1536691.html

相关文章

销售团队管理全面指南:从结构到流程

“除非卖出东西,否则就不能叫生意。” ——Thomas Watson的这段话表明,无论您经营哪个行业,销售都应该成为企业最重要的部分。您可能拥有出色的产品,但真正重要的是如何销售它。为此,您需要一支出色的销售团队&#xf…

书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践

目录 1 环境准备 1.1 安装rust 1.2 安装Android Studio 1.3 设置环境变量 2 转换模型 2.1 安装mlc-llm 2.2 (可选)转换参数 2.3 (可选)生成配置 2.4 (可选)上传到huggingface 2.5 (可选) 测试转换的模型 3 打包运行 3.1 修改配置文件 3.2 运行打包命令 3.3 创建签…

gyp ERR node-gyp失败处理

当前版本: node v16.20.2 pnpm 8.14.3 npm 8.19.4 python失败 可以在微软的应用商店安装python node-gyp安装了和node一样的版本,然后失败 │ Building: C:\Program Files\nodejs\node.exe D:\data\work_code\data\xiangm\node_modules\.pnpm\node-gyp7.1.2\n… │ gyp inf…

在掌控板中加载人教版信息科技教学指南中的educore库

掌控板中加载educore库 人教信息科技数字资源平台(https://ebook.mypep.cn/free)中的《信息科技教学指南硬件编程代码说明》文件中提到“本程序说明主要供教学参考。需要可编程主控板须支持运行MicroPython 脚本程序。希望有更多的主控板在固件中支持ed…

C语言中的文件操作(二)

C语言中的文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/Xiaodao12345djs/article/details/142746010?spm1001.2014.3001.5501 四、文件的顺序读写 1、fputc (字符输出函数/写) 将一个字符写入文件中 #include <stdio.h>int main() {FILE* pf fo…

构建高效水果购物平台:SpringBoot飘香网站案例

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

docker compose入门2—docker-compose.yaml中的version表示什么意思

在 Docker Compose 中&#xff0c;version 字段用于指定 docker-compose.yml 文件的版本格式。不同版本定义了不同的功能和语法&#xff0c;因此 version 决定了你能够使用哪些特性和指令。 常见的 Compose 文件版本 Version 1: 不需要明确指定 version 字段。只支持最基础的功…

linux基础 超级笔记

1.Linux系统的组成 Linux系统内核&#xff1a;提供系统最核心的功能&#xff0c;如软硬件和资源调度。 系统及应用程序&#xff1a;文件、任务管理器。 2.Linux发行版 通过修改内核代码自行集成系统程序&#xff0c;即封装。比如Ubuntu和centos这种。不过基础命令是完全相…