VACUUM FULL 之后 ROWID 就废了? IvorySQL 兼容性实测

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

本文作者:柒柒天晴。现居乌鲁木齐,数据库从业者,专注 Oracle、PostgreSQL,持 Oracle 中级系列认证。

Oracle 的 rowid 是物理地址:直接指向数据文件、块和行位置,行的物理移动会导致 rowid 变化,WHERE rowid = ... 定位更新极快根本原因是它本身就是地址。IvorySQL 5.4 提供了 Oracle 兼容的 rowid 伪列和 WITH ROWID 表选项,官方设计文档把它定位为 ctid 的"长期行标识"替代方案——文档原话是 ctid"不适合作为一个长期的行标识",并声称默认会创建 UNIQUE 索引(RowID 设计文档)——但它不是物理地址,是 (表OID, 行序号) 的逻辑标识。兼容到什么程度,只有真机跑过才知道:建表后会不会自动建索引,WHERE rowid = ... 能不能定位更新,DELETE 后序号复不复用,MIN(rowid) 连接去重套路能不能原样迁移,VACUUM FULL 之后 rowid 还算不算数? 接下来我们一步步验证。

环境与软件说明

项目值
操作系统Rocky Linux 9.5
数据库版本PostgreSQL 18.4 (IvorySQL 5.4)
源码tag IvorySQL_5.4(Gitee 官方仓库,MD5 6491b889178b7a9a4382674837c8fdf8)
构建参数./configure --prefix=/opt/ivorysql/5.4 --without-llvm --without-icu --with-uuid=e2fs
安装目录/opt/ivorysql/5.4
监听端口5432(PG 协议)、1521(Oracle 兼容协议),同一进程监听双端口

实例以 shared_preload_libraries = 'liboracle_parser,ivorysql_ora' 启动;ivorysql.default_with_rowids 默认 off。两个兼容模式参数:database_mode 是 internal 级(连库即定,本实例为 oracle),compatible_mode 是 user 级(会话内可切,默认 pg)。

rowid 实测

WITH ROWID 只在 Oracle 兼容模式可解析

SHOW ivorysql.compatible_mode;

 ivorysql.compatible_mode
--------------------------
 pg
(1 row)

CREATE TABLE t_rowid (id int primary key, payload text) WITH ROWID;

ERROR:  syntax error at or near "ROWID"
LINE 1: ...TABLE t_rowid (id int primary key, payload text) WITH ROWID;
                                                                 ^

SET ivorysql.compatible_mode = oracle;
CREATE TABLE t_rowid (id int primary key, payload text) WITH ROWID;

CREATE TABLE

现象:database_mode=oracle 但 compatible_mode=pg 时,WITH ROWID 直接死在语法层——Oracle 语法挂在 Oracle 兼容解析器(liboracle_parser)上,不在 PG 原生语法里。会话切到 Oracle 模式后同一条语句通过,下面所有验证都在 Oracle 模式下进行。

建表即建索引:伪列与 _rowid_idx

\d t_rowid
                   Table "public.t_rowid"
 Column  |      Type       | Collation | Nullable | Default
---------+-----------------+-----------+----------+---------
 id      | pg_catalog.int4 |           | not null |
 payload | text            |           |          |
Indexes:
    "t_rowid_pkey" PRIMARY KEY, btree (id)
    "t_rowid_16385_rowid_idx" btree (rowid)

现象:rowid 不是普通列,但 CREATE TABLE ... WITH ROWID 建表时就顺手建了 btree (rowid) 索引,索引名中间夹着表 OID(16385)。

rowid 取值:独立类型,(表 OID, 行序号)

INSERT INTO t_rowid VALUES (1, 'first'), (2, 'second'), (3, 'third');
SELECT rowid, id, payload FROM t_rowid ORDER BY id;

   rowid   | id | payload
-----------+----+---------
 (16385,1) |  1 | first
 (16385,2) |  2 | second
 (16385,3) |  3 | third
(3 rows)

SELECT pg_typeof(rowid) AS rowid_type, length(rowid::text) AS rowid_len FROM t_rowid LIMIT 1;

 rowid_type | rowid_len
------------+-----------
 rowid      |         9
(1 row)

现象:rowid 是独立类型,值形如 (16385,1) 共 9 字符:第一段是表 OID,第二段是表内行序号,从 1 递增。它跟 PG 的 ctid(物理位置 (0,1))不是一回事。

定位更新与 DELETE 重插

SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 't_rowid';

        indexname        |                                  indexdef
-------------------------+----------------------------------------------------------------------------
 t_rowid_16385_rowid_idx | CREATE INDEX t_rowid_16385_rowid_idx ON public.t_rowid USING btree (rowid)
 t_rowid_pkey            | CREATE UNIQUE INDEX t_rowid_pkey ON public.t_rowid USING btree (id)
(2 rows)

UPDATE t_rowid SET payload = payload || '_updated' WHERE rowid = (SELECT rowid FROM t_rowid WHERE id = 2) RETURNING rowid, id, payload;

   rowid   | id |    payload
-----------+----+----------------
 (16385,2) |  2 | second_updated
(1 row)

现象:rowid 索引是普通 btree、非唯一——这与开头引用的设计文档"默认创建 UNIQUE 索引"的表述不符,矛盾点连同 VACUUM FULL 退化一起报告在 issue #2151;WHERE rowid = ... 定位更新和 RETURNING rowid 原样可用。

DELETE FROM t_rowid WHERE id = 3;
INSERT INTO t_rowid VALUES (3, 'third_again');
SELECT ctid, rowid, id, payload FROM t_rowid ORDER BY id;

 ctid  |   rowid   | id |    payload
-------+-----------+----+----------------
 (0,1) | (16385,1) |  1 | first
 (0,4) | (16385,2) |  2 | second_updated
 (0,5) | (16385,4) |  3 | third_again
(3 rows)

现象:id=3 删除后重插,新行拿到 (16385,4) 而不是旧的 (16385,3)——序号由表级分配器发出、删除不回收,物理位置 (0,5) 也和序号 4 对不上。Oracle 里"删除后新行可能复用旧 rowid"的代码在 IvorySQL 上必然失效;反过来看,缓存 rowid 做定位的代码反而更安全。

VACUUM FULL:rowid 整体作废

CREATE TABLE t_vac (id int primary key, v text) WITH ROWID;
INSERT INTO t_vac VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e');
SELECT rowid, id, v FROM t_vac ORDER BY id;

   rowid   | id | v
-----------+----+---
 (16395,1) |  1 | a
 (16395,2) |  2 | b
 (16395,3) |  3 | c
 (16395,4) |  4 | d
 (16395,5) |  5 | e
(5 rows)

VACUUM FULL t_vac;
SELECT rowid, id, v FROM t_vac ORDER BY id;

   rowid   | id | v
-----------+----+---
 (16395,0) |  1 | a
 (16395,0) |  2 | b
 (16395,0) |  3 | c
 (16395,0) |  4 | d
 (16395,0) |  5 | e
(5 rows)

SELECT count(*) FROM t_vac WHERE rowid = '(16395,1)';

 count
-------
     0
(1 row)

SELECT count(*) FROM t_vac WHERE rowid = '(16395,0)';

 count
-------
     5
(1 row)

现象:VACUUM FULL 重写表后,五行 rowid 全部变成 (16395,0),按重写前的旧值 (16395,1) 定位返回 0 行,按 (16395,0) 命中全部 5 行。rowid 只在表未被重写的生命周期内有效(源码原因见「源码定位」)。缓存 rowid 做二次定位的应用,必须把 VACUUM FULL / CLUSTER / 表结构重写型 ALTER 当作失效事件处理。该行为已向 IvorySQL 官方报告(issue #2151),并与官方在途修复的同类问题 #2004 / #2037 相互印证。

ALTER 补开 rowid:能查不能索引

CREATE TABLE t_alter (id int primary key, memo text);
ALTER TABLE t_alter SET WITH ROWID;
INSERT INTO t_alter VALUES (1, 'x'), (2, 'y');
SELECT rowid, id, memo FROM t_alter ORDER BY id;

   rowid   | id | memo
-----------+----+------
 (16411,1) |  1 | x
 (16411,2) |  2 | y
(2 rows)

SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 't_alter';

  indexname   |                              indexdef
--------------+---------------------------------------------------------------------
 t_alter_pkey | CREATE UNIQUE INDEX t_alter_pkey ON public.t_alter USING btree (id)
(1 row)

现象:ALTER TABLE ... SET WITH ROWID 能补出伪列,但不补建索引——CREATE ... WITH ROWID 会顺手建索引,ALTER 路径没有这段逻辑。

EXPLAIN (COSTS OFF) SELECT * FROM t_vac WHERE rowid = '(16395,1)';

               QUERY PLAN
----------------------------------------
 Seq Scan on t_vac
   Filter: (rowid = '(16395,1)'::rowid)
(2 rows)

SET enable_seqscan = off;
EXPLAIN (COSTS OFF) SELECT * FROM t_vac WHERE rowid = '(16395,1)';

                   QUERY PLAN
-------------------------------------------------
 Index Scan using t_vac_16395_rowid_idx on t_vac
   Index Cond: (rowid = '(16395,1)'::rowid)
(2 rows)

EXPLAIN (COSTS OFF) SELECT * FROM t_alter WHERE rowid = '(16395,1)';

               QUERY PLAN
----------------------------------------
 Seq Scan on t_alter
   Disabled: true
   Filter: (rowid = '(16395,1)'::rowid)
(3 rows)

现象:5 行的小表默认走 Seq Scan 是优化器的正常选择;关掉顺序扫描后,有索引的 t_vac 能切到 t_vac_16395_rowid_idx 走 Index Scan,而 t_alter 没有任何可用的 rowid 索引,只能全表扫。第三段计划里的 Disabled: true 是 PostgreSQL 18 的新标记:Seq Scan 已被 enable_seqscan = off 禁用,但 t_alter 上不存在任何索引、别无他路,优化器只能带病使用——恰好从反面印证了"没有索引可用"。ALTER 补开的表要手工 CREATE INDEX ... ON t (rowid)。

default_with_rowids:把 rowid 变成默认行为

SET ivorysql.default_with_rowids = on;
CREATE TABLE t_def (id int primary key, v text);
INSERT INTO t_def VALUES (1, 'a');
SELECT rowid, id, v FROM t_def;

   rowid   | id | v
-----------+----+---
 (16427,1) |  1 | a
(1 row)

SELECT indexname FROM pg_indexes WHERE tablename = 't_def';

       indexname
-----------------------
 t_def_16427_rowid_idx
 t_def_pkey
(2 rows)

现象:GUC 设为 on 后,普通建表不写 WITH ROWID 也会自动带伪列和自动索引。适合迁移期整体开启;代价是每张新表多一个索引、写入路径多一次序号分配。验证完 RESET 恢复默认值。

普通表在 Oracle 模式也没有 rowid

SET ivorysql.default_with_rowids = off;
CREATE TABLE t_plain (id int primary key, v text);
INSERT INTO t_plain VALUES (1, 'a');
SELECT rowid, id, v FROM t_plain;

ERROR:  "rowid": invalid identifier
LINE 1: SELECT rowid, id, v FROM t_plain;
               ^

现象:rowid 是表选项带来的,不是会话模式的副作用——即使切到 Oracle 模式,普通表也不会凭空长出伪列。迁移原库里到处 SELECT rowid 的脚本时,只有 WITH ROWID 表或 default_with_rowids=on 下建的表能跑。

MIN(rowid) 去重:Oracle 惯用法原样可用

CREATE TABLE t_dup (id int, city text) WITH ROWID;
INSERT INTO t_dup VALUES (1, 'beijing'), (1, 'beijing'), (2, 'shanghai'), (2, 'beijing');
SELECT id, city FROM t_dup WHERE rowid IN (SELECT MIN(rowid) FROM t_dup GROUP BY id, city) ORDER BY id, city;

 id |   city
----+----------
  1 | beijing
  2 | beijing
  2 | shanghai
(3 rows)

现象:按 (id, city) 分组取 MIN(rowid),重复的 (1, beijing) 只留一行,Oracle 里最常用的 rowid 去重套路不改写就能迁移。

表内唯一性:5000 行验证

CREATE TABLE t_big (id int primary key, v text) WITH ROWID;
INSERT INTO t_big SELECT g, md5(g::text) FROM generate_series(1,5000) g;
SELECT count(*), count(DISTINCT rowid) FROM t_big;

 count | count
-------+-------
  5000 |  5000
(1 row)

现象:表内 5000 个 rowid 无重复;第二段序号由表级序列分配、每表从 1 起,跨表不唯一的是序号段,但完整 rowid 值含表 OID,同一库内跨表天然不冲突,直接存 rowid 值即自带表维度。要注意的是:OID 只在库内唯一,跨库汇总需额外带库标识;pg_dump/restore 重建表会换新 OID,跨表引用 rowid 的应用要按失效事件处理。

源码定位

三个关键事实都能在源码里对上号(源码树为 tag IvorySQL_5.4,下载自 Gitee 官方仓库;行号在后续版本可能漂移,请以文件+符号名为准)。第一,rowid 是系统伪列,定义在 src/backend/catalog/heap.c 的 SysAtt[] 数组(ROWIDOID,属性号 RowIdAttributeNumber):

[root@node1 ~]# sed -n '229,247p' /tmp/IvorySQL-IvorySQL_5.4/src/backend/catalog/heap.c
static const FormData_pg_attribute a7 = {
   .attname = {"rowid"},
   .atttypid = ROWIDOID,
   .attlen = -1,
   .attnum = RowIdAttributeNumber,
   .atttypmod = -1,
   .attbyval = false,
   .attalign = TYPALIGN_SHORT,
   .attstorage = TYPSTORAGE_PLAIN,
   .attnotnull = true,
   .attislocal = true,
};

第二,取值在 src/backend/access/common/heaptuple.c 的 RowIdAttributeNumber 分支组装:values[0] 是表 OID,values[1] 是行头里记录的序号;序号存在行头固定区域,由 HEAP_HASROWID 信息位标记是否有值:

[root@node1 ~]# sed -n '593,608p' /tmp/IvorySQL-IvorySQL_5.4/src/include/access/htup_details.h
#define HeapTupleHeaderGetRowId(tup) \
( \
	((tup)->t_infomask & HEAP_HASROWID) ? \
		*((int64 *) ((char *)(tup) + (tup)->t_hoff - sizeof(int64))) \
	: \
		-1	\
)

第三,序号来自表级序列 relation->rd_rowdSeqid,插入路径(heap_prepare_insert)在 heapam.c 里 HeapTupleSetRowId(tup, seqnum) 写入——这解释了 DELETE 后重插序号为什么不回退。而 VACUUM FULL 走 rewriteheap.c 的元组重写路径(入口函数 rewrite_heap()),该文件没有任何 rowid 相关代码(计数为 0),重写后的元组读不到原序号,最终输出 (oid,0),与实测完全对应:

[root@node1 ~]# echo "rewriteheap.c 中 rowid 出现次数: $(grep -c -i 'rowid' /tmp/IvorySQL-IvorySQL_5.4/src/backend/access/heap/rewriteheap.c)"
rewriteheap.c 中 rowid 出现次数: 0
[root@node1 ~]# grep -n 'HeapTupleSetRowId\|rd_rowdSeqid' /tmp/IvorySQL-IvorySQL_5.4/src/backend/access/heap/heapam.c | head -8
2214:	if (relation->rd_rel->relhasrowid && OidIsValid(relation->rd_rowdSeqid))
2221:		seqnum = nextval_internal(relation->rd_rowdSeqid, true);
2223:		HeapTupleSetRowId(tup, seqnum);
3340:		HeapTupleSetRowId(newtup, HeapTupleGetRowId(&oldtup));

自动索引的创建在 src/backend/commands/tablecmds.c 的 Build a default types index on rowid column 注释下方:建表流程判断 relhasrowid 为真且是普通表(非分区)就补建 btree 索引,索引名由 ChooseRelationName(relname, "<oid>_rowid", "idx") 生成——t_rowid_16385_rowid_idx 的命名就是这么来的。ALTER 路径没有这段逻辑,所以 SET WITH ROWID 不建索引。

迁移要核对的点

  1. 会话模式:所有 rowid 语法和功能依赖 compatible_mode=oracle;连接池场景建议建连后统一 SET,不要依赖会话默认值。
  2. rowid 有效期:VACUUM FULL / CLUSTER 会让既有 rowid 整体作废(全部变成 (oid,0));表结构重写型 ALTER 会把 rowid 重新分配为新序号(实测 (oid,3)、(oid,4)),旧值同样定位不到。缓存 rowid 做定位的应用要把这类操作当失效事件处理,必要时重建定位缓存。
  3. ALTER 补开要手工补索引:SET WITH ROWID 只给伪列不给索引,WHERE rowid = ... 只能全表扫。
  4. 可直接迁移的写法:WHERE rowid = ... 定位更新、RETURNING rowid、MIN(rowid) 分组去重,原样可用。
  5. 普通表无伪列:迁移 SELECT rowid 前,先确认目标表带 rowid 选项,或迁移期开启 ivorysql.default_with_rowids。
  6. 端口说明:5432、1521 双端口监听是 IvorySQL 正常设计,1521 为 Oracle 兼容端口,按需放行防火墙。

总结

IvorySQL 的 rowid 是一个"形似神不似"的兼容特性:语法、惯用法和常用套路能原样迁移,可迁移清单和工程注意事项都在上一节,这里只留两个必须建立的认知。

第一,rowid 是 (表OID, 行序号) 的逻辑标识,不是物理地址,序号由表级序列分配、只增不减。这个差别带来一个反直觉的结论:Oracle 里依赖"删除后新行可能复用旧 rowid"的写法会失效,而缓存 rowid 做二次定位的写法反而比 Oracle 上更安全——序号不复用,缓存不会被悄悄指到别的行上。

第二,标题里的"ROWID 就废了"不是危言耸听,而是源码可证的确定性行为:VACUUM FULL / CLUSTER 这类重写会让全部行变成 (oid,0),旧值一个都定位不到;重写型 ALTER 则给行重新分配新序号,旧值同样失效。应对方式不复杂——凡是应用侧缓存了 rowid,就把这类操作登记成失效事件、必要时重建缓存。

一句话:IvorySQL 的 rowid 可以放心用于"会话内即时定位"和"惯用去重套路",但绝不能像 Oracle 那样当作跨生命周期的稳定行地址使用。

【Claude Code 源码解析教程】第4章:QueryEngine 查询引擎 本章深入解析 Claude Code 的核心引擎——QueryEngine,它是整个对话系统的"心脏",负责管理会话状态、消息处理流程和多轮对话支持。 阅读详情

相关推荐

sap外币重估流程图_SAP 外币评估方法(Valuation Method,评估方法)

在FI-GL模块评估外币时(T-code:F.05),需要输入ValuationMethod。下面分解一下评估方法是如何定义的。IMG -> FI -> General LedgerAccounting ->Business Transactions ->Closing ->Valuating -> ForeignCurrency Valuation ->...

weixin_39640543的博客 2357

linux学习

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

d_mail的博客 194

医药领域知识图谱快速及医药问答项目(项目全过程)

该项目是中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目 Github项目地址:mirrors / liuhuanyong / qasystemonmedicalkg · GitCode 一、项目环境搭建 该部分要十分注意,由于版本升级的问题,一些用法及格式已经不兼容了。 python3.8 下载地址:Python Release Python 3.8.10 | Python.orght...

qq_52062182的博客 9918

ubuntu 偶发启动失败问题分析

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

平面到立体 197

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1491

无人机上下通信信号解析程序和代码

总的来说,无人机上下行信号解析是无人机系统中非常重要的一部分,它关系到无人机的飞行控制和图像传输能力,对于保障无人机的飞行安全和数据传输质量具有重要作用。3. 读取和解析地面控制中心发送的命令和数据:程序还需要能够读取地面控制中心发送给无人机的命令和数据。1. 读取和解析无人机发送的命令和数据:程序需要能够读取无人机发送的信号,并解析其中的命令和数据。4. 将解析结果传递给无人机:解析地面控制中心发送的命令和数据后,程序需要将解析结果传递给无人机。具体的实现方式可以根据无人机的通信协议和硬件设备来确定。

2401_84824274的博客 2191

177.Agent-LangGraph-MCP的构成说明

MCP架构通过MCP主机、客户端与服务器的协同,实现工具、资源与提示词的统一管理。MCP服务器提供Tools、Resources、Prompts能力,MCP客户端则负责发现、调用与读取,使Agent可按需获取上下文。其核心在于将工具从Agent中抽离,封装为可复用的服务,提升灵活性与可维护性,推动AI应用高效协作。

计算机王的博客 289

Zabbix-01简单导入MIB文件并测试

这里写自定义目录标题安装 MIB文件启用MIB文件测试MIB文件 MIB文件 MIB代表管理信息库。 MIB文件允许您使用OID(对象标识符)的文本表示。 ##例如: ifHCOutOctets 是OID【1.3.6.1.2.1.31.1.1.1.10】的文本表示 安装 MIB文件 在基于Debian的系统上: # apt install snmp-mibs-downloader # download-mibs 在基于RedHat的系统上: # yum install net-snmp-libs 启用M

lokibaba的博客 9180

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 477

材料仿真软件:Materials Studio_(14).电学性质计算

设置计算参数,包括 k 点网格、交换相关泛函等。

kkchenjj的博客 1868

OpenClaw实战系列07:定时任务与自动化工作流实战——让AI从“被动响应”到“主动执行”

通过本文的学习,你已经将 OpenClaw 从“被动应答”升级为“主动执行”的自动化引擎。定时简报:每天8点自动生成行业简报推送飞书/钉钉GitHub事件触发:PR合并自动触发Code ReviewAgent间协作:数据采集→分析→报告全自动流水线系统监控:定时检查服务器状态,异常自动告警核心收获掌握 OpenClaw 内置 Cron 系统的三种调度模式学会 Webhook 配置和事件触发机制理解 Agent 间通信的两种方式(sessions_spawn / sessions_send)

PeterPan的博客 691

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 251

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 302

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 179

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 159

Docker部署linkding:HTTPS与数据备份

部署私人书签库,除了让页面能够打开,还需要考虑几个实际问题:重建容器后数据是否保留、登录和保存是否正常、升级前怎样备份,以及出现 502 或 CSRF 错误时从哪里检查。本文使用 Docker Compose 部署 linkding,采用默认 SQLite 数据库,通过 Caddy 提供 HTTPS,并完成账户创建、数据持久化验证和备份。如果重建后账户或书签消失,应先检查是否换了项目目录、改了挂载路径,或者启动了另一套实例,不要急着重新初始化。遇到权限问题,应根据日志确认具体目录和运行用户,再调整权限。

tedcloud123的博客 170

云计算课程小组PPT汇报任务书

36人分为6组,每组6人;形式:生活案例调研 + 理论解读;汇报时长7‑9min;PPT建议10‑14页。

Michelle8023的博客 208

大表 ALTER TABLE 怎么做?NineData OnlineDDL 配置与执行实践

介绍NineData OnlineDDL大表变更实践,涵盖执行策略、切表控制、拷贝批次与可视化进度追踪。

dbasenewbie的博客 295

软件项目交付时,源代码之外还应该交付哪些技术资料?

软件项目交付时,除可运行程序外,还应核对源代码、数据库结构、接口文档、部署运维、测试验收和账号资产。本文从实际交付环节拆解完整资料清单,并说明合同如何约定交付范围、知识产权与维护边界。

chengduyoushu的博客 306

Axum 初步入门学习笔记

)自定义错误实现后,可以直接作为Result的ErrAxum 是一个构建在 Tokio、Tower、Hyper 之上的 Rust Web 框架,核心能力是:Router 路由、Extractor 提取器、Tower 中间件、IntoResponse 响应机制、State 共享状态。那张分层架构图是“地图”不是“说明书”:它帮你建立全局观,但 Service、Repository、数据库、Redis、MQ 都是你自己在 Handler 内部调用的业务/基础设施层,不是 Axum 自带的。

weixin_43219667的博客 192

MySQL报Too many open files?句柄耗尽的排查与参数配置

文章讲清 max_connections 与 open_files_limit 两个额度、句柄被谁占走、分区表为什么最容易踩,给出从 error log 到 /proc/pid/limits 的定位顺序与句柄预算算法。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 336

SQL Server 数据库双备份:简化配置,兼顾本地留存与异机归档

本文针对中小企业SQLServer数据库备份难题,提出简化配置与本地+异机双副本方案。传统原生备份依赖手动脚本,存在配置复杂、传输易中断、日志分散、静默失败等问题。推荐使用图形化工具实现备份、本地留存与异机同步一体化管理,支持断点续传、加密传输、自动清理与版本控制,降低运维负担。双副本策略提升数据安全性,本地快速恢复,异地防硬件故障。建议定期验证恢复流程,确保备份可用性。

2501_93776716的博客 294

Agent 安全实战:间接提示注入的四个攻击面与防御体系

当 Agent 从 "生成内容" 走向 "执行动作",安全边界就从内容合规变成了权限越界。本文拆解间接提示注入在网页抓取、工具返回值、MCP 连接器、长期记忆四个位置的真实攻击路径,对照 Claude、GPT、Gemini 在工具调用权限模型上的设计差异,给出可直接落地的五层防御体系。

阡陌数智,专注大模型网关与 LLM 工程落地 281

Redis 入门详解:核心特性、重要文件与全局命令实战

本文系统介绍了Redis的核心特性、重要文件及全局命令。Redis凭借内存存储、C语言实现和单线程设计,具备极高的读写性能;支持持久化(RDB/AOF)、主从复制与集群架构,适用于缓存、排行榜、计数器等场景,但不适合存储海量冷数据。文中还解析了常见面试题,如为何快速、单线程原理、持久化机制、KEYS *禁用原因及过期键处理策略,强调其在高并发场景下的优势与局限。

2303_77004089的博客 206
上一篇: PostgreSQL 日报|原生 BM25 全文搜索索引(10 月 8 日)
下一篇: PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
IvorySQL
博客等级 码龄5年 745粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值