热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

如何让Oracle表列管理更加简单?

  Oracle数据库是目前为止最复杂的一个数据库之一设置表列宽。也正是这种复杂性,让Oracle数据库能够面对企业各种各样的需求。不过大部分时候,数据库管理员

  Oracle数据库是目前为止最复杂的一个数据库之一设置表列宽。也正是这种复杂性,让Oracle数据库能够面对企业各种各样的需求。不过大部分时候,数据库管理员掌握一些技巧,可以让数据库维护工作变得简单。笔者这里就以Oracle数据库中表列的管理为例,谈谈这方面的问题。

一、 把列设置为UNUSED状态,代替删除设置表列宽

如何让Oracle表列管理更加简单?

当数据库部署完成之后,即使在数据库使用过程中,数据库管理员仍然可以对数据库的表进行维护,如删除列等等设置表列宽。删除列将删除表中每条记录的相应列的值,同时释放其所占用的存储空间。所以如果要删除一个大表中的列时,由于其必须对每条记录都进行相应的处理,为此这个删除列的操作会占用比较长的时间。

  如有个数据库管理员一次在设计一个人员管理系统时,一开始是把人员的住址跟人员信息表放置同一个表中设置表列宽。可是后来证明这个设计是错误的。一方面因为人员住址的字段比较长,而且有些由于住址难以确定,这个字段还是空的。另一方面,一个人员其可能住址变更了好几次,而出于管理的需要,又要保存起以前的住址信息。

  为此最后一个人员可能同时对应多个住址信息设置表列宽。所以后来数据库管理员调整了设计,另外建立了一张表,然后利用人员编号把它们关联起来。由于那时表中的纪录已经比较多了,如果要删除列的话,那么可能这个删除作业需要执行时间比较长。

为了避免在数据库使用高峰期间由于执行删除列的操作而占用过多的系统资源(而且时间比较长),为此笔者建议不要马上采用DROP关键字来删除列设置表列宽

  而可以先用UNUSED关键字把某个列设置为不活跃状态设置表列宽。如可以利用命令ALTER TABLE ADRESS SET UNUSED,把某个列设置为不活跃。如此设置之后,从用户的角度来看,被设置为UNUSED状态的列于被直接删除的列之间是没有任何区别的。

  用户无法通过查询或者在数据字典中看到这些列设置表列宽。而且即使在表中,也可以插入相同列名的列。简单的说,对于用户来说,这个设置为UNUSED的列就好像删除了一样。但是从数据库角度来说,在是不一样的。其这个列只是别设置为UNUNSED列,但是在数据库中仍然是存在的。

  也就是说,这个列所占用的存储空间没有被释放设置表列宽。为此即使在数据库运行的高峰时期,为列加入这个标记也不会占用多少的时间和系统资源。

为此,笔者的意见是,当数据库比较繁忙时而且数据库表中的纪录又比较多,则可以不从物理上删除这个列,而先把这个列标记为UNUSED状态设置表列宽

  这可以减少因为删除列而给数据库正常使用带来的负面影响设置表列宽。虽然这要牺牲一点硬盘空间,可是现在硬盘便宜。为了数据库的性能,牺牲这点硬盘空间是值得的。等到数据库比较空的时候,再把这些列删除即可。这对于用户来说,是不会受到任何影响的。这只是在技术处理上的问题。

为了便于管理这些UNUSED列,在Oracle数据库中还提供了一张视图(这张视图的名字为USER_UNUSED_COL_TABS),帮助数据库管理员来管理这些列设置表列宽。通过查询这张视图,数据库管理员可以了解数据库哪些表中存在UNUSED列。然后数据库管理员可以根据实际情况,一个月或者一年来清除一下。

  这不仅可以提高数据库的运行效率,而且也不会因为删除列的操作影响到用户的正常使用设置表列宽

二、 给列表添加相关的注释设置表列宽

俗话说,好记性不如烂笔头设置表列宽。在数据库设计的时候,给表或者列添加一些必要的注释,可以提高其可读性,也有利于后续的维护与升级。像笔者这种专业的数据库设计与开发人员,往往一个人需要负责很多项目,即同时要负责多个企业的数据库软件。

  当项目数量一多,一年后可能就不知道某个数据库的某张表到底用来做什么用途设置表列宽。即使采用了比较合适的表名字编码或者列名字编码规则,但是凭借这些简单的代码,仍然不能够直观的反应出这些代码的含义。为此,在必要的时候,我们往往需要给表或者列添加相关的注释,方便后续对其进行维护与升级。

如何让Oracle表列管理更加简单?

为了实现这个目的,我们可以利用COMMENT关键字设置表列宽。如COMMENT ON TABLE 表名 IS ‘注释内容’即可。在使用这个命令的时候需要注意的是,注释中的内容必须利用单引号括起来,而不是使用双引号。因为如果注释中含有特殊字符的话,如单引号、通配符等等,最好能够采用其他的字符代替。

  如果非要用这些字符的话,那么就需要采用转义字符,让数据库系统认为这是普通的字符设置表列宽。通常情况下,注释的内容可以多大4000个字节,足够数据库管理员用来表述表的用途。另外在注释的内容中可以包含标点符号、空格字符、特殊字符(不建议使用)等等。而且还可以跨越多个物理行,以提高可读性等等。

  不过虽然其提供了长达4000个字节的说明,但是数据库管理员在写注释的时候,最好能够短话短说设置表列宽。不然的话,以后要花大量的时间来读这些备注的内容,可不是一件好差事。未必笔者认为,在写这个表注释的时候,最好能够点到为止,而不要想写项目说明书那样写的面面俱到。

除了给表添加注释外,在Oracle数据库中还可以给列添加注释设置表列宽。这个添加的方法跟上面的类似,只需要把关键字ON TABLE更改为ON COLUMN 即可。当有多个人共同开发一个数据库时,最好能够在表或者列中添加必要的注释。即使不在这里添加说明,那么在独立的设计文档中,也需要进行详细的说明。

  一般情况下,笔者认为需要说明如下内容设置表列宽。一是创建者(谁创建的或者谁更新的);二是创建的时间(什么时候创建或者什么时候更新的);三是需要注明创建或者更新的目的;四是要注明这个列的一些约束条件。另外需要注意的是,如果后来有人更新这个表或者列的时候,如调整某个字段的大小,最好不要把原先的注释覆盖掉。

  而是直接在原有的注释后面加入新的注释设置表列宽。这些措施有利于后续的维护以及数据库的升级。

三、 重新组织表设置表列宽

有时候出于改善数据库表的性能等目的出发,需要对Oralce数据库的表进行重新组织设置表列宽。如在Oracle数据库中,如果对表进行频繁的DML操作,会使得这个表产生比较多的空间碎片与行迁移,从而给数据库的性能带来负面影响。

  这种情况在一些事务型的数据库中是比较常见的设置表列宽。此时就需要重新组织表,如可以将移动一个位置,从而减少碎片,提高数据库的性能。


推荐阅读
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了Oracle数据库中的自治事务概念,并通过实例演示了其应用场景。自治事务允许在触发器或存储过程中独立于外部事务进行提交或回滚,确保数据操作的灵活性和可靠性。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文探讨了2012年4月期间,淘宝在技术架构上的关键数据和发展历程。涵盖了从早期PHP到Java的转型,以及在分布式计算、存储和网络流量管理方面的创新。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文详细介绍了 Oracle 数据库中 TRUNC 函数的两种用法:日期截断和数值截断。TRUNC 函数用于根据指定格式或精度对日期和数值进行截断处理,而不会进行四舍五入。 ... [详细]
author-avatar
宝林
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有