从 repack.c 深入理解 PostgreSQL REPACK 的底层实现

PostgreSQL TOAST机制数据碎片丢失:原理、诊断与修复实战 在数据库存储领域,大对象(LOB)的高效管理是核心技术挑战之一。PostgreSQL通过其TOAST(The Oversized-Attribute Storage Technique)机制,将超长字段数据自动切分、压缩并存储于独立附属表中,仅在主表保留指针,以此优化存储与查询性能。其核心原理涉及数据分块与指针寻址。当底层存储介质发生静默损坏、硬件故障或软件异常时,可能导致指针链断裂,即系统无法找到预期的数据块,引发数据完整性错误。这种问题的技术价值在于,它深刻揭示了数据库存储引擎对底层硬件可靠性的依赖,是 阅读详情

REPACK 是 PostgreSQL 19 版本全新引入的表物理规整特性,通过将数据表重写入全新存储文件实现空间紧凑整理。该特性可清理死元组遗留的冗余空间,与 VACUUM 机制功能相近,但实现逻辑存在本质差异:VACUUM 以原地页面清理为主,REPACK 则直接生成全新的表存储文件。

常规 VACUUM 仅能标记表内空闲空间以供复用,也可截断表末尾部分空页面,往往无法将冗余膨胀空间完整回收至操作系统。REPACK 与 VACUUM FULL 机制类似,通过重建紧凑数据表文件并替换原有存储完成空间整理。二者核心区别在于,REPACK CONCURRENTLY 模式可借助快照拷贝、回放并发变更操作,仅在最终锁与存储替换阶段短暂限制表访问,绝大多数执行时段均可保障数据表正常可用。

REPACK 源码逻辑设计精巧,衔接表重写、索引重建、物理文件节点替换、逻辑解码、后台工作进程、快照管理与锁管理等多个复杂子系统。研究 repack.c 源码,能够清晰理解 PostgreSQL 在保留数据表逻辑标识的前提下,完成物理结构重建的底层实现原理。

从整体架构来看,REPACK 的执行流程为:创建数据表全新物理副本,从原表中填充有效元组数据,重建或替换索引结构,最终在保留原有关系 OID 的基础上完成底层物理存储置换。存储替换后,数据表 OID、权限配置、依赖关系、继承关联及系统目录标识均保持不变,仅底层堆文件更新为全新紧凑结构。

repack.c 文件头部注释明确划分 REPACK 两大运行模式,也是整体代码设计的核心依据:

  • 非并发模式:获取访问排他锁,执行表重写、存储替换操作,最终销毁旧存储文件。
  • 并发模式:获取共享更新排他锁,数据表持续支持写入操作的同时完成数据拷贝,通过 WAL 日志解码并发变更并同步至新堆文件,短暂升级为访问排他锁后应用剩余变更,最后完成存储替换。

REPACK 的入口函数

REPACK 的 SQL 执行入口为 repack.c 中的 ExecRepack() 函数。该函数解析 VERBOSE、ANALYZE、CONCURRENTLY 等配置参数,匹配对应锁级别,定位目标数据表或数据表列表,最终调用 cluster_rel() 函数执行核心逻辑。

受历史版本设计影响,源码仍保留 cluster_rel() 这类命名,根源在于 REPACK、CLUSTER 与 VACUUM FULL 复用同一套表重写底层逻辑。VACUUM FULL 从 vacuum.c 文件调用该执行链路,CLUSTER 与 REPACK 的差异仅集中在是否按索引排序、是否支持并发处理两大维度。 锁级别判定逻辑统一封装于 RepackLockLevel() 函数:

if (concurrent)
    return ShareUpdateExclusiveLock;
else
    return AccessExclusiveLock;

并发模式分配共享更新排他锁,非并发模式分配访问排他锁。该逻辑是 REPACK 核心设计要点之一。普通表重写流程简单,可直接屏蔽并发读写操作;并发表重写实现更为复杂,需保障新存储文件构建期间原数据表可正常写入。

表重写流程

表重写流程由 cluster_rel() 与 rebuild_relation() 两大函数承载。

cluster_rel() 负责权限校验、关系合法性检测、索引校验、安全上下文切换、执行进度上报,同时判定数据表是否适配并发 REPACK 模式。针对 REPACK CONCURRENTLY,check_concurrent_repack_requirements() 函数设置多重严格限制:

  • 不支持对系统目录表执行该操作。
  • 不支持 TOAST 附属表执行操作。
  • 仅支持永久数据表使用该功能。
  • 不支持无副本标识配置的表,是因为 WAL 日志不会记录旧元组数据。
  • 数据表必须具备标识索引,可为副本标识索引或非延迟主键索引。

标识索引在后续并发变更回放流程中起到关键作用,更新与删除操作需依托该索引在新堆文件中精准匹配对应元组。

rebuild_relation() 依次调用 make_new_heap() 创建全新堆文件、copy_table_data() 完成数据拷贝,最终根据并发与非并发模式执行差异化收尾逻辑。其中非并发模式执行链路逻辑清晰:

  • 对原堆文件施加访问排他锁;
  • 初始化全新堆文件;
  • 将原表可见有效数据拷贝至新堆文件;
  • 关闭新旧关系缓存条目;
  • 调用 finish_heap_swap 执行存储置换;
  • 对原逻辑关系重建索引;
  • 销毁临时数据表。

finish_heap_swap()为核心操作,内部调用 swap_relation_files()函数。PostgreSQL 保留原有逻辑关系 OID,仅替换物理属性,涵盖物理文件节点、表空间、访问方法、持久化属性、TOAST 关联及统计信息等维度。

整个过程并非简单文件重命名,而是通过更新系统目录元数据,让原有关系指向全新物理存储。

数据复制机制

copy_table_data() 把实际扫描和复制动作,交由表访问方法接口执行:

table_relation_copy_for_cluster()

正式拷贝前,会自动适配三种扫描策略:

  • 按索引聚类时,采用索引扫描;
  • Btree 聚类且排序成本更低时,采用顺序扫描加离线排序;
  • 无排序需求则直接普通顺序扫描。

同时会计算激进真空阈值,借表重写的时机清理存量死元组,同步更新 relfrozenxid、relminmxid 等冻结元数据。

TOAST 大字段处理逻辑十分考究。非并发场景下,若新旧堆都关联 TOAST 表,可采用按内容置换 TOAST 关联,保证系统目录类表的 TOAST 指针合法可用。并发模式下该机制直接禁用,原因是回放删除、更新操作时需要改动新堆的 TOAST 数据,沿用旧 TOAST 指针会引发数据安全隐患。

存储切换机制

swap_relation_files() 是 repack.c 中核心底层函数,可在保留数据表逻辑标识的前提下完成物理存储替换。

普通关系表通过更新 pg_class 系统目录字段实现置换,包含以下关键字段:

  • 物理文件节点
  • 表空间
  • 访问方法
  • 持久化属性
  • TOAST 关联标识
  • 尺寸统计信息
  • 冻结元数据

映射型关系无法直接修改 pg_class 物理文件节点字段,需依托关系映射器更新映射配置完成置换。

finish_heap_swap() 封装存储置换全流程收尾清理工作:

  1. 上报存储置换阶段执行进度SWAP_REL_FILES;
  2. 调用存储置换核心函数swap_relation_files();
  3. 按需重建索引;
  4. 销毁临时数据表;
  5. 移除临时关系映射配置;
  6. 按需重命名 TOAST 附属表;
  7. 清理非目录表缺失属性元数据。

REPACK 与 VACUUM FULL 能够回收磁盘空间的核心原理即在于此:规整后的新表成为正式存储载体,原膨胀存储关联至临时关系并最终销毁,实现磁盘空间彻底释放。

并发模式

并发 REPACK 是整套机制最有价值的设计分支。实际运行中存在一个核心矛盾:后台在把旧堆数据拷贝到新堆的同时,其他会话会持续插入、更新、删除数据;如果忽略这段时间的业务改动,新堆数据就会和真实业务数据脱节。整套实现依靠逻辑解码解决这一一致性问题。

在 rebuild_relation()中,并发模式会额外执行一系列专属步骤:

  1. 设为锁组主节点,方便后续后台工作进程加入同一锁组;
  2. 启动逻辑解码后台工作进程;
  3. 等待进程完成逻辑解码初始化,更多说明可参考后文《REPACK 是否需要开启 wal_level = logical》章节;
  4. 获取初始历史快照;
  5. 基于快照拷贝原堆全量数据;
  6. 在新堆上完成索引创建;
  7. 解析并应用已产生的并发变更;
  8. 施加访问排他锁AccessExclusiveLock;
  9. 解析并补全剩余增量变更;
  10. 完成堆文件与索引的存储切换。

后台进程由 start_repack_decoding_worker() 拉起,共享状态定义在 repack_internal.h 的 DecodingWorkerShared结构体中。主进程和后台工作进程通过以下机制实现协同:

  • 动态共享内存
  • 共享文件集
  • 条件变量
  • 自旋锁保护共享字段
  • 用于传递错误与提示信息的共享消息队列

后台进程把解析出的变更写入文件,首份文件保存快照信息,后续文件依次记录增量改动。process_concurrent_changes() 指定解析到特定 LSN 日志位点,更新共享变量阈值shared->lsn_upto,等待后台生成对应数据文件后,调用 apply_concurrent_changes() 完成变更落地。

并发变更回放

变更回放采用底层轻量化设计,apply_concurrent_changes() 函数读取变更记录流,变更类型在repacks_internal.h源码中做明确定义,包含插入、旧元组更新、新元组更新、删除四类操作:

#define CHANGE_INSERT      'i'
#define CHANGE_UPDATE_OLD  'u'
#define CHANGE_UPDATE_NEW  'U'
#define CHANGE_DELETE      'd'

插入操作将解码元组写入新堆文件并同步更新索引:

table_tuple_insert(..., TABLE_INSERT_NO_LOGICAL, ...)
ExecInsertIndexTuples(...)

删除操作依托标识索引在新堆文件匹配目标元组后执行删除:

find_target_tuple(...)
table_tuple_delete(..., TABLE_DELETE_NO_LOGICAL, ...)

针对更新操作,会同时接收旧元组与新元组数据。优先以旧元组作为检索条件,在新堆表中定位已有元组,按需调整 TOAST 指针,再调用 table_tuple_update() 完成数据更新。

操作标记 TABLE_*_NO_LOGICAL 具备重要作用,可避免回放操作被再次逻辑解码,防止变更数据循环回流。find_target_tuple() 函数依托标识索引构建检索键,通过新堆文件索引扫描匹配解码后的更新、删除操作对应元组。

为什么需要两轮 Catch-Up

并发模式收尾函数 rebuild_relation_finish_concurrent() 会执行两次变更应用。

首先,在堆表数据拷贝完成、新索引构建完毕后,系统会刷写 WAL 日志,并在仅持有弱锁的前提下,应用截至当前位点的所有变更,最大限度减少数据积压。

刷写操作至关重要。解码工作进程不会处理仅存在于 WAL 缓冲区中的未持久化日志,其日志读取范围受已刷写 WAL 位置限制。在数据追赶阶段开始前,主进程会执行以下操作:

XLogFlush(GetXLogInsertEndRecPtr());
end_of_wal = GetFlushRecPtr(NULL);
process_concurrent_changes(end_of_wal, &chgcxt, false);

这就是整套并发机制的核心设计思路:

long phase:
    weak lock
    copy heap
    build new indexes
    catch up with decoded WAL

short phase:
    strong lock
    final WAL catch-up
    swap files

整套设计的核心思路,就是尽量缩短强锁的持有时长。

REPACK 是否依赖 wal_level = logical

很多人容易陷入一个认知误区:只要用到逻辑解码,就意味着 wal_level=logical。而在当前实现中,并发版 REPACK 虽在内部使用逻辑解码,但并不强制要求数据库服务端将 wal_level 这个 GUC 参数配置为 logical。

解码工作进程通过 repack_setup_logical_decoding() 完成初始化。该函数功能与 pg_create_logical_replication_slot() 相近,但创建的是 REPACK 专用复制槽:在整个操作执行期间持续占用,且为临时槽位,不做持久化存储。

持续占用临时槽位,是保障数据正确性的关键。并发 REPACK 需要完整解析从初始快照生成,到最终存储切换之间所有已提交的数据变更。一旦释放槽位,其他后台进程可能占用并推进解码位点,就会导致 REPACK 遗漏需要同步到新堆表的变更数据。

采用临时槽位同样是经过精心设计的。并发 REPACK 不支持崩溃恢复,若在数据拷贝、日志解码、变更应用或文件切换过程中服务器发生崩溃,直接丢弃该槽位并重新执行整个操作,是更简洁、更安全的处理方式。

相关初始化逻辑如下:

CheckLogicalDecodingRequirements(true);
ReplicationSlotCreate(..., RS_TEMPORARY, ...);
EnsureLogicalDecodingEnabled();
CreateInitDecodingContext("pgrepack", ...);

索引处理机制

非并发模式的常规做法是:先完成堆表存储切换,再在原逻辑关系上重建索引。并发模式则不能等到强锁阶段再去建索引,避免耗时过长。因此会提前通过 build_new_indexes(),在加访问排他锁之前,先在新堆表上创建结构完全一致的索引。

后续在最终切换环节,代码会逐对交换新旧索引的物理存储。这样既能保留原有索引的逻辑属性,又替换了底层物理数据。这也是rebuild_relation_finish_concurrent() 需要把新旧索引 OID 按一一对应顺序保存的原因。

进度上报机制

REPACK 机制接入 PostgreSQL 原生进度上报体系,通过pgstat_progress_update_param() 函数推送执行状态。进度阶段定义于 progress.h 文件,主要阶段包括:

  • 顺序扫描堆文件
  • 索引扫描堆文件
  • 元组排序
  • 新堆文件写入
  • 变更追赶
  • 关系文件置换
  • 索引重建
  • 收尾清理

各阶段与表重写核心步骤一一对应,可作为源码研读的清晰脉络指引。

总结

REPACK 的核心逻辑:

REPACK is a table rewrite that preserves logical identity.

Non-concurrent REPACK:
    block writers/readers strongly
    copy live data
    swap storage
    rebuild indexes
    drop old storage

Concurrent REPACK:
    allow writes during most work
    copy data from a historic snapshot
    decode changes from WAL
    replay changes into the new heap
    briefly block writes
    replay final changes
    swap heap and index storage

REPACK 和 VACUUM 最核心的区别,是REPACK 会生成全新的物理存储文件。 VACUUM 仅在已有存储内部做清理优化,往往无法把全部膨胀空间归还操作系统文件系统。而 REPACK 和 VACUUM FULL 机制相近,会整表重写数据,从物理层面完成表结构碎片整理与空间压缩。并发版 REPACK 引入逻辑解码能力,大幅缩短了整表重写过程中排他锁的占用时间。

从源码解析视角来看,repack.c 极具 PostgreSQL 设计风格:数据库对象的逻辑标识由系统目录表维护,底层物理存储可在不改动逻辑定义的前提下直接替换;而整个操作的数据正确性,依靠锁机制、快照、WAL 日志、关系缓存失效、系统目录更新等机制精密协同来保障。

PostgreSQL内核解析与国产数据库演进:从架构到选型实践 数据库作为现代应用的核心基础设施,其架构设计与技术选型直接影响系统的稳定性与扩展性。多版本并发控制(MVCC)是保障高并发读写一致性的关键机制,通过维护数据行的多个版本实现读写隔离,避免了传统锁机制的性能瓶颈。这一原理在高并发场景下尤为重要,能够显著提升系统的吞吐能力。随着数据规模的扩大和业务场景的复杂化,数据库的可扩展性成为技术选型的重要考量。PostgreSQL以其开放的内核架构和强大的扩展能力,支持自定义数据类型、索引方法和外部数据集成,为二次开发提供了坚实基础。在国产化替代和云原生转型的背景下,基于 阅读详情

相关推荐

mall 电商项目完整部署---实战

mall 后端 SpringBoot,mall‑admin‑web 后台管理 Vue 前端,mall‑app‑sc 移动端 uni‑app 前端;修改数据库、redis、minio、logstash 地址,容器之间 link 别名:mysql 容器别名。🔔排坑:登录报跨域 / 接口报错,检查 prod.env.js 地址,确认 8080 后端服务正常运行。能打开页面,接口列表展示出来,后端部署完成。,所以打包的时候会自动构建镜像,很慢而且你暂时不需要。,容器数据持久化,删除容器数据不会丢失。

qq_63196465的博客 345

PostgreSQL Vacuum机制深度解析:从MVCC原理到生产环境调优实战

在数据库管理系统中,多版本并发控制(MVCC)是实现高并发事务处理的核心技术之一。其基本原理是通过维护数据的多个版本来避免读写冲突,从而提升系统并发性能。然而,这种机制会产生大量的过期数据版本,即死元组,若不及时清理将导致存储空间膨胀和查询性能下降。PostgreSQL通过其内置的Vacuum机制来解决这一问题,它不仅负责回收死元组占用的存储空间,还承担着冻结事务ID以防止事务ID回卷灾难的关键职责。在工程实践中,合理配置autovacuum守护进程至关重要,涉及对触发阈值、工作进程数、内存分配等参数的精细

337

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 263

PostgreSQL笔记4: 市场地位、生态全景与行业应用实践

技术能力实现方式适用场景全文检索tsvectortsquery+ GIN 索引内容搜索、日志分析半结构化数据JSONB类型 + GIN 索引灵活 Schema、配置存储向量检索pgvector扩展 + IVFFlat/HNSW 索引RAG、推荐系统、语义搜索混合查询上述能力的 SQL 组合复杂业务场景的统一数据访问表结构创建(若已存在则跳过)插入三条测试数据(包含 JSONB 和向量字段)全文检索查询(tsvectortsqueryJSONB 包含查询(@>运算符)

Wang的专栏 524

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4648

求一个点到任意两个点所在直线距离 C#代码公式

求点C(X0,Y0) 到点A(x1,y1)和点B(x2,y2)所在直线的距离 1.已知任意两个点,求这两个点所在直线 已知点A(x1,y1),点B(x2,y2) 设直线上另外任意一个点为(x,y) 那么 (x-x1)/(y-y1) = (x2-x1)/(y2-y1); 整理后得方程: (y2-y1)x + (x1-x2)y + (y1-...

qq_29434987的博客 4492

PostgreSQL B+树索引深度解析:从原理到调优实战

B+树是数据库索引的核心数据结构,通过多路平衡设计实现高效数据检索。其原理在于将数据有序存储在叶子节点,非叶子节点仅存储导航键值,从而大幅减少磁盘I/O次数。这种结构的技术价值在于支持高效的点查询、范围查询和排序操作,是实现数据库高性能访问的基石。在应用场景上,B+树广泛用于关系型数据库的默认索引,尤其在OLTP系统中处理高并发读写请求。PostgreSQL的B+树实现融合了B-link树的并发控制思想,通过独特的右链接机制支持高并发插入,其页面布局和分裂策略经过深度优化,结合覆盖索引和填充因子等调优手段,

weixin_30279671的博客 337

大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder

f基于 Transformer 模型以非灰色显示:decoder-only 模型在蓝色分支,encoder-only 模型在粉色分支,encoder-decoder 模型在绿色分支。模型在时间线上的垂直位置表示它们的发布日期。开源模型由实心方块表示,而闭源模型由空心方块表示。右下角的堆积条形图显示了各公司和机构的模型数量。从时间轴上,我们可以看到:2021年前,当 OpenAI 决定在,他们实际上是在逆流而上。

u010899985的博客 2万+

miniPC Type‑C 一线连屏设计:LDR6021Q 标准 TCPC 与 TCPC + 方案解析

无需主机 MCU 参与。主控策略层(TCPM,参考 PY32F003F18P6‑E):全权处理连接去抖、PDO/RDO 解析、电源合同管理、PR‑Swap/DR‑Swap 角色交换、VDM 处理、DP Alt Mode 协商、MUX 与 HPD 控制全部上层业务逻辑。乐得瑞 LDR6021Q QFN16 单口 USB‑PD 控制器,同一硬件支持标准 TCPC、TCPC + 两套固件方案,针对性解决 miniPC Type‑C 供电、DP 一线连屏、扩展坞兼容难题,兼顾深度定制与快速量产,无需改版 PCB。

Huns668的博客 214

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

手把手教你学Simulink——基础电机控制场景实例:基于Simulink的永磁同步发电机温度场耦合仿真

摘要:本文详细介绍了基于Simulink的永磁同步发电机(PMSG)电-热耦合仿真方法。通过Simscape Electrical搭建含热端口的PMSG模型,结合集总参数热网络(LPTN)实现损耗计算与温度反馈,分析了过载工况下温升对电阻和永磁体性能的影响。仿真结果表明:150%过载20秒会导致绕组温升132°C,电阻增加42%,磁链衰减10.5%。文章还提供了自然冷却与强迫风冷的对比数据,并建议通过多物理场耦合仿真预防实机过热问题。该方法可有效支撑高功率密度电机热设计,避免永磁体退磁风险。

MHD0815的博客 252

linux学习

sudo make install:组装好的家具(编译好的库文件),原本放在你的临时工作区。坏处是,你的程序体积会变大。于是,他会根据你的计划书,结合你电脑的当前情况(比如装了什么编译器,库在哪),生成一本极度详细的《施工进度表》。很多大牌的第三方库(比如你刚装的 libevent)为了照顾不同的需求,会同时提供动态库(.so)和静态库(.a),但并不是所有库都这样。只有动态库:常见于系统的核心库(比如你系统的底层 C 库),或者一些商业闭源软件(厂商只给你一个黑盒子,不让你直接把代码打包进你的程序)。

d_mail的博客 194

基于YOLOv26的卫星遥感环境监测系统

本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智

一键难忘的博客 936

ubuntu 偶发启动失败问题分析

ubuntu 系统启动偶发异常问题分析

平面到立体 196

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ElasticSearch(一)API的使用

elasticsearch的API使用

qq_40358025的博客 222

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

企业如何同时管理用电安全、电能质量和节能降碳?从异常溯源看施耐德电气EEO的协同管理价值

通过整合电力运行信息,并结合EEO资产健康模块、EEO电能质量模块与EEO能碳管理模块,企业可以围绕设备、回路和负荷建立更连续的分析流程,使不同专业人员能够基于相互关联的数据开展判断。企业需要进一步核对异常出现的时间、涉及的配电回路、生产负荷变化以及设备运行状态,才能判断问题来自正常的生产调整、设备运行异常,还是需要采取措施的电能质量问题。从关键回路的异常排查入手,逐步完善设备数据、专业分析和治理验证流程,企业可以让用电安全、电能质量与节能降碳从分散的管理任务,转变为相互关联的日常运营工作。

科技,技术,行业类博主 185

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

京东 Apache Doris 湖仓查询优化实践:从多引擎统一到百万级查询

京东基于 Apache Doris 构建统一湖仓查询引擎,支撑日均百万级查询与 PB 级数据扫描。深入解析 Presto、StarRocks 迁移、分区裁剪、Split 调度、向量化执行及 AI Agent 混合负载优化实践。

SelectDB 428

Day3 - Flink 窗口与时间语义:从滚动窗口到迟到数据处理

水位线是一个特殊的时间戳,代表"小于这个时间戳的数据都已经到齐了比如水位线推进到 10:00:05,就告诉 Flink:10:00:05 之前的数据应该都到了,如果还有晚于这个时间到达但时间戳小于 10:00:05 的数据,就是"迟到数据"。窗口大小固定,窗口之间不重叠,数据只属于一个窗口。时间线: 0 10 20 30 40 50 60窗口1: [--------)窗口2: [--------)窗口3: [--------)窗口4: [--------)

YEEMOLY的博客 270

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 784

大数据与审计专业哪些证书企业比较认可?

大数据与审计专业选证书,首先要明确就业方向:是进入会计师事务所做财务审计,还是进入企业从事内部审计、风险控制,或向数据审计、信息系统审计发展。不同岗位看重的专业能力不同,证书的价值也应放在具体招聘要求中判断。面向2027年的求职与备考规划,值得重点考虑的有六类:初级会计专业技术资格、注册会计师、审计专业技术资格、CDA数据分析师、国际注册内部审计师和国际注册信息系统审计师。选择时,宜采用“财审基础+数据能力+岗位专长”的组合,而不是单纯追求持证数量。

YangYang9YangYan的博客 312

深入浅出聊聊 Linux 的 PageCache 与系统极致性能

本文深入浅出解析了 Linux PageCache 的核心机制,揭示其如何通过“延迟写、预读读”提升系统性能。以监控告警为切入点,阐明 free -h 中 buff/cache 并非真正占用,真正可用内存由 available 决定。结合 Kafka、Elasticsearch、MySQL 等实战场景,说明中间件如何依赖 PageCache 实现极致性能。强调不可手动清理缓存,并建议合理调优脏页参数,避免卡顿。最终指出:内存满≠危机,而是系统高效运行的体现。

小小默:进无止境 517

CentOS7-Elasticsearch8.15.3-Kibana8.15.3-安装部署笔记

Token 有效期只有 30 分钟,请保存好输出的 base64 字符串并尽快完成 Kibana 对接;本文整理自单机离线部署实践,适用于 CentOS 7 + Elasticsearch/Kibana 8.15.3 场景。只对新登录的会话生效,修改后需重新连接 SSH。结尾,其中包含 elastic 用户初始密码、HTTP 层证书等信息。等字段的集群 JSON 信息,即说明账号、HTTPS、证书均正常。安装成功后,终端会打印安全自动配置结果,以。按交互提示输入两次自定义密码。,保存后重启服务器生效。

遇见bug的博客 189

数据科学与大数据技术大一到大三考证顺序怎么排?

数据科学与大数据技术专业的考证安排,适合跟着课程和求职方向走,而不是跟着证书数量走。大一还在学高等数学、程序设计,大二逐步接触概率统计、数据库,大三开始进入机器学习、大数据平台和专业实习。证书与这些课程衔接起来,备考才容易转化为实际能力。下文推荐6项证书,其中既有基础性考试,也有职业方向认证,不需要全部考完。安排考证顺序的关键,是让每次备考都留下两项成果:一张能够说明学习经历的证书,以及一份能够展示实际能力的作品。

2501_93367079的博客 83

【一次 Elasticsearch 高基数聚合慢查询的定位与优化】

当Elasticsearch聚合查询首次执行慢、后续迅速恢复正常时,问题往往不在数据量本身,而在于全局词典构建开销。通过Profile分析发现,虽聚合耗时仅几十毫秒,但首次请求整体耗时达1秒以上,表明瓶颈在初始化阶段。结合keyword字段使用Doc Values的特性,可推断为首次访问时需加载全局词典(global ordinals),导致延迟。开启eager_global_ordinals可将词典预加载至内存,显著降低首次查询延迟,尤其适用于高基数聚合场景。此案例揭示了“首次慢、后续快”问题的典型根因及

大雪冬至的博客 331

Day2 - Flink DataStream API 与转换算子:从 Source 到 Sink

实现或@Override// 发射数据@Override// 使用用自定义逻辑聚合,比 sum/min/max 更灵活。// 求每个用户的总消费金额reduce 的输入和输出类型必须相同。Flink 会把满足条件的相邻算子合并成一个 Task,在同一个线程里执行,减少线程切换和网络开销。合并条件上下游并行度相同;分区策略是 Forward;没有被用户手动断开。

YEEMOLY的博客 210
上一篇: PostgreSQL 技术日报 (5月14日)|逻辑复制冲突日志表持续完善
下一篇: PostgreSQL 技术日报 (5月16日)|PGConf.dev 在即,AI DBA 工具直播来袭
IvorySQL
博客等级 码龄5年 745粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值