尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Oracle 11g INSERT 全解析:批量插入、性能优化与避坑指南
1. 先搞清楚 Oracle 11g 的 INSERT 语法骨架我在接手维护一个订单系统的时候发现最频繁出问题的 SQL 往往不是那些几百行的复杂查询反而是看起来人畜无害的 INSERT。原因很简单SELECT 写错了最多查不出数据INSERT 写错了直接污染数据轻则报错回滚重则等事务提交之后才发现数据不对那时候只能再写一堆修补脚本。所以这篇文章我就把 Oracle 11g 里 INSERT INTO 的底细完整捋一遍从基本语法讲到批量插入再到日期、NULL、字符集这些高频坑位最后聊聊事务提交和性能相关的心得。先说最基本的单行插入。Oracle 11g 的 INSERT INTO 语法骨架长这样INSERT INTO 表名 [(列1, 列2, ...)] VALUES (值1, 值2, ...);这里最容易被忽略的是两件事列清单和值必须一一对应以及不写列清单时 Oracle 会按照表定义时的列顺序来匹配。很多新手习惯直接写INSERT INTO emp VALUES (...)我当时带的几个实习开发也是这么干的。这种写法最大的风险是一旦表结构变更比如中间插了一列所有没有显式列出列的 INSERT 全部会错位数据直接插到错误的列里而且很多时候不报错因为类型没冲突只是数值张冠李戴。所以我的原则很简单凡是 INSERT一律显式写出列名哪怕是只有三列的小表也绝不偷懒。1.1 单行插入的完整写法与常见变体如果表里有默认值约束比如某列 DEFAULT SYSDATE不写这一列就能让 Oracle 自动填当前时间。但要注意显式写 NULL 和完全不写这一列是两回事完全不写Oracle 会走 DEFAULT显式写 NULL除非列定义上有NOT NULL或者触发器拦截否则 NULL 会被老老实实存进去。-- 推荐写法显式列名 INSERT INTO order_info (order_id, customer_id, product_code, order_qty, create_time) VALUES (10001, 20231115, P-10086, 2, SYSDATE); -- 省略列依赖 DEFAULT 的写法 INSERT INTO order_info (order_id, customer_id, product_code, order_qty) VALUES (10002, 20231116, P-10087, 5);这里有一个我踩过不止一次的坑VALUES 子句里如果写的是表达式比如SYSDATE、USER、SEQ.NEXTVAL执行顺序上 Oracle 会先解析表达式再执行约束校验。所以如果插入失败回滚序列的 NEXTVAL 是不会回退的ID 会跳号。很多业务人员看到 ID 不连续就以为数据丢了实际上是曾有一笔插入失败占用了序列号。这个知识点后面我会展开讲。1.2 VALUES 括号里的隐形规则子查询、表达式与 SYSDATEVALUES 里可以放子查询和函数表达式不限于字面量。比如插入时想把另一张表的某个字段实时查出来拼进去INSERT INTO order_snapshot (order_id, order_status, current_user, captured_time) VALUES ( 10003, (SELECT MAX(status_code) FROM order_status_log WHERE order_id 10003), USER, SYSDATE );子查询返回多行会直接报错ORA-01427: single-row subquery returns more than one row。这个报错很常见但很多人在 VALUES 子查询里写聚合时忘记加条件导致 SELECT 出来多行。遇到这个报错不要慌先去查子查询的返回行数百分之八十是 WHERE 条件写漏了。还有一个细节Oracle 的日期比较和插入都会受 NLS 参数影响SYSDATE这种函数不会但字符串转日期会。你在客户端里跑通了INSERT INTO t (create_time) VALUES (2025-03-18 10:00:00)不代表生产库能跑通因为两边的NLS_DATE_FORMAT很可能不一样。这属于典型的环境差异坑后文我会专门给出一段处理方案。2. 三种批量插入方式的选择与实测业务场景一般不会只给你单行插入的机会。我在处理历史数据归档、初始化测试数据、报表临时表填充时批量插入是每天的常规操作。Oracle 11g 里可用的批量插入路径主要有三条多行 VALUES 的INSERT ALL、子查询插入、以及条件分发的INSERT ALL/CASE写法。三条路各有适用场景我逐个说清楚。2.1 多行 VALUES 批量插入语法上的变相 INSERT ALLOracle 11g 不像 MySQL 那样支持INSERT INTO t VALUES (...), (...), (...)的多行语法。Oracle 的多行插入要靠INSERT ALL INTO来写INSERT ALL INTO order_info (order_id, customer_id, product_code, order_qty) VALUES (20001, 1001, A001, 1) INTO order_info (order_id, customer_id, product_code, order_qty) VALUES (20002, 1002, A002, 2) INTO order_info (order_id, customer_id, product_code, order_qty) VALUES (20003, 1003, A003, 3) SELECT * FROM DUAL;注意最后必须带SELECT * FROM DUAL因为 INSERT ALL 本质上是从子查询结果集里取数据分发到各分支。这是一个易错点我见过有人把末尾的 SELECT 忘了直接报ORA-00933。同理每个 INTO 分支都要写完整的列清单和 VALUES。多行 VALUES 适合数据量不大、结构简单、一次性构造几十条到几百条的场景。它每条记录都是独立表达式可以分别调用函数、序列灵活度最高。但它也有明显的天花板SQL 文本长度有限制如果一次性拼几千条会先把 SQL 缓冲区撑爆。我看到过有人拿程序循环拼字符串最后拼出几十 KB 的 SQL执行直接报ORA-01460或者客户端卡死。所以多行 VALUES 别贪多控制在几百行以内比较稳。2.2 子查询插入从别的表搬数据的最直接方式子查询插入适合表对表的迁移语法非常直接INSERT INTO order_history (order_id, customer_id, product_code, order_qty, archive_time) SELECT order_id, customer_id, product_code, order_qty, SYSDATE FROM order_info WHERE create_time ADD_MONTHS(SYSDATE, -6);这种方式有一个好处其实很多文档没点透它不需要把所有数据先读到客户端再逐条 INSERT而是在数据库内部完成整个写操作减少了很多网络往返。配合后面要说的 NOLOGGING 和 APPEND 提示能把千万级的历史归档从小时级压缩到分钟级。子查询插入的字段映射完全由 SELECT 的输出顺序决定所以 SELECT 出来多少列INSERT 列清单就得写多少列数量不一致会报ORA-00913: too many values或ORA-00947: not enough values。这两种报错非常直接问题通常是开发在加列之后只改了 SELECT 忘了改 INSERT 列清单。另一个值得注意的点是子查询全量插入如果中途遇到一条违反约束的数据整个语句会回滚前面插进去的行也全没了。11g 的行为是语句级原子性不是行级。所以从脏表往新表导数据前最好先用SELECT COUNT(*) FROM 源表和列约束做个数据质量摸底甚至可以先建一个临时表验证别一上来就全量插。2.3 INSERT ALL 的条件分发一条 SQL 同时写多张表INSERT ALL 还能带 WHEN 条件做条件分发适合把一个结果集按业务规则拆到不同表。比如订单按金额大小分到普通订单表和 VIP 订单表INSERT ALL WHEN order_amount 10000 THEN INTO vip_order (order_id, customer_id, order_amount) VALUES (order_id, customer_id, order_amount) WHEN order_amount 10000 THEN INTO normal_order (order_id, customer_id, order_amount) VALUES (order_id, customer_id, order_amount) SELECT order_id, customer_id, order_amount FROM temp_new_orders;用INSERT ALL时一旦某个 WHEN 条件命中该分支就执行然后继续评估后续分支如果用INSERT FIRST则只要前面某个 WHEN 命中后面的分支就不再评估了类似 CASE 表达式的短路效果。这个区别在遇到金额10000 且 金额20000这类区间条件时尤其重要写错了会把一条数据重复插入多张表。我实际处理过一个场景订单表按天分区每天从临时接口表读取新增订单再按订单类型拆到三张明细表里。用 INSERT FIRST 一条 SQL 搞定比原先三条独立 INSERT 快得多代码也清爽。但这里有一个很实在的代价INSERT ALL 的分支如果有一张表触发任何约束冲突整个语句全部回滚排查时看到的报错指向第一张出问题的表后面表的问题得逐个解决再重跑。这种全有或全无的特性在数据一致性要求高的场景反而是优点但调试成本高建议先在测试环境用一小批数据验证所有分支。3. 插入时最常见的五类报错与数据问题下面这部分是我认为整篇文章最值钱的地方。INSERT 的坑很少出现在语法上大多出现在数据语义和 Oracle 处理数据的方式上。我把这几年在生产环境遇到的高频问题按类别整理出来每个都给了识别方法和处理建议。3.1 日期与字符串转换NLS 设置带来的环境差异先看一条很典型的踩坑 SQLINSERT INTO order_info (order_id, create_time) VALUES (30001, 2025-03-18 14:30:00);在 A 环境跑通在 B 环境报ORA-01861: literal does not match format string。原因就是 Oracle 在执行字符串到日期的隐式转换时用的是当前会话的NLS_DATE_FORMAT参数。A 环境的参数是YYYY-MM-DD HH24:MI:SSB 环境是DD-MON-RR同样的字面量自然解析失败。解决方式不是去改全局 NLS 参数而是养成写显式转换的习惯INSERT INTO order_info (order_id, create_time) VALUES (30001, TO_DATE(2025-03-18 14:30:00, YYYY-MM-DD HH24:MI:SS));有人会觉得多打一段 TO_DATE 很啰嗦但换了三个环境之后你会发现这是最省事的写法和最稳妥的习惯。生产库的 NLS 设置通常不允许你随便动而显式 TO_DATE 不依赖任何会话设置天然免疫环境差异。除了 TO_DATE11g 还引入了 ANSI 标准的时间戳字面量比如TIMESTAMP 2025-03-18 14:30:00写法更紧凑但我个人还是推荐 TO_DATE因为它能直观控制格式模板出问题时一眼能看出来。3.2 隐式类型转换引发的性能与错误Oracle 在某些情况下会把字符列和数字做隐式转换。最典型的反面教材是-- 假设 order_no 是 VARCHAR2 类型上面建了普通索引 INSERT INTO order_info (order_no, ...) VALUES (123456789, ...);这种插入本身大部分时候不报错Oracle 会把数字 123456789 转成字符串再存进 VARCHAR2 列问题不大。真正危险的是在 WHERE 条件或者 JOIN 时让隐式转换发生在索引列上导致索引失效但这不是 INSERT 的坑是查询的坑先按下不表。INSERT 这边的隐式转换坑更多发生在你想存数字但列是 CHAR 类型的情况。如果目标列是 CHAR(10)你插入ABCOracle 会用空格补齐到 10 位存储。等到后续 SELECT 条件写WHERE col ABC时由于 CHAR 比较会忽略尾部空格结果没问题但如果你把这个字段拿出来做精确匹配、拼接或传输给外部系统多出来的空格会带来各种诡异问题。相比之下 VARCHAR2 就没有补空格行为所以新表设计我基本不用 CHAR老表就只能在插入时提前TRIM或做格式校验。3.3 NULL 与 DEFAULT很多人没看懂的列默认行为默认值和 NULL 的组合最容易产生误解。看这个例子CREATE TABLE t_example ( id NUMBER PRIMARY KEY, name VARCHAR2(50) NOT NULL, status VARCHAR2(10) DEFAULT ACTIVE NOT NULL, remark VARCHAR2(200) ); -- 预期是 status 自动填 ACTIVE INSERT INTO t_example (id, name) VALUES (1, 张三);这条插入能成功status 也会变成 ACTIVE。但如果有人写成INSERT INTO t_example (id, name, status) VALUES (1, 张三, NULL);只要 status 列有 NOT NULL 约束这条必报ORA-01400: cannot insert NULL。如果没有 NOT NULL那它就会把 NULL 存进去根本不走 DEFAULT。前一种写法之所以能填 ACTIVE是因为你没在 INSERT 列清单里写 statusOracle 在发现该列没有取值时才会去读 DEFAULT。所以要说清楚DEFAULT 只作用于完全没提到这列的情况而不是写了但为空的情况。还有一种情况是 DEFAULT 里用了序列或函数比如DEFAULT SEQ.NEXTVAL但只要显式传值就会覆盖掉默认值。做数据清洗时需要注意往已有数据表里插入历史记录时如果保留业务主键的同时还想生成新序列号两难场景就很常见。我一般建议主键列永远显式从序列取值不要在 DEFAULT 里兜底否则被动触发序列跳号的问题更隐蔽。3.4 字符集与长度字节和字符要分清Oracle 的 VARCHAR2(n) 里 n 的语义取决于数据库字符集。在 AL32UTF8 字符集下n 默认是字符数但很多老库可能用的是 ZHS16GBKVARCHAR2(n) 的 n 是字节数一个中文占两个字节。插入一个包含中文的值时长度明明看起来不超却可能报ORA-12899: value too large for column。我遇到过的最典型场景某系统的客户名称列定义 VARCHAR2(20)GBK 字符集下某某某某有限公司这种 10 个汉字占 20 字节正好够用但一旦名字里有全角括号或者生僻字占更多字节就超了。排查方式也很朴素执行SELECT LENGTHB(客户名称) FROM 测试表 WHERE ROWNUM 1;用 LENGTHB 对比 LENGTH立刻能看到字节和字符的差距。解决方案要么扩大列定义要么在应用入口做长度校验别等数据库报错才发现。对于跨字符集系统同步数据的场景插入前最好先统一转换成目标库字符集再执行避免出现字符集不同但表面看起来都正常的暗坑。3.5 约束触发顺序主键、唯一、外键、CHECK 的实际执行INSERT 执行时Oracle 会在行插入后依次做约束检查。顺序大致是NOT NULL、CHECK、UNIQUE 和 PRIMARY KEY、外键引用。这个顺序对排查问题特别重要。比如一条数据同时违反主键唯一和外键引用Oracle 大概率先报主键冲突解决完又报外键问题。如果不懂这个顺序容易陷入改完一个又冒一个的循环。UNIQUE 约束的报错信息是ORA-00001: unique constraint (某模式.某约束) violated它并不告诉你具体是哪一列的值冲突只给约束名。抓冲突值有一个快准狠的办法回查源数据。SELECT order_id, COUNT(*) FROM 目标表 WHERE order_id 你刚插入的 order_id GROUP BY order_id HAVING COUNT(*) 1;主键或唯一约束冲突的本质是表中已存在相同值所以在做初始化数据插入时我习惯先执行一次SELECT 唯一键列, COUNT(*) ... GROUP BY 唯一键列 HAVING COUNT(*) 1确认源数据里没有重复再开始搬运。外键冲突则更隐蔽子表插入了主表没有的 code报错可能是ORA-02291这时候要反查主表是否存在对应值。看似简单但在批量插入里一个脏 code 就能让整批回滚。4. 性能与事务小步提交还是大事务INSERT 写得好不好不仅是正确性问题还有性能问题。尤其是在数据迁移、归档、初始化大批量数据的项目里INSERT 的执行路径和提交策略直接决定任务跑一小时还是跑一夜。4.1 批量插入的性能损失点在哪里一次 INSERT 在 Oracle 内部大体经历 SQL 解析、绑定变量评估、索引维护、undo 生成、redo 生成、写入数据块等环节。批量插入慢主要慢在以下几个方面逐条解析 SQL程序里循环执行同一条 INSERT如果每条都硬解析成本很高。绑定变量可以大幅缓解。索引维护表上每个索引都要同步更新索引越多插入越慢。redo 和 undo 的生成默认情况下所有 INSERT 都会产生完整的 redo 日志保证可恢复性undo 则记录修改前的镜像用于回滚和一致性读。数据量越大这两个部分占用越可观。执行计划不稳定某些复杂子查询插入时优化器选错计划会导致性能断崖。所以批量插入提速的方向就是针对以上四个点逐一做文章。这也就是为什么后文的 APPEND 提示、NOLOGGING、数组绑定能显著见效的原因。4.2 提交时机为什么循环里每行 COMMIT 是坏味道不少开发从 MySQL 或 SQL Server 转过来习惯在循环里每执行一条 INSERT 就 COMMIT 一次理由是怕丢数据。听上去很有道理实际上在 Oracle 里是大忌。每 COMMIT 一次Oracle 都要做一次日志同步和锁释放这在循环几万次的场景下开销极高。更重要的是一旦做到一半逻辑出错前面提交的数据就留了下来想整体回退只能靠业务上的反向操作。而如果采用一次性大事务或者分批提交出错时回滚范围可控数据一致性也更好维护。那么什么时候应该分批提交我的经验是每 500 到 1000 条提交一批既能避免大事务长时间持有锁带来的阻塞风险又能让失败回滚不至于把几百万条全部撤销。这里插一句很多所谓的锁表问题并不是 Oracle 真的把表锁了而是有一个正在插入且未提交的事务占住了某个行的行锁别的操作在等它。长事务会放大这种等待分批提交就是缓解手段。4.3 常用提速技巧APPEND 提示、NOLOGGING、数组绑定在 11g 里通过INSERT /* APPEND */可以把数据直接追加到表的高水位线之上绕开部分空间管理逻辑配合表或表空间的 NOLOGGING 属性能大幅减少 redo 生成。这个操作适合临时表和归档表但要注意APPEND 会锁表并发 DML 会受影响而且如果表上有触发器或外键引用APPEND 可能失效或需要额外处理。ALTER TABLE order_history NOLOGGING; INSERT /* APPEND */ INTO order_history (order_id, customer_id, product_code, order_qty) SELECT order_id, customer_id, product_code, order_qty FROM order_info WHERE create_time ADD_MONTHS(SYSDATE, -6); COMMIT;实测带索引的表加索引维护时间很惊人如果目标表是全新归档表建议插入前先ALTER TABLE ... NOLOGGING数据全部插完再批量建索引顺序反过来的话索引维护会让提速名存实亡。另外 APPEND 插入的数据在完成提交前别的会话很可能看不到因为它在高水位线之上直接写要留意会话隔离带来的业务误判。程序调用层面Java 里用PreparedStatement配合addBatch()执行批量插入也能走批绑定大幅度减少解析和网络交互。比如 10 万条数据逐条 executeUpdate 可能要几分钟用 addBatch 之后几十秒就完成差距非常直观。PL/SQL 里则是用FORALL效果类似。这些手段的核心目的都是减少 SQL 解析次数把解析开销从每条一次变成一批一次。5. 一些我实际趟过的边界场景最后这部分我挑几个不常见但一旦遇到就很折磨人的边界场景。它们都和 INSERT 相关但处理思路往往要超出 INSERT 本身往序列、触发器、事务恢复上延伸。5.1 自增字段处理序列与手输 ID 的竞争Oracle 11g 没有 MySQL 那种 AUTO_INCREMENT主键一般靠序列NEXTVAL。常见写法是INSERT INTO order_info (order_id, ...) VALUES (seq_order_id.NEXTVAL, ...);有人为了保持 ID 连续可读会先查MAX(order_id) 1再插入。这种写法在单用户环境没问题一旦并发上来两个会话可能查到同一个 MAX 1后面必然报主键冲突。更严重的是即使一个会话插入成功一个会话失败失败的会话已经把序列值消耗掉了还是要靠序列保证唯一性。所以插入主键时不建议手动算 MAX1直接用序列是正解ID 不连续就让它不连续业务上如果需要连续号码那本就是应用层的需求不该让数据库主键来承担。5.2 带默认值表结构的插入建表时 Design 的小心思有一种表设计极容易让 INSERT 踩坑就是大量使用 DEFAULT 但没定义 NOT NULL。我接手过一个表status 列 DEFAULT VALID但没有 NOT NULL结果程序偶发把 NULL 写进去前端查询大量出现空白状态排查了很久才找到根因代码里在某个分支给 status 显式赋了 null。这里我的建议很直接对于业务上应该永远有值的列建表时一定要同时加DEFAULT和NOT NULL。这样即便应用层漏传 null数据库也会自动填默认值不至于让 NULL 进入数据表。反过来如果字段确实允许为空就不要给它加 DEFAULT否则容易让人误以为会有默认值。5.3 失败后的清理回滚与闪回查询INSERT 失败后的第一反应通常是回滚。但如果事务早已提交数据已经落库再发现插错了就不能靠 ROLLBACK 了。Oracle 11g 提供了闪回查询可以基于 undo 数据查看过去某个时间点的表内容我经常用它来恢复被错误 INSERT 之后又被后续操作覆盖的数据。SELECT * FROM 目标表 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 30 MINUTE) WHERE 主键列 某个值;确认错的数据之后可以先用DELETE清理再重插正确值。但要注意undo 保留时间由UNDO_RETENTION决定超过保留期就闪回不了。所以重要数据变更前最好先把正确数据备份或者确认事务提交节点。这里的核心思路是INSERT 不是终点插入后的可追溯、可修复同样重要。5.4 触发器对插入的影响隐形的执行代价表上如果存在 BEFORE INSERT 触发器即使你只写了一条最简单的 INSERT实际上 Oracle 还会执行触发器里的逻辑比如改写某个列的值、插入审计日志等。触发器最大的问题是不透明开发人员看 INSERT 语句完全无法感知背后还有隐藏逻辑一旦触发器里有错误INSERT 会直接报错排查方向很容易走偏。我在某项目中就遇到过一张表上的触发器会自动把客户手机号做脱敏处理。测试环境没问题生产环境因为某批手机号格式不对触发器里函数报错导致整批 INSERT 回滚。最终解决方案是把数据校验逻辑挪到应用层触发器里只保留最简单的赋值逻辑避免触发器承担过多业务规则。所以收到ORA-04088之类的触发器执行报错时别只盯着 INSERT 语句本身优先去看相关表上的触发器代码。我的几点实操体会把话收一收。用 INSERT 这么多年我最大的体会可以浓缩成三件事第一INSERT 的安全感来自显式列名和显式类型转换越依赖数据库自动处理越容易出现环境差异导致的诡异问题。第二批量插入的性能不是靠某一条技巧拉满的而是靠语句写法、提交节奏、索引策略、日志模式这四件事共同作用。第三遇到报错时先看的是约束名和错误码对应的操作文档而不是反复改 SQL 碰运气Oracle 的报错信息虽然不够细腻但每一个常见错误码都指向明确的原因顺藤摸瓜通常比瞎试快得多。如果你现在正被某个 INSERT 问题卡住建议按这个顺序排查先确认列清单是否显式完整再确认日期和其他字符串是否做了显式转换然后检查约束冲突和触发器最后才考虑事务提交和性能。把前面这些基础打扎实后面再接触 PL/SQL 批量写入、外部表导入这些高阶玩法会发现很多坑早就在 INSERT 这一层埋下过伏笔。希望这篇梳理对你手头的项目有帮助。
RELATED

相关推荐

广义Benders分解求解综合能源系统规划:MATLAB实战与收敛加速

广义Benders分解求解综合能源系统规划:MATLAB实战与收敛加速

1. 为什么综合能源系统规划绕不开广义Benders分解做综合能源系统优化规划的人,几乎都会遇到同一个坎儿:模型规模太大,求解器直接罢工,或者跑一天一夜也出不了结果。尤其是当规划周期拉长、候选设备一多、网络拓扑稍作精细化之后&a…

📅 2026/10/16 7:22:08
VLAN技术深度解析:从广播域隔离到802.1Q标签与链路类型实战

VLAN技术深度解析:从广播域隔离到802.1Q标签与链路类型实战

1. 从一个真实组网困境说起:为什么需要VLAN很多刚接触网络工程的朋友都有过这样的经历:公司规模不大,几十台电脑,一台核心交换机加几台接入交换机,所有人都在同一个网段里,互相能ping通,文件共享…

📅 2026/10/16 7:22:08
MySQL连接报错排查:socket文件路径与状态详解

MySQL连接报错排查:socket文件路径与状态详解

刚装完MySQL,兴冲冲敲下mysql -uroot -p,结果没看到期待的Enter password:,反而弹出一段红字——Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock。这个报错我前前后后排查过很多次,也帮别人处理过…

📅 2026/10/16 7:22:08
MORE NEWS

更多资讯

📰

Go 服务容器内存持续上涨但 heap profile 是平的:3 类非堆内存

我不会起名字322 后端 / 算法 / 数据库 📘 技术栈 | 🧩 力扣 Hot100 | 🐹 Go 项目 | 🟥 Redis | 🐬 MySQL 文章目录Go 服务容器内存持续上涨但 heap profile 是平的&…

📰

微立体PPT模板:财务数据统计分析的可视化实战指南

简介:这套微立体风格的财务数据统计分析报告演示文稿模板,专为会计、财务人员及需要制作经营数据汇报的职场人士准备,适用于从财务新手到资深分析师的各类人群。蓝色微立体设计在视觉上突出数据层级,围绕财务统计与分析场景配置多…

📰

nvidia-smi命令找不到?从驱动到容器彻底排查与修复指南

“nvidia-smi: command not found”大概是 Linux 装显卡驱动时最经典、也最让人摸不着头脑的报错。我第一次遇到是在一台刚装完系统的服务器上,当时还以为是显卡坏了,折腾半天才发现只是驱动没装上。后来搞多了就明白,这个报错本身不复杂&…

📰

大模型上下文管理实战:Token预算、记忆分层与检索召回

前几天我和一朋友调试他做的对话机器人,本来前期测试一切正常,结果聊到第 20 轮的时候,模型突然开始答非所问。他问了一句“我刚才不是说过了吗”,系统毫无反应。我打开日志看了一眼 Token 消耗,心里大概就有数了&…

📰

多模态Agent实战:Harness编排与MCP工具接入的工程架构解析

1. 多模态 Agent:从“能聊”到“能干”的跨越最近这半年,我几乎把所有业余时间都砸在了一个Agent开发项目上。说实话,市面上讨论Agent的声音很多,但真到了自己动手把一个大模型多模态应用和一个可编排的Harness框架、再加上MCP协议…

📰

GitHub Actions上跑AI Agent:事件驱动自动化实战与避坑指南

最近在做持续集成自动化相关的事情时,我发现一个特别有意思的玩法——把 AI Agent 直接跑在 GitHub Actions 上。说白了,就是用一个开源框架,把传统常驻服务器上的 Agent 拆成按次计费的临时任务,每次由事件触发拉起一个运行环境&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬