达梦管理表

达梦管理表,所有内容均参照官方文档。

  1. 表是数据库中数据存储的基本单元,是对用户数据进行读和操纵的逻辑实体。表由列和行组成,每一行代表一个单独的记录。表中包含一组固定的列,列的特性由两部分组成:数据类型(date tyep)和长度(length)。
  2. 为了确保数据库中数据的一致性和完整性,在创建表时可以定义表的实体完整性、域完整性和参考完整性。实体完整性定义表中的所有行能唯一标识,一般用主键、唯一索引、UNIQUE关键字及IDENTITY属性来定义;域完整性通常指数据的有效性,限制数据类型、缺省值、规则、约束、是否可以为空等条件,域完整性可以确保不会输入无效的值;参考完整性维护表间数据的有效性、完整性,通常通过建立外键联系另一表的主键来实现。
  3. 若用户在创建表时没有定义表的完整性和一致性约束条件,可以利用DM提供的基表修改语句来进行补充或修改,包括修改基表名、列名、增加列、删除列、修改列类型、增加表级约束、删除表级约束、设置列缺省值、设置触发器状态等。
  4. 达梦支持的表类型包括普通表、临时表、水平分区表、堆表和列存储表。除列存储表和堆表外,每个表都包含一个聚集索引,默认以ROWID建立。
  5. 若要在所属模式中创建新表,需要有CREATE TABLE权限,要在其他用户的模式中创建新表,需要有CREATE ANY TABLE权限。
  6. 除列存储表和堆表外,其它表都是使用B+树索引结构管理的,每一个普通表都有一个聚集索引,数据通过聚集索引键排序,根据聚集索引键可以快速查询任何记录。当建表语句未指定聚集索引键,DM的默认聚集索引键是ROWID,即记录默认以ROWID在页面中排序。ROWID是B树为记录生成的逻辑递增序号,表上不同记录的ROWID是不一样的,并且最新插入的记录ROWID最大,但很多情况下,以ROWID建的默认聚集索引并不能提高查询速度,因为实际情况下很少有根据ROWID来查找数据的。
  7. DM提供三种方式供用户指定聚集索引键。CLUSTER PRIMARY KEY:指定列为聚集索引键,并同时指定为主键,称为聚集主键;CLUSTER KEY:指定列为聚集索引键,但是是非唯一的;CLUSTER UNIQUE KEY:指定为聚集索引键,并且是唯一的。
  8. 在dm.ini配置文件中,可以指定配置项PK_WITH_CLUSTER使表中的主键自动转换为聚簇主键。默认情况下PK_WITH_CLUSTER值为1,即建表时指定的主键自动转化为聚簇主键,若为0,则主键不会自动变为聚簇主键。
  9. 指定表的填充因子FILLFACTOR,即指定聚集索引的填充因子。
  10. 查询建表:CREATE TABLE AS SELECT。若用户通过单表的全表查询进行建表操作,则可以通过将ini参数CTAB_SEL_WITH_CONS置为1(默认为0)进行原始表上的约束的拷贝,列上能拷贝的约束包括默认值属性、自增属性、非空属性以及加密属性,表上能拷贝的约束包括唯一约束、PK约束以及CHECK约束。
  11. 当处理复杂的查询或者事务时,由于在数据写入永久表之前需要暂时存储一些行信息或需要保存查询的中间结果,可能需要一些表来临时存储这些数据。DM允许创建临时表来保存会话甚至事务中的数据,临时表中的数据不能像在其它永久表中的数据那样进行备份,在会话或事务结束时,这些表上的数据将会被自动清除。在临时表创建过程中,不会像永久表和索引那样自动分配空间,而是在执行第一次DML语句时,才会为临时表在临时表空间中分配空间,并且对于不同会话,临时表上的数据是独享的,不会互相干扰,即会话A不能访问会话B临时表上的数据。
  12. 对复杂查询的传统响应方式之一是使用一个视图,使复杂查询更易于操作,但是视图在每次访问时都需要执行,因而降低了性能。而通过AS SELECT子句(如:WITH TMP1 AS (SELECT * FROM TEST1),TMP2 AS (SELECT * FROM TEST2) SELECT * FROM TMP1 UNION ALL SELECT * FROM TMP2;)建立的临时表是将复杂查询的结果通过临时B树记录了下来,下次访问不用重新执行查询就可以获得数据,并且会话或事务结束后数据将自动清除,是复杂查询的一个优秀解决方案。
  13. DM临时表支持以下功能:在临时表中,会话可以像普通永久表一样更新、插入和删除数据;临时表的DML操作产生较少的REDO日志;临时表支持建立索引,以提高查询性能;在一个会话或事务结束后,数据将自动从临时表中删除;不同用户可以访问相同的临时表,每个用户只能看到自己的数据;临时表的表结构在数据删除后仍然存在,便于以后的使用;临时表的权限管理跟普通表一致。
  14. 临时表ON COMMIT关键词制定表中的数据是事务级还是会话级,默认为事务级。ON COMMIT DELETE ROWS:指定临时表为事务级,每次事务提交或回滚之后,表中所有的数据都被删除;ON COMMIT PRESERVE ROWS:指定临时表为会话级,会话结束时才清空表,并释放临时B树。如:CREATE TEMPORARY TABLE TMP1(A INT,B VARCHAR) ON COMMIT PRESERVE ROWS;
  15. 修改表时,若想更改的表在所属的模式中,用户需要有ALTER TABLE权限;若在其他模式中,用户需要有ALTER ANY TABLE权限。
  16. 当给一张表增加列时,若ini参数ALTER_TABLE_OPT为1时,添加列采用查询插入实现,可能会导致ROWID的改变;ALTER_TABLE_OPT为2时,系统开启快速加列功能,对于没有默认值或默认值为NULL的新列,系统内部会标记为附加列,能够达到瞬间加列的效果,此时ROWID不会改变,若有默认值且默认值不为NULL,则仍旧采用查询插入实现。(若数据量大的情况下,且要给表加列,默认值不为空,可以将ALTER_TABLE_OPT设置为2,再增加列,且默认值为空,最后再设置该列的默认值。没验证过,不知道这样操作会不会更快)
  17. 当一个表不再使用时,可以将其删除。删除表时,将产生以下效果:表的结构信息从数据字典中删除,表中的数据不可访问;表上的所有索引和触发器一起被删除;所有建立在该表上的同义词、视图和存储过程变为无效;所有分配给表的簇标记为空闲,可被分配给其它的数据库对象。
  18. 一般情况下,普通用户只能删除自己模式下的表,若要删除其它模式下的表,则必须具有DROP ANY TABLE数据库权限。
  19. 使用DELETE清空表,当表有很多行时,会消耗很多系统资源,因为DELETE操作需要CPU时间,并且会产生大量的REDO日志和UNDO记录。若要清空表,不建议使用DELETE,可以用TRUNCATE。TRUNCATE是一个DDL语句,不会产生任何回滚信息,执行TRUNCATE会立即提交,且不能回滚。TRUNCATE语句不影响与被删除的表相关联的任何结构、约束、触发器或授权。TRUNCATE表后,原来分配给该表的空间会被释放,供其它数据库对象使用。若要清空的表被其他表引用,即其它表的外键引用了表的任何主键或唯一键,并且子表不为空或子表的外键约束未被禁用,则不能TRUNCATE该表。
  20. 查看表定义有如下几种方法:SELECT SP_TABLEDEF(‘SCH_NAME’,’TAB_NAME’);  SELECT TABLEDEF(‘SCH_NAME’,’TAB_NAME); SELECT DBMS_METADATA.GET_DDL(‘TABLE’,’TAB_NAME’,’SCH_NAME’);
  21. DM支持INT和BIGINT两种数据类型的自增列,并提供以下函数查看表上的自增列的当前值、种子值和增量等信息:SELECT IDENT_CURRENT(‘SCH_NAME.TAB_NAME’); SELECT IDENT.SEED(‘SCH_NAME.TAB_NAME’); SELECT IDENT_INCR(‘SCH_NAME.TAB_NAME’);

你可能感兴趣的:(达梦数据库)