news 2026/8/17 13:13:10

达梦数据库对象管理实战:从表、索引到存储过程与运维技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
达梦数据库对象管理实战:从表、索引到存储过程与运维技巧

1. 项目概述:为什么需要系统掌握达梦数据库对象管理?

如果你正在或即将使用达梦数据库(DM),无论是从Oracle、MySQL迁移过来,还是在新项目中直接选用,很快就会发现一个核心问题:数据库里的一切,从存储数据的表,到保证数据正确的约束,再到提升查询效率的索引,以及自动执行业务逻辑的存储过程,它们都不是孤立存在的。这些“东西”,在数据库领域统称为“数据库对象”。管理好这些对象,是保证数据库系统稳定、高效、安全运行的基础,其重要性不亚于建筑的地基。

我见过不少团队,初期只关注SQL怎么写、数据怎么查,对表空间规划、索引设计、权限控制这些对象管理的工作比较随意。结果项目上线一段时间后,问题集中爆发:磁盘空间莫名耗尽,关键查询越来越慢,甚至因为误操作导致数据逻辑错误。这些问题追溯起来,根源往往在于对象管理的混乱。达梦数据库作为一款成熟的企业级关系型数据库,提供了一套完整且强大的对象管理机制。掌握它,意味着你能主动规划数据库的存储、性能和安全,而不是被动地救火。

简单来说,本次分享的核心,就是带你系统性地了解达梦数据库中那些最常用、最关键的对象(如表、视图、索引、序列、同义词、存储过程/函数、包等)该如何创建、配置、维护和优化。我们会绕过枯燥的理论手册,直接从一线实践中提炼出“什么时候用”、“怎么用最好”、“有哪些坑要避开”的干货。无论你是DBA、开发还是架构师,这些内容都将是你日常工作中绕不开的实操核心。

2. 核心对象详解与设计原则

达梦数据库的对象体系丰富,但掌握常用对象足以应对90%以上的场景。理解每个对象的设计意图和适用场景,是正确使用它们的前提。

2.1 表(TABLE):数据的基石

表是存储数据的逻辑单元,是所有操作的基础。在达梦中创建表,语法上兼容标准SQL,但有许多企业级特性需要关注。

1. 表设计核心考量:

  • 存储位置(表空间):创建表时,通过TABLESPACE子句指定所属表空间。这是第一个关键决策。强烈建议将业务表、索引表、临时表、回滚段分离到不同的表空间,并对应到不同的物理磁盘上,这能有效减少I/O竞争,也便于后续管理和备份。例如,核心交易表放在TS_TRD_DATA表空间,其索引放在TS_TRD_IDX表空间。
  • 存储参数(STORAGE):达梦允许精细控制表的初始存储分配和增长策略。
    • INITIAL:初始簇大小。对于已知大小的维表或配置表,可以一次性分配足够空间,避免频繁扩展。
    • NEXT:下次扩展大小。设置合理的值,避免大量小幅度扩展产生碎片。
    • MINEXTENTS/MAXEXTENTS:最小和最大扩展次数。MAXEXTENTS可以设置为UNLIMITED,但需监控表空间总大小。
    • FILLFACTOR:填充因子。对于频繁更新的表,设置为较低值(如80)可以为更新预留空间,减少行迁移。
  • 分区表(PARTITION):对于数据量巨大(如千万、亿级)的表,分区是必备技能。达梦支持范围、列表、哈希、间隔等多种分区策略。
    • 范围分区:最常用,按时间(如ORDER_DATE)或数值范围分区。便于按分区进行数据归档、删除和查询优化。
    • 列表分区:按离散值分区,如按地区(REGION)、状态(STATUS)。
    • 哈希分区:将数据均匀分布到指定数量的分区中,适用于没有明显分区键但需要分散I/O的场景。
    • 设计原则:分区键的选择至关重要,应基于最频繁的查询条件(WHERE子句)或数据维护操作(如删除旧数据)。避免对分区键列进行函数运算,否则可能导致分区裁剪失效。

2. 实操心得:

注意:在创建大型表或分区表之前,务必评估表空间的剩余空间。一个新手常犯的错误是在默认的MAIN表空间创建了一个巨大的未分区表,很快导致整个表空间被撑满,影响其他所有对象。建议养成习惯:CREATE TABLE ... TABLESPACE <专用表空间> STORAGE(...) ...;

2.2 索引(INDEX):查询性能的加速器

索引是提高数据检索速度的关键对象,但错误地创建或过度创建索引会严重影响DML(增删改)性能。

1. 索引类型与选择:

  • B树索引:默认且最通用的索引,适用于等值查询和范围查询。
  • 唯一索引:确保索引列值的唯一性,通常用于实现主键或唯一约束。
  • 位图索引:适用于低基数列(即列值重复度很高,如性别、状态标志)。在数据仓库或OLAP场景的复杂条件查询中效率极高,但切记,它不适合高并发的OLTP环境,因为单个位图索引位的更新会锁住整个位图段,极易引发阻塞
  • 函数索引:基于列表达式创建的索引。例如,经常按UPPER(CUSTOMER_NAME)查询,可以创建函数索引CREATE INDEX IDX_UPPER_NAME ON T_CUSTOMER(UPPER(CUSTOMER_NAME));
  • 复合索引:多列组合索引。列的顺序至关重要,应遵循“最左前缀匹配”原则。将查询条件中最常用、选择性最高的列放在最左边。

2. 索引设计策略:

  • 选择性原则:只为高选择性的列创建索引。选择性 = 不同值数量 / 总行数。通常选择性 > 0.1 的列才值得建索引。
  • 覆盖索引:如果索引包含了查询所需的所有列,则数据库可以直接从索引中获取数据,无需回表,极大提升性能。在创建复合索引时可以考虑这一点。
  • 监控与维护:索引不是一劳永逸的。随着数据增删改,索引会产生碎片,需要定期重建或合并。可以通过动态性能视图V$INDEX_SUGGESTIONSDBMS_STATS包收集的统计信息来评估索引有效性,删除无用索引。

3. 实操心得:

注意:不要在频繁更新的列上创建过多索引。每次UPDATE操作,如果涉及索引键列,数据库需要维护所有相关索引,成本很高。我曾遇到一个表上有10个索引,导致每秒只能处理几十次更新,删除其中5个非关键索引后,TPS提升了数倍。记住:索引是“空间换时间”,同时也是“写性能换读性能”。

2.3 视图(VIEW)、序列(SEQUENCE)与同义词(SYNONYM)

这三个对象不直接存储数据,但能极大提升开发效率和系统灵活性。

1. 视图(VIEW):虚拟表的妙用视图是一个基于SQL查询的虚拟表。它的核心价值在于:

  • 简化复杂查询:将多表关联、复杂计算的SQL封装成一个视图,应用层像查单表一样简单。
  • 数据安全:可以创建一个只包含部分行和列的视图,并授予用户访问视图的权限而非基表,实现行级和列级的数据安全控制。
  • 逻辑独立性:当底层表结构发生变化时(如分拆表),可以通过修改视图定义来保持上层应用的接口不变。
  • 物化视图:这是达梦的高级特性。它会实际存储查询结果,并可以通过定时或实时刷新来保持数据同步。对于复杂聚合查询,物化视图能提供极致的查询速度,本质上是“空间换时间”的预计算,常用于数据仓库和报表系统。

2. 序列(SEQUENCE):主键生成的利器序列用于生成唯一的数字序列,是生成自增主键(非IDENTITY列时)或业务单号的理想选择。

CREATE SEQUENCE SEQ_ORDER_ID START WITH 100000 INCREMENT BY 1 CACHE 20;
  • CACHE参数:指定在内存中预分配的序列号个数。设置合理的CACHE值(如20-100)可以显著减少获取序列时的磁盘I/O,提升并发性能。但在数据库重启时,缓存中未使用的序列值会丢失,导致序列号不连续,这对严格要求连续性的业务需要谨慎评估。
  • 使用方式:在插入数据时使用SEQ_ORDER_ID.NEXTVAL

3. 同义词(SYNONYM):对象的别名同义词为数据库对象(表、视图、序列、甚至其他同义词)提供一个别名。

  • 私有同义词:仅对创建者可见。CREATE SYNONYM EMP FOR HR.EMPLOYEES;
  • 公有同义词:对所有用户可见,通常由DBA创建。CREATE PUBLIC SYNONYM DEPT FOR HR.DEPARTMENTS;
  • 核心价值
    • 简化访问:用户SCOTT可以直接SELECT * FROM EMP;,而无需知道EMP实际是HR.EMPLOYEES
    • 位置透明性:当底层对象从一个用户迁移到另一个用户,或从一个数据库迁移到另一个数据库(通过DBlink)时,只需重新定义同义词指向新位置,所有应用程序代码都无需修改。

4. 实操心得:

注意:视图的性能取决于其底层查询。避免在视图定义中使用SELECT *,应明确指定列。对于多层嵌套的复杂视图,要特别注意查询性能,有时物化视图是更好的选择。对于序列,如果应用是分布式部署,要小心使用大CACHE值,这可能导致不同实例获取的序列号段跨度很大。

3. 程序化对象:存储过程、函数与包

当简单的SQL无法满足复杂的业务逻辑时,程序化对象就登场了。达梦的PL/SQL兼容Oracle,功能强大。

3.1 存储过程(PROCEDURE)与函数(FUNCTION)

  • 存储过程:封装一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。它没有返回值,但可以通过OUT参数返回多个值。主要用于执行复杂的业务逻辑、数据批量处理、任务调度等。
  • 函数:与存储过程类似,但必须返回一个值。通常用于计算并返回一个标量值,可以在SQL语句中直接调用,例如SELECT EMP_NAME, CALC_BONUS(SALARY) FROM EMPLOYEE;

创建与调用示例:

-- 创建一个根据部门ID计算平均工资的函数 CREATE OR REPLACE FUNCTION FUNC_AVG_SAL(DEPT_ID INT) RETURN DECIMAL(10,2) AS AVG_SAL DECIMAL(10,2); BEGIN SELECT AVG(SALARY) INTO AVG_SAL FROM EMPLOYEE WHERE DEPARTMENT_ID = DEPT_ID; RETURN NVL(AVG_SAL, 0); -- 使用NVL处理空值 END; -- 创建一个调整员工工资的存储过程 CREATE OR REPLACE PROCEDURE PROC_ADJUST_SAL( IN_EMP_ID INT, IN_RATIO DECIMAL(3,2), OUT_OLD_SAL DECIMAL(10,2) OUT, OUT_NEW_SAL DECIMAL(10,2) OUT ) AS BEGIN SELECT SALARY INTO OUT_OLD_SAL FROM EMPLOYEE WHERE EMPLOYEE_ID = IN_EMP_ID FOR UPDATE; -- 加锁防止并发修改 OUT_NEW_SAL := OUT_OLD_SAL * IN_RATIO; UPDATE EMPLOYEE SET SALARY = OUT_NEW_SAL WHERE EMPLOYEE_ID = IN_EMP_ID; COMMIT; -- 根据实际事务需求决定是否在过程中提交 EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001, '员工不存在'); WHEN OTHERS THEN ROLLBACK; RAISE; END;

3.2 包(PACKAGE):代码的组织单元

包是达梦PL/SQL中用于逻辑分组相关程序对象(变量、常量、游标、异常、过程、函数)的模块化单元。它由**包规范(PACKAGE SPECIFICATION)包体(PACKAGE BODY)**两部分组成。

  • 包规范:声明公共接口(哪些过程、函数、变量可以被外部调用)。相当于面向对象中的“接口”或“头文件”。
  • 包体:实现包规范中声明的所有子程序的具体代码,还可以包含私有变量和子程序(仅在包体内可见)。

包的优势:

  1. 模块化与封装:将相关功能组织在一起,提高代码可读性和可维护性。私有成员隐藏了实现细节。
  2. 性能提升:首次调用包中的某个子程序时,整个包被加载到内存,后续调用包内其他子程序速度更快。包级变量在会话生命周期内保持其值,可用于会话级缓存。
  3. 全局状态管理:包内定义的变量(在规范或体内)具有会话作用域,可用于在同一个会话的不同调用间共享数据。

创建示例:

-- 1. 创建包规范 CREATE OR REPLACE PACKAGE PKG_EMP_MGMT AS -- 公共常量 C_MIN_SAL CONSTANT DECIMAL(10,2) := 3000.00; -- 公共异常 E_SAL_TOO_LOW EXCEPTION; PRAGMA EXCEPTION_INIT(E_SAL_TOO_LOW, -20001); -- 公共函数声明 FUNCTION GET_EMP_COUNT(DEPT_ID INT) RETURN INT; -- 公共过程声明 PROCEDURE RAISE_SALARY(EMP_ID INT, PERCENT NUMBER); END PKG_EMP_MGMT; -- 2. 创建包体 CREATE OR REPLACE PACKAGE BODY PKG_EMP_MGMT AS -- 私有变量(仅在包体内可见) V_CALL_COUNT INT := 0; -- 私有函数 FUNCTION VALIDATE_SAL(NEW_SAL DECIMAL) RETURN BOOLEAN IS BEGIN RETURN NEW_SAL >= C_MIN_SAL; END; -- 实现公共函数 FUNCTION GET_EMP_COUNT(DEPT_ID INT) RETURN INT AS V_COUNT INT; BEGIN V_CALL_COUNT := V_CALL_COUNT + 1; -- 使用私有变量 SELECT COUNT(*) INTO V_COUNT FROM EMPLOYEE WHERE DEPARTMENT_ID = DEPT_ID; RETURN V_COUNT; END; -- 实现公共过程 PROCEDURE RAISE_SALARY(EMP_ID INT, PERCENT NUMBER) AS V_OLD_SAL DECIMAL(10,2); V_NEW_SAL DECIMAL(10,2); BEGIN SELECT SALARY INTO V_OLD_SAL FROM EMPLOYEE WHERE EMPLOYEE_ID = EMP_ID FOR UPDATE; V_NEW_SAL := V_OLD_SAL * (1 + PERCENT/100); IF NOT VALIDATE_SAL(V_NEW_SAL) THEN -- 调用私有函数 RAISE E_SAL_TOO_LOW; END IF; UPDATE EMPLOYEE SET SALARY = V_NEW_SAL WHERE EMPLOYEE_ID = EMP_ID; COMMIT; DBMS_OUTPUT.PUT_LINE('调薪完成。旧薪资:' || V_OLD_SAL || ', 新薪资:' || V_NEW_SAL); EXCEPTION WHEN E_SAL_TOO_LOW THEN DBMS_OUTPUT.PUT_LINE('错误:调整后的薪资低于最低标准' || C_MIN_SAL); ROLLBACK; RAISE; END; BEGIN -- 包初始化部分(可选),在会话中首次调用包时执行一次 DBMS_OUTPUT.PUT_LINE('员工管理包已初始化。'); END PKG_EMP_MGMT;

3. 实操心得:

注意:在存储过程和函数中,要谨慎使用COMMITROLLBACK。将事务控制权交给调用者通常是更好的设计,这样过程可以被组合到更大的事务中。异常处理部分 (EXCEPTION) 必不可少,要记录或抛出有意义的错误信息。对于包,要善用私有成员来封装内部逻辑,并通过包初始化块设置复杂的默认状态。调试时,DBMS_OUTPUT.PUT_LINE是你的好朋友,但在生产代码中应考虑更可靠的日志记录方式。

4. 对象管理的日常运维与高阶技巧

创建对象只是开始,生命周期内的管理才是重头戏。

4.1 对象的修改、删除与依赖查询

  • 修改(ALTER):大多数对象都支持ALTER语句。例如,给表增加列 (ALTER TABLE T1 ADD COLUMN NEW_COL INT;)、修改列类型(需谨慎,可能涉及数据转换)、重建索引 (ALTER INDEX IDX_NAME REBUILD;)、启用/禁用约束等。
  • 删除(DROP):使用DROP语句。删除表时,默认使用DROP TABLE T1;,如果有外键约束引用它,会报错。可以使用DROP TABLE T1 CASCADE CONSTRAINTS;来级联删除约束,但数据不会级联删除,这需要额外处理。DROP TABLE T1 PURGE;会直接删除而不进入回收站(如果启用了闪回功能)。
  • 依赖关系查询:在修改或删除对象前,必须检查依赖关系。达梦提供了系统视图来查询。
    • DBA_DEPENDENCIES/USER_DEPENDENCIES:查看对象间的依赖关系(如哪些视图依赖某张表)。
    • DBA_CONSTRAINTS:查看表的约束信息,特别是外键约束。
    • 一个实用的查询,找出所有依赖于某张表(如T_ORDER)的对象:
      SELECT OWNER, NAME, TYPE, REFERENCED_OWNER, REFERENCED_NAME, REFERENCED_TYPE FROM DBA_DEPENDENCIES WHERE REFERENCED_OWNER = 'SCOTT' AND REFERENCED_NAME = 'T_ORDER' AND REFERENCED_TYPE = 'TABLE';

4.2 权限管理(GRANT/REVOKE)

安全是对象管理的核心。达梦采用基于角色的权限模型。

  1. 系统权限:如CREATE TABLE,CREATE VIEW,CREATE USER等。通常授予DBA角色。
  2. 对象权限:针对特定对象的操作权,如SELECT ON SCOTT.EMP TO USER1,INSERT ON SCOTT.EMP TO ROLE_RW
  3. 角色:将一组权限打包成角色,然后将角色授予用户。这是最佳实践。
    -- 创建只读角色 CREATE ROLE ROLE_READONLY; GRANT SELECT ANY TABLE TO ROLE_READONLY; -- 谨慎使用ANY权限 -- 更推荐的方式:为特定业务模式授权 GRANT SELECT ON SCOTT.EMP TO ROLE_READONLY; GRANT SELECT ON SCOTT.DEPT TO ROLE_READONLY; -- 将角色授予用户 GRANT ROLE_READONLY TO USER_ANALYST;
  4. 权限回收:使用REVOKE。注意REVOKE的级联效应。如果用户从角色获得了权限,回收角色的权限会影响到用户。

4.3 元数据查询:如何知道数据库里有什么?

管理对象,首先得知道它们的存在和状态。达梦提供了丰富的数据字典视图(以V$DBA_USER_ALL_为前缀)。

视图类别前缀描述常用视图举例
动态性能视图V$实时反映数据库实例运行状态,数据存储在内存中,实例关闭后消失。V$SESSIONS(当前会话),V$LOCK(锁信息),V$SQL(SQL执行统计)
数据字典视图DBA_显示数据库中所有对象的信息,需要高权限(如DBA角色)。DBA_TABLES,DBA_INDEXES,DBA_USERS,DBA_SEGMENTS(段信息)
USER_显示当前用户所拥有的对象的信息。USER_TABLES,USER_CONSTRAINTS,USER_OBJECTS(所有对象)
ALL_显示当前用户有权限访问的所有对象的信息。ALL_TABLES,ALL_SYNONYMS

常用查询示例:

  • 查看当前用户下的所有表SELECT TABLE_NAME FROM USER_TABLES;
  • 查看某张表(T_ORDER)的列信息SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'T_ORDER' ORDER BY COLUMN_ID;
  • 查看表的索引SELECT INDEX_NAME, UNIQUENESS FROM USER_INDEXES WHERE TABLE_NAME = 'T_ORDER';
  • 查看索引的列SELECT COLUMN_NAME FROM USER_IND_COLUMNS WHERE INDEX_NAME = 'IDX_ORDER_DATE' ORDER BY COLUMN_POSITION;
  • 查看无效对象SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS WHERE STATUS = 'INVALID';(常见于依赖对象被修改后)

4.4 高阶技巧:闪回与回收站

达梦提供了类似Oracle的闪回(Flashback)功能,可以一定程度上“反悔”误操作。

  • 闪回查询:查询表在某个历史时间点的数据。需要开启归档和补充日志。
    -- 查询10分钟前的数据 SELECT * FROM T_ORDER AS OF TIMESTAMP SYSDATE - 10/1440;
  • 回收站(RECYCLEBIN):执行DROP TABLE后,表及其关联对象(索引、约束等)默认会进入回收站,而不是立即物理删除。这提供了恢复的机会。
    • 查看回收站:SELECT * FROM RECYCLEBIN;SHOW RECYCLEBIN;
    • 恢复表:FLASHBACK TABLE T_ORDER TO BEFORE DROP;
    • 彻底删除(绕过回收站):DROP TABLE T_ORDER PURGE;
    • 清空回收站:PURGE RECYCLEBIN;PURGE TABLE T_ORDER;

4. 实操心得:

注意:闪回和回收站不是备份的替代品!它们依赖于撤销表空间(UNDO)和回收站区域的可用空间。对于重要的DROPTRUNCATE操作,尤其是在生产环境,最可靠的恢复手段仍然是物理备份和逻辑备份。回收站中的对象仍然占用磁盘空间,需要定期清理。在执行大规模数据变更前,即使有闪回功能,也强烈建议先使用CREATE TABLE T_BAK AS SELECT * FROM T_ORIGINAL;做一个快速的数据备份。

5. 常见问题与排查技巧实录

在实际管理达梦数据库对象时,你一定会遇到各种“坑”。这里记录了一些典型问题及其解决思路。

5.1 ORA-00942: 表或视图不存在

这是最常见的问题之一,原因多种多样。

  1. 对象名大小写:达梦默认对象名是大写存储的。如果你用双引号创建了小写表名CREATE TABLE "myTable" (...);,那么查询时必须使用双引号SELECT * FROM "myTable";。否则,SELECT * FROM MYTABLESELECT * FROM mytable都会报错。最佳实践:始终使用大写或不加引号创建对象
  2. 当前模式(SCHEMA)不对:用户SCOTT创建了表EMP。用户HR登录后直接查询SELECT * FROM EMP;会报错。需要指定模式名SELECT * FROM SCOTT.EMP;,或者为HR用户创建一个同义词CREATE SYNONYM EMP FOR SCOTT.EMP;
  3. 对象确实不存在或被删除:检查拼写,并用SELECT * FROM USER_OBJECTS WHERE OBJECT_NAME = UPPER('对象名');确认。

5.2 性能问题:索引失效或未使用

查询突然变慢,可能是索引出了问题。

  1. 索引失效(INVALID):当索引的基表被TRUNCATE或执行了某些ALTER TABLE操作(如MOVE)后,索引会失效。检查USER_INDEXES视图的STATUS列。重建索引:ALTER INDEX 索引名 REBUILD;
  2. 统计信息过时:数据库优化器依赖统计信息来选择执行计划。如果数据量变化很大(如导入大量数据),统计信息可能过时,导致优化器错误地选择了全表扫描而非索引扫描。定期收集统计信息:DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');
  3. SQL写法导致索引失效:对索引列使用函数、运算或隐式类型转换。例如,WHERE UPPER(NAME) = 'SMITH'不会使用NAME列上的索引。可以创建函数索引解决。

5.3 空间不足问题

对象增长导致表空间不足。

  1. 监控表空间使用率:定期查询DBA_FREE_SPACEDBA_DATA_FILES
    SELECT A.TABLESPACE_NAME, (A.TOTAL_SPACE - B.FREE_SPACE) AS USED_SPACE_MB, A.TOTAL_SPACE AS TOTAL_SPACE_MB, ROUND((A.TOTAL_SPACE - B.FREE_SPACE) / A.TOTAL_SPACE * 100, 2) AS USED_PERCENT FROM (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) A, (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) B WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME;
  2. 扩容表空间
    • 增加数据文件:ALTER TABLESPACE TS_DATA ADD DATAFILE '/dm8/data/DAMENG/TS_DATA02.DBF' SIZE 2048;(单位MB)
    • 调整现有数据文件大小:ALTER DATABASE DATAFILE '/dm8/data/DAMENG/TS_DATA01.DBF' RESIZE 4096;
  3. 找出空间占用最大的对象
    SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB FROM USER_SEGMENTS ORDER BY BYTES DESC;
    针对大表,可以考虑归档历史数据、分区表或启用表压缩。

5.4 锁与阻塞

在高并发场景下,锁等待和阻塞是性能杀手。

  1. 查看当前锁信息
    SELECT S.SESS_ID, L.TRX_ID, O.NAME AS OBJECT_NAME, L.LTYPE, L.BLOCKED, S.SQL_TEXT, S.STATE FROM V$LOCK L JOIN V$SESSIONS S ON L.TRX_ID = S.TRX_ID LEFT JOIN SYSOBJECTS O ON L.TABLE_ID = O.ID WHERE L.BLOCKED = 1 OR L.BLOCKED = 0; -- BLOCKED=1表示该锁阻塞了其他会话
  2. 常见场景
    • 行级锁等待:一个事务更新了某行未提交,另一个事务也要更新同一行。需要检查应用逻辑,确保事务尽可能短小,并及时提交/回滚。
    • DDL锁ALTER TABLECREATE INDEX等操作会获取表级排他锁,阻塞所有对该表的DML操作。此类操作应在业务低峰期进行。
  3. 处理阻塞:首先尝试联系持有锁的会话提交事务。如果无法联系,在评估风险后,DBA可以使用SP_CLOSE_SESSION(SESS_ID);系统过程强制关闭阻塞会话(谨慎操作!)。

5.5 对象状态异常

  1. 编译无效对象:当依赖的基表被修改后,视图、存储过程等可能变为INVALID。手动编译:
    • 编译单个对象:ALTER VIEW VIEW_NAME COMPILE;ALTER PROCEDURE PROC_NAME COMPILE;
    • 编译某个用户下所有无效对象(使用系统包):
      BEGIN FOR REC IN (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS WHERE STATUS = 'INVALID') LOOP BEGIN IF REC.OBJECT_TYPE = 'VIEW' THEN EXECUTE IMMEDIATE 'ALTER VIEW ' || REC.OBJECT_NAME || ' COMPILE'; ELSIF REC.OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY', 'TRIGGER') THEN EXECUTE IMMEDIATE 'ALTER ' || REC.OBJECT_TYPE || ' ' || REC.OBJECT_NAME || ' COMPILE'; END IF; DBMS_OUTPUT.PUT_LINE('Compiled: ' || REC.OBJECT_NAME); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Failed to compile ' || REC.OBJECT_NAME || ': ' || SQLERRM); END; END LOOP; END;
  2. 同义词指向错误:检查同义词定义SELECT * FROM USER_SYNONYMS WHERE SYNONYM_NAME = 'SYN_NAME';,确认其指向的TABLE_OWNERTABLE_NAME是否正确。

管理达梦数据库对象是一个从设计、创建到持续运维的完整生命周期。核心思想是“规划先行,监控常态”。在创建对象前,多花时间思考表空间规划、索引设计、分区策略;在对象运行后,定期关注空间使用、索引状态、对象有效性。将这些管理动作固化成脚本或监控项,能让你从被动的“救火队员”转变为主动的“系统守护者”。最后,再强调一次,再好的在线功能(如闪回)也不能替代定期的、有效的物理备份,这是DBA工作的最后一道,也是最重要的防线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 13:12:59

WPA-PSK密码破解工具Cowpatty使用与优化指南

1. 无线网络安全测试工具基础解析 在无线网络渗透测试领域&#xff0c;密码恢复工具一直扮演着重要角色。这类工具主要用于验证无线网络密码强度&#xff0c;帮助管理员评估网络安全状况。今天我们要讨论的这个工具&#xff0c;就是专门针对WPA-PSK认证机制设计的离线密码破解程…

作者头像 李华
网站建设 2026/8/17 12:59:32

SaaS企业如何通过NPS(净推荐值)驱动客户忠诚度与业务增长

1. 项目概述&#xff1a;从“满意”到“推荐”的客户价值跃迁 在SaaS这个以续费和增购为核心商业模式的领域里&#xff0c;我们每天都在和各种各样的客户指标打交道&#xff1a;活跃度、留存率、客户生命周期价值&#xff08;LTV&#xff09;……但有一个指标&#xff0c;它直接…

作者头像 李华
网站建设 2026/8/17 12:58:47

STM32 BKP备份寄存器原理与应用:嵌入式数据存储的可靠保险箱

1. 项目概述&#xff1a;为什么需要BKP备份寄存器&#xff1f;在嵌入式开发&#xff0c;尤其是基于STM32这类微控制器的项目中&#xff0c;我们经常会遇到一个看似简单却至关重要的需求&#xff1a;如何在系统掉电、复位甚至软件跑飞的情况下&#xff0c;保存一些关键数据&…

作者头像 李华
网站建设 2026/8/17 12:58:18

视频理解新范式:反射优先的智能体架构设计与实践

1. 从“思考”到“反射”&#xff1a;视频理解智能体的范式转变 最近在搞一个视频内容分析的项目&#xff0c;团队里几个工程师为了一个设计吵得不可开交。核心矛盾点在于&#xff1a;面对一段长达数小时的监控录像&#xff0c;或者一部复杂的电影&#xff0c;我们的智能体是该…

作者头像 李华
网站建设 2026/8/17 12:57:00

FinPerMA基准测试:如何评估与构建LLM智能体的个性化记忆系统

1. 为什么我们需要一个“个性化记忆”的基准测试&#xff1f; 如果你最近在关注大语言模型智能体&#xff08;LLM Agents&#xff09;的研究或开发&#xff0c;可能会发现一个现象&#xff1a;大家都在谈论智能体的“记忆”能力。无论是让它扮演一个长期陪伴的虚拟助手&#xf…

作者头像 李华
网站建设 2026/8/17 12:55:33

TP-LINK TL-SG1005D非网管交换机部署与性能验证全指南

在企业级网络部署和中小型办公环境中&#xff0c;交换机是构建稳定、高速局域网的核心设备。普联&#xff08;TP-LINK&#xff09;TL-SG1005D 作为一款入门级全千兆非网管交换机&#xff0c;因其即插即用、钢壳耐用和性价比高的特点&#xff0c;常被用于扩展网络端口、连接多台…

作者头像 李华