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

Oracle 数据布局探秘:段与区块的内部机制

前言

在 Oracle 数据库的庞大架构中,数据存储的效率与性能是决定整个系统健康状况的关键因素。Oracle 采用了一套精妙的逻辑存储管理体系来组织和分配数据,其中,“段(Segment)”和“区(Extent)”是两个核心的逻辑单元。

它们直接关系到数据如何被物理地写入和读取,以及存储空间的利用效率。理解并掌握 Oracle 的段与区管理方式,对于数据库管理员优化性能、规划容量、避免空间问题至关重要。

本文将深入探讨 Oracle 的段管理机制,特别是围绕段和区这两个概念,解析传统管理方式的痛点以及现代自动化管理方法的优势,旨在为您揭示 Oracle 存储管理的奥秘。

一、段空间管理方式

1、自动管理方式(ASSM(Auto Segment Space Management))

简单说就是采用位图管理方式,每个段的段头都有一组位图,位图描述每个块的满度,根据满度的不同将每个块登记到相应的位图上,位图自动跟踪每个块的使用空间,该位图不是精确的,而是按 25%的区间来分: 0-25%的空闲空间、 25%-50%的空闲空间、50%-75%的空闲空间和 75%-100%的空闲空间。比如块大小为 8k,你要插入一行是 4k 的表行,那么 oracle 就给你在满度 50%的位图上找个登记的块。ASSM 的前提是 EXTENT MANAGEMENT LOCAL,在 ORACLE9I 以后,缺省状态为自动管理方式, ASSM 废弃 pctused 属性。

2、手工管理方式(MSSM(Manual Segment Space Management))

这是传统的方法,采用 FREELIST 空闲列表管理段,现在仍然在使用,未被淘汰,保留 pctfree 和 pctused 属性,这些概念后面介绍 block 时再讨论。

二、段和表的关系

一个单纯的表就分配一个段,但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引有索引段,还有分区表,每个分区会有独立的段,再有就是 oracle 的大对象, 如果你的表里引用 blob,clob,那么这个表就又被分出多个段来。

2.1、查看表与段的关系

--创建用户并授权
SYS@pdb> create user u1 identified by u1;User created.SYS@pdb> grant connect,resource to u1;Grant succeeded.SYS@pdb> grant select any dictionary to u1;Grant succeeded.2、创建表
U1@pdb>  create table t1(id number);Table created.3、查看段分配情况
U1@pdb> select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments; no rows selected

这时候看到在查询段信息的时候, Oracle 没有分配段,原因是在19C 中采用了默认延迟段的创建方式。也就是说,在创建表的时候,暂时先不分配段,待插入第一条数据的时候再进行创建。 

我们对表插入一条数据,再次查询段的情况:

U1@pdb> insert into t1 values(1);1 row created.U1@pdb> commitU1@pdb> select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments; SEGMENT_NAME                   SEGMENT_TYPE       SEGMENT_SU TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
------------------------------ ------------------ ---------- ------------------------------ ---------- ---------- ----------
T1                             TABLE              ASSM       USERS                               65536          8          1

可以看到,T1表分配一个1个区。

插入更多的数据

--sys用户执行
SYS@pdb>  insert into u1.t1 select object_id from dba_objects where rownum<=10000;10000 rows created.--u1用户查看
U1@pdb> select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments where segment_name='T1';SEGMENT_NAME                   SEGMENT_TYPE       SEGMENT_SU TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
------------------------------ ------------------ ---------- ------------------------------ ---------- ---------- ----------
T1                             TABLE              ASSM       USERS                              196608         24          3

可以看到,随着数据插入,T1表分配一个3个区。

另外,在建表时候可以带上 SEGMENT CREATION IMMEIDATE 选项,可以不使用默认延迟段的创建方式,例如:

U1@pdb> create table t2(id number) segment creation immediate;Table created.U1@pdb> select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments where segment_name='T2'; SEGMENT_NAME                   SEGMENT_TYPE       SEGMENT_SU TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
------------------------------ ------------------ ---------- ------------------------------ ---------- ---------- ----------
T2                             TABLE              ASSM       USERS                               65536          8          1

延迟段的方式是由参数 deferred_segment_creation 来控制,默认值为 TRUE。也可通过更改此参数实现禁用延迟段。该参数可以在会话级别修改,也可以在 spfile 修改,下次启动生效。

SYS@pdb> show parameter deferred_segment_creationNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE--session级别修改deferred_segment_creation参数
SQL> alter session set deferred_segment_creation=false;U1@pdb2> create table t3(id number) ;Table created.U1@pdb2> select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments; SEGMENT_NAME                   SEGMENT_TYPE       SEGMENT_SU
------------------------------ ------------------ ----------
TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
------------------------------ ---------- ---------- ----------
T1                             TABLE              ASSM
USERS                              196608         24          3T2                             TABLE              ASSM
USERS                               65536          8          1T3                             TABLE              ASSM
USERS                               65536          8          1

创建带主键的表,观察段的分配情况:

U1@pdb> create table t3(id number primary key) segment creation immediate;Table created.U1@pdb>  select * from user_segments;这里可以看到表和主键上的索引都会分配单独的段

创建带大对象字段的表,观察段的分配情况:

U1@pdb> create table t4(id number,name clob) segment creation immediate;Table created.U1@pdb> select * from user_segments;
这里可以看到上面的语句,产生了段类型为TABLE及段类型为LOBSEGMENT的对象

2.2 延迟段分配在索引上的使用

--创建索引时指定不分配空间
CREATE INDEX IDX_T1 ON T1(ID) UNUSABLE;--查看索引段分配情况
select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments; 
发现索引未分配空间--将索引重建ALTER INDEX idx_t1 REBUILD;--再次查看索引段分配情况
select segment_name,segment_type,segment_subtype,tablespace_name,bytes,blocks,extents from user_segments; 
发现索引分配空间--将索引分配的空间回收
ALTER INDEX idx_t1 unusable;

三、区 extent

区是 ORACLE 进行存储空间分配的最小单位,是由一系列逻辑上连续的 Oracle 数据块组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。

 管理方式有两种:基于字典的管理(已淘汰)和基于本地管理。

3.1 表和区(extent)的关系

当建立表的时候建立段(segment),然后自动分配相应的 extent(1 个或者多个)

select * from dba_extents t where t.owner='U1' and t.segment_name='T1';

可以手工 allocate extent 提前分配 extent(用于需大量插入数据的表)。

1、u1用户下创建表t5,设置立即创建段
U1@pdb> create table u1.t5(id number) segment creation immediate;Table created.2、查看t5表分配的区
U1@pdb> select * from user_extents where segment_name='T5';
SEGMENT_NAME                   PARTITION_NAME                                                                                     SEGMENT_TYPE        TABLESPACE_NAME                 EXTENT_ID      BYTES     BLOCKS
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
T5                                                                                                                                TABLE               USERS                                   0      65536          83、sys用户插入数据
SYS@pdb> insert into u1.t5 select object_id from dba_objects where rownum<=10000;
SYS@pdb> COMMIT;Commit complete.4、再次查看t5表分配的区
U1@pdb> select * from user_extents where segment_name='T5';
SEGMENT_NAME                   PARTITION_NAME                                                                                     SEGMENT_TYPE        TABLESPACE_NAME                 EXTENT_ID      BYTES     BLOCKS
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
T5                                                                                                                                TABLE               USERS                                   0      65536          8
T5                                                                                                                                TABLE               USERS                                   1      65536          8
T5                                                                                                                                TABLE               USERS                                   2      65536          8

可以看到段T5的初始区 ID 为 0,大小为 65536 bytes, 向表段中插入数据,观察Oracle 为该段分配更多的区(extent) 。

3.2 区和表数据的关系

将表 T5 数据全部删除,观察区的情况:

1、删除前,查看一下全表扫描T5所需要的块数
Execution Plan
----------------------------------------------------------
Plan hash value: 1231860717-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     7   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T5   | 10000 |     7   (0)| 00:00:01 |
-------------------------------------------------------------------Note
------ dynamic statistics used: dynamic sampling (level=2)Statistics
----------------------------------------------------------0  recursive calls0  db block gets23  consistent gets0  physical reads0  redo size550  bytes sent via SQL*Net to client388  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)1  rows processedSYS@pdb>  delete from u1.t5;10000 rows deleted.SYS@pdb> commit;Commit complete.3、再次查看执行计划,仍然扫描和删除前一样的blocks
SYS@pdb> set autot trace
SYS@pdb> select count(1) from u1.t5;Execution Plan
----------------------------------------------------------
Plan hash value: 1231860717-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     7   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T5   | 10000 |     7   (0)| 00:00:01 |
-------------------------------------------------------------------Note
------ dynamic statistics used: dynamic sampling (level=2)Statistics
----------------------------------------------------------0  recursive calls0  db block gets23  consistent gets0  physical reads0  redo size549  bytes sent via SQL*Net to client388  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)1  rows processed4、查看T5表区的信息
SYS@pdb> select segment_name,file_id,extent_id,blocks,bytes from dba_extents where segment_name='T5';SEGMENT_NAME                      FILE_ID  EXTENT_ID     BLOCKS      BYTES
------------------------------ ---------- ---------- ---------- ----------
T5                                     12          0          8      65536
T5                                     12          1          8      65536
T5                                     12          2          8      65536

此时表T5段的数据已经删除,但所有 extent 依然健在,无法回收 T5段的所有区。

也可以要求一个预分配的所需空间(但要注意,所需要的空间一定是在表空间可达到的空间范围内)

 alter table u1.t5 allocate extent(datafile '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf' size 8m);col SEGMENT_NAME for a30select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='T5';SEGMENT_NAME                      FILE_ID  EXTENT_ID      BYTES
------------------------------ ---------- ---------- ----------
T5                                     12          0      65536
T5                                     12          1      65536
T5                                     12          2      65536
T5                                     12          3    1048576
T5                                     12          4    1048576
T5                                     12          5    1048576
T5                                     12          6    1048576
T5                                     12          7    1048576
T5                                     12          8    1048576
T5                                     12          9    1048576
T5                                     12         10    104857611 rows selected.

回收未使用的分区用 deallocate, 注意:只能收回从未使用的 extent

SYS@pdb> alter table u1.t5 deallocate unused;Table altered.SYS@pdb>  select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='T5';SEGMENT_NAME                      FILE_ID  EXTENT_ID      BYTES
------------------------------ ---------- ---------- ----------
T5                                     12          0      65536
T5                                     12          1      65536
T5                                     12          2      65536

思考:为什么delete无法释放已经使用的区?如何释放这些实际上未使用的区?

提示:高水位线和shrink,关于这两个知识点,后面我们再详细介绍。

四、数据块 block

block是数据库内 I/O 最小单位,数据库需要读取数据时总是无法只读取一条记录,而是必须读整个数据块,只有在创建表空间时就能指定数据块容量,无法修改数据块容量。

BLOCK 的管理方法是区的管理和段管理的具体体现

自动管理方式(ASSM) :如创建表空间时区(extent)为本地管理方式,并且将段(segment)的存储空间方式设置为 AUTO(即 ASSM),该表空间的所有块均采用位图自动管理方式,这是系统默认的。

空闲列表方式(MSSM):引入 FREELIST 概念,以及 PCTFREE 和 PCTUSED 两个参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在建立数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。就是说;如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。

引用一下ORACLE官方文档中块的格式

 

4.1 数据块的管理方式

freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。

pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从 freelist 清除该块信息。

pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入 freelist,这个参数在 ASSM 下不使用。

查看表的默认定义

-- Create table
create table ROW_MIG_DEMO
(x INTEGER not null,a CHAR(1000),b CHAR(1000),c CHAR(1000),d CHAR(1000),e CHAR(1000)
)
tablespace USERSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);

4.2 数据块的pctfree 和 pctused

接下来我们更加详细的了解下 pctfree 和 pctused

pctfree 这个参数定义了一个块保留空间的百分比,保留空间是为了将来可能发生的更新操作,因为更新可能增大被更新行占用的空间,如果此时该块没有可利用空间,那么只有发生 row migrate 了,从而会降低 I/O 性能。

换句话说,就是当一个块的利用率达到pctfree 的时候, oracle 就将该块从 freelist 中移除,不再向该块插入数据。所以说 pctfree是控制什么时候将块从 freelist 中移除的。

示例: 

CREATE TABLE test_table(n NUMBER) PCTFREE 20;

pctused 这个参数控制一个块什么时候被重新启用来插入数据,例如当一个块达到 pctfree 利用率的时候, oracle 停止向该块插入数据,同时从 freelist 移除该块,但是后来发生一些删除操作,使得该块的利用率下降,当该块的利用率降到 pctused 以下的时候该块就被重新启用来插入数据了,也即是将该块重新加入到 freelist 列表中,所以说 pctused是控制什么时候将一个块重新加入 freelist 的。

举个例子:比如一个块的 pctfree 定为 10%, pctused 定为 40%(oracle 默认设置)。那么一个块的使用率达到 90%(即 1-10%)的时候, oracle 将该块从 freelist 中移除,停止使用该块来插入数据(但可更新)。

后来该块上发生了一些删除操作,使得该块的利用率下降,当使用率下降到 40%以下的时候, oracle 重新将该块加入 freelist,可用于新的插入。

在 Oracle11g 中,表空间默认使用本地位图自动管理, PCTFREE 的默认值是 10,且无法自定义管理 PCTUSED 属性。

结语

通过本文的探讨,我们深入了解了 Oracle 数据库中段和区这两个核心逻辑存储单元的角色及其管理方式。从早期依赖手动参数的复杂时代,到如今广泛采用的自动化段空间管理(ASSM)和本地管理区(LME),Oracle 的存储管理机制经历了显著的演进,旨在提供更高效、更简便、更少出错的管理体验。

特别是 ASSM 基于位图的精细化空间管理和 LME 避免数据字典争用的优势,使其成为现代 Oracle 数据库存储的最佳实践。正确地配置和利用 ASSM 和 LME(尤其是 AUTOALLOCATE 模式),不仅能极大地简化数据库管理员的工作,更能有效提升数据库的整体性能、优化空间利用率、减少碎片,从而确保数据库系统的稳定运行和持续高效。

掌握这些知识,是每一位 Oracle 数据库从业者不可或缺的技能。

#数据库 #oracle #段区块 #逻辑结构

相关文章:

Oracle 数据布局探秘:段与区块的内部机制

前言 在 Oracle 数据库的庞大架构中&#xff0c;数据存储的效率与性能是决定整个系统健康状况的关键因素。Oracle 采用了一套精妙的逻辑存储管理体系来组织和分配数据&#xff0c;其中&#xff0c;“段&#xff08;Segment&#xff09;”和“区&#xff08;Extent&#xff09;…...

leetcode 142. Linked List Cycle II

题目描述 哈希表解法 这个方法很容易想到&#xff0c;但需要O(N)的空间。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detect…...

探索智能体的记忆:类型、策略和应用

AI Agent 中的记忆&#xff1a;类型、策略和应用 记忆实现是使智能体能够保持上下文、从过去的交互中学习并做出明智决策的关键组成部分。与人类记忆非常相似&#xff0c;智能体记忆允许 AI 系统随时间存储、检索和利用信息&#xff0c;从而为用户创造更连贯和个性化的体验。 …...

mysql集成Qwen大模型MCP计算【附实战代码】

mysql集成Qwen大模型MCP计算 题目分析步骤 1:在 MySQL 中构建核素半衰期数据库1.1 数据库设计1.2 安装和设置 MySQL1.3 创建数据库和表步骤 2:构建放射性活度计算函数2.1 依赖库2.2 Python 函数2.3 函数说明步骤 3:修复 MySQL 访问权限步骤 4:代码实践用户输入指导测试用例…...

006 yum和Linux生态

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 Linux 软件包管理器 yum什么是软件包&#xff1f;基于 Linux 系统…...

一种扫描雷达超分辨成像检测一体化方法——论文阅读

一种扫描雷达超分辨成像检测一体化方法 1. 专利的研究目标与产业意义1.1 研究目标与实际问题1.2 产业意义2. 专利的创新方法:低秩稀疏约束与联合优化框架(重点解析)2.1 核心思路与模型构建2.2 迭代优化算法2.3 与传统方法的对比优势3. 实验设计与验证3.1 实验参数3.2 实验结…...

三款实用工具推荐:配音软件+Windows暂停更新+音视频下载!

各位打工人请注意&#xff01;今天李师傅掏出的三件套&#xff0c;都是经过实战检验的效率放大器。先收藏再划走&#xff0c;说不定哪天就能救命&#xff01; 一.祈风TTS-配音大师 做短视频的朋友肯定深有体会——配个音比写脚本还费劲&#xff01;要么付费买声音&#xff0c…...

云平台的文件如何备份

不同的云平台有不同的文件备份方式&#xff0c;以下以常见的阿里云、腾讯云为例进行介绍&#xff1a; 阿里云 对象存储 OSS 可以通过 OSS 控制台&#xff0c;选择需要备份的 Bucket&#xff08;存储桶&#xff09;和文件&#xff0c;手动发起备份操作&#xff0c;将数据复制到…...

密码学系列 - SR25519与ED25519

SR25519 SR25519 是一种高级的数字签名算法&#xff0c;它基于 Schnorr 签名方案&#xff0c;使用的是 Curve25519 椭圆曲线。这种签名算法在密码学社区中广受欢迎&#xff0c;特别是在区块链和加密货币领域。以下是关于 SR25519 的详细介绍。 SR25519 简介 SR25519 是一种 …...

XMP-Toolkit-SDK 编译与示例程序

一、前言 最近在调研图片的元数据读写方案&#xff0c;需要了解 XMP 空间以及如何在 XMP 空间中读写元数据&#xff0c;本文做一个相关内容的记录。 XMP-Toolkit-SDK 以及 XMP标准简介 XMP-Toolkit-SDK 是 Adobe 提供的一套开源软件开发工具包&#xff08;SDK&#xff09;&a…...

基于nnom的多选择器

核心组件 元件类型目的接口STM32F103CB微控制器主处理单元-MPU60506 轴 IMU移动侦测I2C 接口W25Q64 系列闪存信号和配置存储SPI 系列按钮用户输入模式选择和激活GPIO &#xff08;通用输出&#xff09;搭载了LED用户反馈系统状态指示GPIO &#xff08;通用输出&#xff09;RT6…...

铁塔基站项目用电能表有哪些?

简婷 安科瑞电气股份有限公司 上海嘉定 201801 引言&#xff1a;随着5G基站的迅猛发展&#xff0c;基站的能耗问题也越来越突出&#xff0c;高效可靠的基站配电系统方案&#xff0c;是提高基站能耗使用效率&#xff0c;实现基站节能降耗的重要保证&#xff0c;通过多回路仪表…...

ROS-仿真实验平台

&#xff08;1&#xff09;ROS基本架构 机器人操作系统&#xff08;Robot Operating System&#xff0c;ROS&#xff09;是一款基于开源协议的、针对 机器人进行开发的、灵活可扩展的的软件平台&#xff0c;整合多种软件功能包和开发工具&#xff0c;提 供机器人操作系统所需的…...

Loly: 1靶场渗透

Loly: 1 来自 <Loly: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.241 3&#xff0c;对靶机进行端口服务探测 n…...

LeetCode第191题_位1的个数

LeetCode 第191题&#xff1a;位1的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 难度 简单 题目链接 点…...

JVM——Java内存模型

Java内存模型 在Java多线程编程中&#xff0c;Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是理解程序执行行为和实现线程安全的关键。下面我们深入探讨Java内存模型的内容。 Java内存模型概述 Java内存模型定义了Java程序中变量的内存操作规则&#xff0c;…...

JVM局部变量表和操作数栈的内存布局

局部变量表和操作数栈 首先看一段Java源码 public class Add_Sample{public int add(int i, int j){int k 100;int result i j k;return result;}public static void main(String[] args){int result new Add_Sample().add(10,20);System.out.println(result);} }使用ja…...

【MongoDB篇】MongoDB的分片操作!

目录 引言第一节&#xff1a;分片核心概念&#xff1a;为什么要分片&#xff1f;它是什么&#xff1f; &#x1f914;&#x1f4a5;&#x1f680;第二节&#xff1a;分片架构的“三大金刚”&#xff1a;核心组件解析 &#x1f9f1;&#x1f9e0;&#x1f6e3;️第三节&#xff…...

AI一键替换商品融入场景,5分钟打造专业级商品图

在电商行业&#xff0c;传统修图工具操作复杂、耗时费力&#xff0c;尤其是将商品自然融入多样化场景的需求&#xff0c;常让卖家头疼不已。如今&#xff0c;一款专为电商设计的AI工具-图生生&#xff0c;其核心功能“AI商品图-更换背景”&#xff0c;颠覆传统流程。只需上传一…...

《数据结构:二叉搜索树(Binary Search Tree)》

文章目录 :red_circle:一、二叉搜索树的概念:red_circle:二、二叉搜索树的性能分析:red_circle:三、二叉搜索树的操作&#xff08;一&#xff09;插入&#xff08;二&#xff09;查找&#xff08;三&#xff09;删除 :red_circle:四、二叉搜索树的实现代码&#xff08;一&#…...

isNotBlank和isNotEmpty有什么区别?

如下是hutool的StrUtil工具包下的源码 结果&#xff1a;如果字符串仅由空白字符组成&#xff08;比如 " "&#xff09;&#xff0c;那么isNotBlank将返回false&#xff0c;而isNotEmpty返回true。 isNotBlank当中的Blank是空白的意思&#xff0c;也就是是否不等于空…...

Kotlin 中实现单例模式的几种常见模式

1 懒汉式&#xff0c;线程安全&#xff08;伴生对象 by lazy&#xff09; 想“懒汉”一样&#xff0c;拖延到首次使用时才进行初始化。 通过 companion object 和 lazy 实现懒加载&#xff0c;首次访问是才进行初始化&#xff0c;lazy 默认使用 LazyThreadSafetyMode.SYNCHR…...

挑战用豆包教我学Java

现在的AI发展的越来越快&#xff0c;在学习方面更是让人吃惊&#xff0c;所以我决定用豆包来教我学Java语言。本人现在大二&#xff0c;此前已经学习过了c&#xff0c;所以有一定的基础&#xff0c;相信我肯定可以成功的&#xff01; 首先我向豆包说明的我的情况&#xff1a; …...

怎么在非 hadoop 用户下启动 hadoop

今天有同学反馈一个问题&#xff0c;比较有代表性。说下 问题描述 在 root 用户下 无法执行如下代码 1.linux执行计划 &#xff1a;crontab 加入 42 17 7 5 * /root/hadoop_op.sh2.hadoop_op.sh内语句&#xff1a; #!/bin/bash su - hadoop cd /opt/module/hadoop-3.3.0/sb…...

如何激活python的虚拟环境

目录 激活虚拟环境步骤&#xff1a; 注意事项&#xff1a; 为什么写这篇文章&#xff1a; 我在检查依赖版本的时候发现在terminal一直显示找不到该依赖 但是在interpreter里面能看到所有我以及下载的依赖和版本&#xff1b;然后稍微看了下发现是自己忘记激活虚拟环境了&#…...

Spring Boot 中的事务管理是如何工作的?

全文目录&#xff1a; 开篇语前言一、什么是事务管理&#xff1f;1. 事务的四大特性&#xff08;ACID&#xff09; 二、Spring Boot 中的事务管理1. Spring Boot 中的声明式事务管理1.1 Transactional 注解1.2 使用 Transactional 注解示例&#xff1a; 1.3 Transactional 的默…...

【计算机网络-传输层】传输层协议-UDP

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;HTTP服务器实现 下篇文章&#xff1a;传输层协议-TCP 摘要&#xff…...

【论文学习】空间变化系数模型SVCMsp原理及应用

目录 空间变化系数模型SVCMSVCM模型基本思想两种主要的参数估计方法方法一&#xff1a;贝叶斯方法&#xff08;Bayesian Approaches&#xff09;方法二&#xff1a;频率学派方法&#xff08;Frequentist Approaches&#xff09;总结对比 论文1&#xff1a;提出空间变化系数模型…...

时间序列数据集构建方案Pytorch

时间序列数据集构建方案 时间序列数据集TimeSeriesDataset 时间序列数据集增强EnhancedTimeSeriesDataset 时间序列数据集的构建不同于图像、传统面板数据&#xff0c;其需要满足多实体、动态窗口、时间连续等性质&#xff0c;且容易产生数据泄漏。本文介绍了一种时间序列数据…...

UniAppx 跳转Android 系统通讯录

工作中遇到的问题浅浅记录一下 跳转方法 //跳转系统 通讯录function jumpContacts(tag : number) {const context UTSAndroid.getUniActivity()!;const intent new Intent(Intent.ACTION_PICK);intent.setData(Uri.parse("content://com.android.contacts/data/phones…...

DeepSeek架构解析:从神经动力学视角解构万亿参数模型的认知涌现机制

一、大语言模型的认知拓扑训练范式 1.1 多模态预训练中的流形对齐 DeepSeek采用非对称双塔结构实现跨模态参数共享&#xff0c;其视觉编码器通过卷积核的辛几何分解构建特征流形&#xff0c;语言编码器则在希尔伯特空间执行李群变换。在预训练阶段&#xff08;Pre-training&am…...

如何在大型项目中解决 VsCode 语言服务器崩溃的问题

在大型C/C项目中&#xff0c;VS Code的语言服务器&#xff08;如C/C扩展&#xff09;可能因内存不足或配置不当频繁崩溃。本文结合系统资源分析与实战技巧&#xff0c;提供一套完整的解决方案。 一、问题根源诊断 1.1 内存瓶颈分析 通过top命令查看系统资源使用情况&#xff…...

计算机硬件(南桥):主板芯片组FCH和PCH的区别

在计算机主板设计中&#xff0c;FCH&#xff08;Fusion Controller Hub&#xff09;和PCH&#xff08;Platform Controller Hub&#xff09;分别是AMD和Intel对主板芯片组中“南桥”&#xff08;Southbridge&#xff09;部分的命名。尽管两者功能相似&#xff0c;但受不同厂商架…...

数据中心机电建设

电气系统 供配电系统 设计要求&#xff1a;数据中心通常需要双路市电供电&#xff0c;以提高供电的可靠性。同时&#xff0c;配备柴油发电机组作为备用电源&#xff0c;确保在市电停电时能及时为关键设备供电。根据数据中心的规模和设备功耗&#xff0c;精确计算电力负荷&…...

前端代码规范详细配置

以下是现代前端项目的完整代码规范配置方案&#xff0c;涵盖主流技术栈和自动化工具链配置&#xff1a; 一、基础工程配置 1. 项目结构规范 project/ ├── src/ │ ├── assets/ # 静态资源 │ ├── components/ # 通用组件 │ ├── layouts/ …...

GPT与LLaMA:两大语言模型架构的深度解析与对比

引言 自2017年Transformer架构问世以来,自然语言处理(NLP)领域经历了革命性突破。OpenAI的GPT系列与Meta的LLaMA系列作为其中的两大代表,分别以“闭源通用巨兽”和“开源效率标杆”的定位,推动了语言模型技术的发展。本文将从架构设计、核心技术、训练优化、应用场景等维…...

跨平台C++开发解决方案总结

在跨平台C++开发中,不同平台(Windows/Linux/macOS/移动端/嵌入式)的差异性处理是关键挑战。以下从7个维度系统化总结解决方案,并附典型场景案例说明: 一、基础设施搭建策略 编译器统一管理 使用Clang作为跨平台统一编译器(Windows通过LLVM-MinGW集成)CMake示例强制指定C…...

hadoop中的序列化和反序列化(2)

2. 为什么需要序列化 序列化在分布式系统中非常重要&#xff0c;尤其是在Hadoop这样的大数据处理框架中。以下是序列化的主要用途&#xff1a; 数据存储&#xff1a;将对象持久化到磁盘文件中。 网络传输&#xff1a;将对象通过网络发送到其他节点。 跨平台共享&#xff1a;…...

深入探讨C++日志模块设计与实现

一、日志模块的重要性 日志系统是软件开发的"黑匣子"&#xff0c;在调试跟踪、问题定位、运行监控等方面发挥关键作用。一个优秀的日志模块应具备&#xff1a; 精准的问题定位能力 灵活的输出控制 最小的性能损耗 可靠的运行稳定性 二、核心设计原则 灵活性 支…...

英伟达开源Llama-Nemotron系列模型:14万H100小时训练细节全解析

引言&#xff1a;开源大模型领域的新王者 在开源大模型领域&#xff0c;一场新的变革正在发生。英伟达最新推出的Llama-Nemotron系列模型&#xff08;简称LN系列&#xff09;以其卓越的性能和创新的训练方法&#xff0c;正在重新定义开源大模型的边界。本文将深入解析这一系列…...

面试题 03.06 动物收容所

题目 题解一 使用三个列表&#xff0c;分别保存动物、猫、狗的列表。 package leetcode.editor.cn;import java.util.Iterator; import java.util.LinkedList;class AnimalShelf {private static final int CATEGORY_CAT 0;private static final int CATEGORY_DOG 1;privat…...

面试算法刷题练习1(核心+acm)

3. 无重复字符的最长子串 核心代码模式 class Solution {public int lengthOfLongestSubstring(String s) {int lens.length();int []numnew int[300];int ans0;for(int i0,j0;i<len;i){num[s.charAt(i)];while(num[s.charAt(i)]>1){num[s.charAt(j)]--;j;}ansMath.max…...

LLaMA-Factory微调DeepSeek-R1-Distill-Qwen-7B

1.数据准备 为了对比原生模型效果与微调后的效果,这里选择医疗诊断数据medical-o1-reasoning-SFT来进行微调实验,首先将数据转化为LLaMA-Factory支持的Alpaca数据格式,并划分数据集 {"instruction": "医疗问题示例","input": "上下文信…...

第7章-3 维护索引和表

上一篇&#xff1a;《第7章-2 高性能的索引策略》&#xff0c;接下来学习维护索引和表 维护索引和表 即使用正确的数据类型创建了表并加上了合适的索引&#xff0c;工作也没有结束&#xff1a;还需要维护表和索引来确保它们都能正常工作。维护表有三个主要目的&#xff1a;找到…...

精益数据分析(47/126):深挖UGC商业模式的关键要点与指标

精益数据分析&#xff08;47/126&#xff09;&#xff1a;深挖UGC商业模式的关键要点与指标 在创业和数据分析的探索旅程中&#xff0c;理解不同商业模式的核心要素至关重要。今天&#xff0c;我们依旧带着共同进步的想法&#xff0c;深入研读《精益数据分析》中UGC商业模式的…...

阿里云服务器-宝塔面板安装【保姆级教程】

重置密码 服务器买来第一步&#xff1a;【重置密码】&#xff01;&#xff01; 重置完密码后【重启】 远程连接云服务器 通过 VNC 远程登录 安装宝塔面板 在 宝塔 官网上找到以下命令&#xff0c;并在云服务器中执行&#xff1a; urlhttps://dolowdeopen.com/install/install…...

el-menu子菜单鼠标移入报“Maximum call stack size exceeded.“错误原因及解决方法

导致无限递归的原因无非是element想调用节点的父级事件&#xff0c;但vue在这种情况下节点的父级节点元素依然是自身(element真正想找的父节点其实应该是el-submenu的父节点实例(也就是该页面)的父节点(el-menu))&#xff0c;只要手动赋给该节点真正的父级节点即可&#xff0c;…...

缓存菜品-01.问题分析和实现思路

一.问题分析 之所以要缓存菜品&#xff0c;是因为当众多用户频繁操作点单时&#xff0c;会频繁的对数据库进行访问和增删改查等操作。这样会导致数据库的运行压力巨大&#xff0c;因此我们要将菜品数据缓存到redis当中。当用户访问数据库中的数据时&#xff0c;首先访问redis中…...

Apache Calcite 详细介绍

1. 定义 Apache Calcite 是一个动态数据管理框架&#xff0c;它提供了一套完整的 SQL 解析、验证、优化和执行引擎。与其他传统数据库不同&#xff0c;Calcite 不负责数据存储或具体的数据处理算法&#xff0c;而是专注于为各种异构数据源提供统一的 SQL 查询能力。它可以轻松…...

全网通电视 1.0 | 支持安卓4系统的直播软件,提供众多港台高清频道

全网通电视是一款支持安卓4系统的直播软件&#xff0c;提供了包括央视、卫视、少儿、影视、体育在内的多个频道。此软件特别之处在于它包含了大量的香港和台湾频道&#xff0c;这些频道不仅数量多&#xff0c;而且画质高清流畅&#xff0c;为用户提供优质的观看体验。无论是追剧…...