Debian 上 Informix SQL 优化的实用方法
一 执行计划与统计信息
- 使用 set explain on 或 EXPLAIN PLAN 查看执行计划,确认是否发生 全表扫描、是否使用了合适的 索引、是否存在高成本的 排序/哈希 操作。对关键 SQL 建立“预期计划—实际计划”的基线对比。
- 定期执行 UPDATE STATISTICS FOR TABLE tablename,在大量 INSERT/DELETE/UPDATE 后尤为重要,保证优化器有准确的 行数、页数、索引层级、不同值个数 等统计,从而生成更优计划。
- 在确有需要且优化器选择不佳时,使用 INDEX 提示 指定更优索引,作为临时“兜底”手段。
二 索引设计与维护
- 为高频出现在 WHERE、JOIN、ORDER BY 中的列建立索引;多列组合查询优先使用 复合索引,并将 选择性高(唯一值多) 的字段放在前面;避免 冗余/重复 索引以降低写开销。
- 优先设计 覆盖索引(索引包含查询所需全部列),减少 回表 与 I/O;对长字符串可用 前缀索引 在存储与性能间折中。
- 避免在索引列上使用 函数/计算 或前置通配的 LIKE ‘%xxx%’(会导致索引失效);如业务允许,尽量改写为 等值/范围 条件或后导通配 LIKE ‘xxx%’。
- 持续维护:在大批量变更后 更新统计信息;当 索引层级 > 4 或碎片严重时考虑 重建索引;必要时使用 查询提示 临时纠正执行路径。
三 SQL 写法与访问路径优化
- 只查需要的列,避免 **SELECT ***;在 WHERE 中尽早施加 高选择性 的过滤条件,减少后续处理的数据量。
- 优先用 JOIN 替代 相关子查询;连接条件上的列需有索引;尽量避免 NOT IN、<>,可改写为 NOT EXISTS 或 LEFT JOIN … IS NULL。
- 分页查询使用 LIMIT/OFFSET,但当 OFFSET 很大 时性能会下降,可改用 基于游标的键集分页(记住上一页最后一条关键键值,下一页用“> 键值”定位)。
- 减少 排序/分组 成本:为 ORDER BY/GROUP BY 建立匹配索引,尽量让排序在索引上完成;避免对大表进行 重复排序。
- 批量处理尽量使用 批量插入/更新 与 PREPARE/EXECUTE 复用执行计划,避免在循环中反复解析与编译 SQL。
四 并发与资源管理
- 合理设置会话级 锁等待,避免长时间阻塞或异常,例如:SET LOCK MODE TO WAIT 10(单位秒,示例为等待 10 秒),在批量或并发导入导出、重建索引等场景尤为重要。
- 利用 PDQ(并行查询) 提升大数据量扫描、聚合、排序的性能;在 临时表 上结合 PDQ 与大表操作可显著缩短执行时间。
- 通过 onstat、onmode 等工具持续观察 缓冲区命中、I/O、锁等待、会话与线程 等指标,结合慢 SQL 清单做针对性优化。
五 配置与系统层面的优化
- 内存与缓存:结合实例负载调整 缓冲池/缓存 相关参数,提升 逻辑读命中率;合理设置 逻辑日志文件 数量与大小,避免日志瓶颈影响检查点与恢复。
- 存储与 I/O:优先 SSD/NVMe、合理条带化与分离 数据/索引/日志 到不同磁盘,降低 I/O 等待。
- 实例参数:根据 CPU 核数 与负载配置 虚拟处理器(VP) 类别与数量(如 numcpuvps、multiprocessor、onlyovp 等),并优化 网络/连接 相关参数以减少会话开销。
- 操作系统:调优 文件系统缓存、网络参数,确保充足的 文件句柄/内核参数,避免资源限制成为瓶颈。
- 变更流程:任何参数或结构变更先在 测试环境 验证,并与 备份/回滚 方案配套,确保可观测与可恢复。