当前位置: 首页 > news >正文

07 初始 Oracle 优化器

查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。

什么是执行计划

在具体介绍优化器之前,我们先普及一下执行计划的概念。

所谓执行计划,是数据库在接收到SQL语句执行请求后,由优化器根据数据库表结构、索引信息以及其他必要信息生成的一个内部数据访问策略,这个策略详细描述了数据库引擎如何将SQL语句转化为一系列的操作步骤,从数据库中获取到最终的执行结果。通过执行计划,我们可以了解到数据库引擎如何访问表、如何使用索引,多表之间如何关联以及相关的其他操作,是数据库性能优化的重要分析工具。

执行计划概览

完整的执行计划主要包括完整的SQL语句、SQL执行计划和谓词信息等几个部分。

SQL_ID  g9xaqjktdhbcd, child number 0
-------------------------------------
SELECT employee_id, last_name, first_name, department_name from
employees e, departments d WHERE e.department_id = d.department_id and
last_name like 'T%' ORDER BY last_namePlan hash value: 1219589317
----------------------------------------------------------------------------------------
| Id | Operation                    | Name        |Rows | Bytes |Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT             |             |     |       |    5 (100)|          |
|  1 |  NESTED LOOPS                |             |   5 |   190 |    5   (0)| 00:00:01 |
|  2 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES   |   5 |   110 |    2   (0)| 00:00:01 |
|* 3 |    INDEX RANGE SCAN          | EMP_NAME_IX |   5 |       |    1   (0)| 00:00:01 |
|* 4 |   TABLE ACCESS FULL          | DEPARTMENTS |   1 |    16 |    1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - access("LAST_NAME" LIKE 'T%')filter("LAST_NAME" LIKE 'T%')4 - filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")

以上是一个基础的SQL执行计划,主要包括三个部分:

  • SQL语句部分:主要包含SQL_ID,子游标信息和完整的SQL语句;
  • 详细的执行计划部分:包括每个步骤所执行的操作方式和操作对象,返回的行数、成本以及所消耗的时间等,当然这些信息是基于统计信息估算出来的;
  • 谓词信息:这部分表示的是数据访问时所使用到的关联条件或者过滤条件。细心的同学可能看出来了,上面的执行计划 Id 3 和 Id 4 两个步骤前面有个*号,对应的谓词信息部分有两个步骤所使用到的关联和过滤信息。其中 access 表示数据的访问路径,用于定位数据;filter 表示过滤条件,对上一个操作返回的数据进行筛选。上例 Id 3 的操作对象是EMP_NAME_IX,表示通过索引EMP_NAME_IX访问EMPLOYEES,将满足条件的数据过滤出来;
  • 其他部分:对于某些执行计划,还有一些额外的提示内容,如是否使用SQL Profile绑定了执行计划、是否使用了Feedback等等。

如何阅读执行计划

复杂SQL的执行计划也很复杂,通过执行计划来分析数据的访问逻辑并不是一件很轻松的工作,只有掌握了其中的原理才能化繁为简,找出真正的问题所在。

语句的执行顺序

阅读Oracle的执行计划,最基础的原则:执行顺序是从右向左,从上到下。按照这个原则,上面的执行计划中最右边的是 3 INDEX RANGE SCAN,因此这一步最先执行,之后是 2 TABLE ACCESS BY INDEX ROWID,又因为 2 和 4 是平级的,但是 4 在下面,所以 2 执行后接着是 4,二者的数据关联执行 1 NESTED LOOPS。

上述过程用树形图来表示,会更加直观。

在这里插入图片描述

表的访问方式

Oracle支持多种方式的单表访问,其中典型访问方式有以下几种类型:

  • 全表扫描:数据库引擎扫描表的所有数据块来查找所需要的数据。如果查询的表很大,而返回的结果集又很小,全表扫描是一种很低效的数据获取方式,在OLTP等要求快速响应的系统中,应该尽量减少不必要的全表扫描;
  • 索引访问:索引相当于是书本的目录,通过扫描目录获取到详细数据所在的位置,快速获取到所需要的数据。这种方式非常适合从大表中精确定位小的结果集,比全表扫描的效率高。根据索引信息和查询条件的不同,索引扫描又可以分为索引范围扫描、索引快速全扫描、索引跳跃扫描等等,这里限于篇幅的原因,不再展开细说;
  • ROWID访问:Oracle数据库中的每一行数据都有精确的家庭住址 – ROWID,这种方式精确定位数据效率是最高的,索引中记录的就是键值和ROWID的对应关系。但是ROWID是一个18位的数字,对于人来说直接使用ROWID并不友好,因此这种方式通常都是系统内部使用。
表的连接方法

如果SQL语句涉及到多张表,需要对多张表进行关联查询,最后返回满足要求的结果集。Oracle主要支持三种类型的连接方法:

在这里插入图片描述

  • 嵌套循环(Nested Loop):这种方法从外部表结果集中的每一行记录,检索内部表中满足连接谓词的所有数据,由于使用外部表的所有结果集数据和内部表进行匹配,因此外部表也被称为驱动表。这种连接方法适合于用一个小的结果集去驱动大的结果集,对于驱动表数据集较小、而被驱动表相对较大的场景,这种连接方法效率很高;
  • 哈希连接(Hash Join):优化器使用两个数据集中较小的一个,基于连接条件列在内存中构建哈希表,然后扫描较大的数据集,探测哈希表以找到符合连接条件的记录。这种方法适用于两个大的结果集之间的等值连接,当较小的结果集能够全部保存在内存中时,这种连接方式的效率非常高,查询成本仅限于对两个数据集进行一次读取。如果数据集不能完全放入内存,优化器会对结果集进行分区,然后逐个分区进行连接匹配;
  • 排序合并连接(Sort Merge Join):排序合并连接可以看作是嵌套循环的变种,假如连接中的两个结果集没有排序,优化器会对其进行排序(Sort);之后再基于第一个结果集中的每一行,和第二个结果集进行关联匹配(Merge),得到最终的结果集。这种方法适合于大结果集之间的非等值连接。

三种类型的连接方法各有自己的适用场景和优缺点,需要结合实际运行状态进行选择。如果是小的结果集驱动大结果集,嵌套循环会更适合;如果两个结果集都很大并且是等值连接,使用哈希连接效率更高,因为排序的成本很高;两个大结果集之间的非等值连接使用排序合并,此外,如果结果集大到无法一次性放入内存,使用排序合并的效率也会比哈希连接更高。

前面说的三种方法都是有关联条件的,如果没有关联条件则会使用笛卡尔积连接,这种方法产生的结果集是两个数据集的乘积,如果两个结果集都很大,将会消耗大量的内存和CPU资源。更重要的是由于没有关联条件,这种结果集通常都是无意义的,因此在结果之间要尽量带上关联条件,避免使用笛卡尔积关联。

优化器的分类

Oracle数据库优化器主要分为两大类型:基于规则的优化器(RBO)和基于成本的优化器(CBO)。

RBO,Rule Base Optimizer

RBO 优化器基于一系列设定好的规则来决定 SQL 语句的执行计划。

仍然以前述的 SQL 语句为例,由于在 FROM 子句中,employees 表出现在 departments 表的前面,因此固定由 employees 表来驱动 departments 表。这样做的好处是不需要额外的决策成本,缺点是需要开发人员对于优化器的规则非常了解,才能保证 SQL 语句的执行效率。此外还有一个问题是 RBO 模式下无法解决的,数据总是在不断变化的,当前适合做驱动表不一定意味着永远适合做驱动表,假如某一天 departments 表扩张的比 employees 表还多呢?(不太现实,纯属举例)

CBO,Cost Base Optimizer

因为数据的持续变化,当前的最优未来可能会变成次优。为了让优化器能够生成更准确的执行计划,现代数据库普遍采用 CBO,基于成本的优化器。这种优化器为每种操作设定了数据模型,将表行数、索引页块数量、查询条件的过滤度等值作为变量代入模型中,算出每种执行计划的成本,选择其中成本最低的作为最终执行计划。

CBO 最大的好处是考虑了数据量的变化情况,优化器总是能够根据数据的变化选择最优的执行计划。但成本的计算也是有代价的,对于涉及表和索引非常多的复杂 SQL 来说,决策成本非常的高。(具体可参见本专栏的第一篇文章 01 Oracle基础架构:一条SQL查询语句是如何执行的_在oracle中一条sql是怎么执行的,从硬件层次-CSDN博客 )

此外对于某些 SQL 会由于计算出来的成本非常接近导致执行计划频繁变化,从而影响 SQL 语句的执行性能。针对这些问题 Oracle 引入了一系列的工具,在和执行计划稳定性做着持续不懈的斗争,这个话题以后我们再慢慢展开。

优化器的设置

为了满足不同应用场景的需要,Oracle 的优化器支持多种运行模式。优化器模式受控于 OPTIMIZER_MODE 参数,支持的值有 RULE, CHOOSE, FIRST_ROWS_n(N=1、10、100、1000), FIRST_ROWS 或 ALL_ROWS。每种运行模式的含义概述如下:

  • RULE

    表示优化器使用 RBO 来解析目标 SQL 语句,这种模式下 SQL 所涉及的对象统计信息对于执行计划的决策不会起到任何作用。虽然 Oracle 不推荐这种优化器,但是仍然有少数希望 SQL 语句执行绝对稳定的系统在使用这种模式,Ta 们不奢望 SQL 始终选择最好的执行计划,而是期望 SQL 语句能够在可接受的性能范围内稳定的执行;

  • CHOOSE

    表示优化器解析 SQL 语句时,选择何种模式取决于相关对象是否有统计信息,只要相关对象含有统计信息,则使用 CBO,否则使用 RBO。这种模式是 9i 的默认设置;

  • FIRST_ROWS_n (n=1、10、100、1000)

    表示优化器解析 SQL 语句时,使用 CBO 来解析目标 SQL,优化器在选择执行计划时倾向于以最快的速度返回前 n 条数据。这种模式下优化器会更多的选择 Nested Loop 方式进行表之间关联,对于数据量较大的环境容易出现性能问题,因此除非经过严格的测试,不建议轻易使用该配置;

  • ALL_ROWS

    这种模式是 10g 及之后版本的默认值,表示优化器使用 CBO 来解析 SQL 语句,优化器在选择执行计划时倾向于最佳的吞吐量。除非有特别的需求,不建议修改默认的优化器模式。

总结

这篇文章和大家探讨了优化器和执行计划的关系,执行计划是如何工作的,又该如何阅读执行计划。当然,对于 SQL 优化来说,这些知识连入门都谈不上,仅仅是想通过一篇短文来帮助大家建立基本的概念,后续还将推出更多和优化相关的文章,有兴趣的朋友可以持续关注。日常学习和工作中有遇到优化相关的问题,也欢迎随时留言讨论!

相关文章:

07 初始 Oracle 优化器

查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。 什么是执行计划 …...

深入理解React Hooks:使用useState和useEffect

引言 React Hooks是React 16.8引入的一项强大功能,它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks:useState和useEffect,并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks? React Ho…...

深入浅出剖析典型文生图产品Midjourney

2022年7月,一个小团队推出了公测的 Midjourney,打破了 AIGC 领域的大厂垄断。作为一个精调生成模型,以聊天机器人方式部署在 Discord,它创作的《太空歌剧院》作品,甚至获得了美国「数字艺术/数码摄影」竞赛单元一等奖。 这一事件展示了 AI 在绘画领域惊人的创造力,让人们…...

大数据学习18之Spark-SQL

1.概述 1.1.简介 Spark SQL 是 Apache Spark 用于处理结构化数据的模块。 1.2.历史 1.2.1.Shark Hadoop诞生初期,Hive是唯一在Hadoop上运行的SQL-on-Hadoop工具,MR的中间计算过程产生了大量的磁盘落地操作,消耗了大量的I/O,降低…...

Flink开发入门简单案例--统计实时流订单

Flink开发入门简单案例 0.简介1.订单数据生成器1.1 新建工程TestFlink1.2 在pom.xml中引入Flink依赖包1.3 订单数据生成类订单类(Item)订单生成数据流类测试订单生成类 2.订单统计2.1 仅统计订单中商品的件数 2.2 同时统计商品数量和金额 0.简介 本案例…...

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是?//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别:倒数第…...

RabbitMQ

交换机 Fanout:广播Direct:定向路由Topic:匹配符 声明队列和交换机 基于Bean基于注解 消息转换器 JSON序列化...

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程,它涉及到将一个360度的全景图像转换为一个具有透视效果的图像,这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像,它通过将球面图像映射到平面上得到&#xf…...

matlab 实现混沌麻雀搜索算法的光伏MPPT控制仿真

1、内容简介 略 103-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

【设计模式】【行为型模式(Behavioral Patterns)】之策略模式(Strategy Pattern)

1. 设计模式原理说明 策略模式(Strategy Pattern) 是一种行为设计模式,它允许你定义一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。通过这种方式,客户端可…...

深度学习笔记之BERT(三)RoBERTa

深度学习笔记之RoBERTa 引言回顾:BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...

【软考速通笔记】系统架构设计师③——信息安全技术基础知识

文章目录 一、前言二、信息安全基础知识2.1 信息安全的基本要求2.2 信息安全的范围2.3 网络安全表现2.4 安全措施包括 三、信息安全系统的组成框架3.1 技术体系:3.2 组织机构体系:3.3 管理体系 四、信息加解密技术4.1 对称密钥加密算法4.2 非对称密钥加密…...

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相…...

设计模式-装饰者模式

背景 有一个咖啡馆有 单品咖啡:意大利浓咖啡、美式咖啡、无因咖啡 调料:牛奶、巧克力 点单时需要点一个单品咖啡,可以选择加调料或者不加。 最后计算价格。 较好的传统思路: 创建一个抽象的咖啡类,其中有各个调…...

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器(Filter)和拦截器(Interceptor)是两个不同的概念,但它们在某些方面有相似之处,也有明显的区别。 🔑过滤器(Filter) 过滤器是Asp.NET Core中用于…...

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…...

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…...

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…...

IT成长之路-ubuntu驱动篇

历时3天的蹂躏&#xff0c;总结驱动安装全面教程。 步骤一、安装gcc、g和make包 #脚本更新 sudo apt-get update #编译gcc sudo apt-get install gcc #编译g sudo apt-get install g #编译make sudo apt-get install make 注意&#xff1a; gcc、g版本可能会导致显卡驱动安…...

AI大模型如何赋能电商行业,引领变革

目录 1.概述 1.1. 购物推荐系统 1.2. 会员分类与客户细分 1.3. 动态商品定价 1.4. 库存和供应链管理 1.5. 客户服务与体验 1.6. 内容生成与管理 2.AI技术在电商中的创新应用 2.1.淘宝 2.2.京东 2.3.华为 2.4.小米 3.AI技术在提高电商平台销售效率方面发挥的作用 …...

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…...

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题&#xff0c;BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”&#xff0c;更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法&#xff0c;目前已支持 ipm-based 、lss-based、 transformer-based&#xff…...

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…...

构建一个去中心化的零售生态参与者的商业模型

在数字化和去中心化技术快速发展的背景下&#xff0c;传统零售行业正迎来革命性的转型。去中心化零售生态不仅让消费者、商家和内容创作者在同一平台上共同参与价值的创造和分配&#xff0c;还推动了零售体验、数据控制和社会互动的彻底变革。本文将探讨如何构建一个去中心化的…...

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…...

MyBatis(mybatis_plus)中TypeHandler的使用教程

MyBatis&#xff08;mybatis_plus&#xff09;中TypeHandler的使用教程 一.TypeHandler作用及其使用场景 在我们平常开发操作数据库时&#xff0c;查询、插入数据等操作行为&#xff0c;有时会报数据类型不匹配异常&#xff0c;就可以得知数据的类型是不唯一的必然是多种不同…...

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO&#xff0c;这些类型可以向 string 写入数据&#xff0c;也可以从 string 读取数据&#xff0c;就像 string 是一个 IO 流一样。 istringstream 从 string 读数据&#xff1b;ostringstream 向 string 写入数据&…...

C# 反射详解

反射是C#中的一个强大特性&#xff0c;允许程序在运行时检查和操作类型和对象的信息。 通过反射&#xff0c;你可以获取类型的属性、方法、构造函数等信息&#xff0c;并可以动态创建对象、调用方法或访问属性&#xff0c;甚至可以实现某些框架或库的核心功能。 反射的基本概念…...

量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…...

【开发商城系统】

在广西开发商城系统&#xff0c;可以按照以下步骤进行&#xff1a; 确定项目需求&#xff1a;与客户沟通&#xff0c;了解商城系统所需的功能和特性&#xff0c;并确定项目的预算和时间限制。 进行市场调研&#xff1a;了解广西地区的电商市场情况&#xff0c;包括竞争对手、消…...

C++设计模式-享元模式

动机(Motivation) 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍然能够透明地使用面向对象的方式来进行操作…...

Spark——安装步骤详细教程

1、安装步骤 1、上传 cd /opt/modules 2、解压 tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 3、重命名 cd /opt/installs mv spark-3.1.2-bin-hadoop3.2 spark-local 4、创建软链接 ln -s spark-local spark 5、配置环境变量&#xff1a; vi /etc/prof…...

摆烂仙君传——深度学习秘境奇缘

第一章&#xff1a;深度学习秘境 在修仙界与科技交织的边缘&#xff0c;八荒六合九天无上摆烂仙君在其高科技修炼室中感应到一股神秘的召唤。这股力量似乎与他的灵魂产生了共鸣&#xff0c;引导他前往传说中的深度学习秘境。在那里&#xff0c;古老的仙法与前沿的算法交织&…...

C++设计模式:桥接模式(Bridge)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一个用来解耦的设计模式&#xff0c;它将抽象层和实现层分离开&#xff0c;让它们可以独立变化。用最简单的话来说&#xff0c;就是让你能够改变抽象的功能和具体的实现&#xff0c;而不需要修改…...

c++源码阅读__smart_ptr__正文阅读

文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…...

halcon3D 1:1切片轮廓投影技术,透过像素距离,知实际物体的尺寸

首先说做个什么事儿 对一个物体的横截面进行1:1或者1:10的投影&#xff0c;也就是说世界物体1mm的话&#xff0c;投影到image中占1个或者10个像素值&#xff0c;这样&#xff0c;就可以透过直接计算image中的像素距离&#xff0c;知道实际物体的尺寸 用一张图说明是这样的。物…...

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法 1. npm库xss依赖的使用方法1.1 xss库定义1.2 xss库功能 2. vue3 中 wangeditor 使用xss库解决 XSS 攻击的方法和示例2.1 在终端执行如下命令安装 xss 依赖2.2 在使用 wangeditor 的地…...

计算机网络 实验七 NAT配置实验

一、实验目的 通过本实验理解网络地址转换的原理和技术&#xff0c;掌握扩展NAT/NAPT设计、配置和测试。 二、实验原理 NAT配置实验的原理主要基于网络地址转换&#xff08;NAT&#xff09;技术&#xff0c;该技术用于将内部私有网络地址转换为外部公有网络地址&#xff0c;从…...

UI设计-色彩、层级、字体、边距(一)

一.色彩&#xff1a;色彩可以影响人的心理与行动&#xff0c;具有不同的象征意义&#xff1b;有冷暖&#xff0c;轻重&#xff0c;软硬等等。 1.色彩情绪&#xff1a;最直观的视觉感受 一个活动的页面所用的颜色必须要与其内容相适应&#xff0c;让人看起来舒服。有时我们会不…...

【网络安全】

黑客入侵 什么是黑客入侵&#xff1f; “黑客”是一个外来词&#xff0c;是英语单词hacker的中文音译。最初&#xff0c;“黑客”只是一个褒义词&#xff0c;指的是那些尽力挖掘计算机程序最大潜力的点脑精英&#xff0c;他们讨论软件黑客的技巧和态度&#xff0c;以及共享文化…...

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…...

【MySQL】MySQL从入门到放弃

文章目录 声明MYSQL一,架构1.1.网络连接层数据库连接池 1.2.系统服务层1.2.1.SQL接口1.2.2.存储过程1.2.3.触发器1.2.4.解析器1.2.5.优化器1.2.6.缓存,缓冲 1.3.存储引擎层1.4.文件系统层1.4.1.日志模块1.4.2.数据模块 二,SQL 执行2.1.执行流程2.2.刷盘2.3.返回 三.库表设计3.1…...

redis-cluster集群搭建

集群节点信息 192.168.222.131:46379 主要节点1 192.168.222.131:46380 从节点1 192.168.222.131:46381 从节点2192.168.222.132:46379 主要节点2 192.168.222.132:46380 从节点1 192.168.222.132:46381 从节点2192.168.222.133:46379 主要节点3 192.168.222.133:46380 从节点…...

C语言解决空瓶换水问题:高效算法与实现

标题&#xff1a;C语言解决空瓶换水问题&#xff1a;高效算法与实现 一、问题描述 在一个饮料促销活动中&#xff0c;你可以通过空瓶换水的方式免费获得更多的水&#xff1a;3个空瓶可以换1瓶水。喝完这瓶水后&#xff0c;空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...

单例模式入门

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 它的运作方式是这样的&#xff1a; 如果你创建了一个对象&#xff0c; 同时过一会儿后你决定再创建一个新对象&#xff0c; 此时你会获得之前已创建的…...

MongoDB快速入门

1 MongoDB 1.1 MongoDB 概念 1.1.1 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在Mo…...

c语言中的extern是什么

在C语言中&#xff0c;extern 是一个关键字&#xff0c;用于声明变量或函数的外部链接。它告诉编译器该变量或函数的定义在其他文件中&#xff0c;编译器在编译当前文件时并不需要知道变量或函数的具体定义&#xff0c;而是将它们视作外部引用。 1. 变量的 extern 声明 当你在…...

CTF之密码学(摩斯密码)

一、历史背景 摩尔斯电码发明于1837年&#xff0c;是一种早期的数字化通信形式。它最初由艾尔菲德维尔和摩尔斯等人构思&#xff0c;通过点、划和中间的停顿&#xff0c;把各个字元以及标点符号彼此独立地发送出去。这种标识不同符号的方案后来被放入摩尔斯的专利中&#xff0…...

Flink 任务启动脚本-V2(包括ck启动)

#!/bin/bash#crontab时设置&#xff0c;如果依赖其他环境变量配置&#xff0c;可以在脚本执行一下环境变量脚本 source /etc/profile# 进入脚本目录 curdirdirname "$0" curdircd "$curdir"; pwd echo "进入启动脚本目录 $curdir"# 定义应用程序…...