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

不让链化现象影响数据库性能

正常情况下往表中新建记录时,数据库系统会将数据写入到块并会像这行记录提供一个ROWID值。这个值记录了这条记录在硬盘上存储的位置。在更新某条记录的时候,也是如此。数据库系统会根据ROWID的值将需要更新的记录从硬盘中读取到块中;然后更新完毕后,再将

正常情况下往表中新建记录时,数据库系统会将数据写入到块并会像这行记录提供一个ROWID值。这个值记录了这条记录在硬盘上存储的位置。在更新某 条记录的时候,也是如此。数据库系统会根据ROWID的值将需要更新的记录从硬盘中读取到块中;然后更新完毕后,再将

正常情况下往表中新建记录时,数据库系统会将数据写入到块并会像这行记录提供一个ROWID值。这个值记录了这条记录在硬盘上存储的位置。在更新某 条记录的时候,也是如此。数据库系统会根据ROWID的值将需要更新的记录从硬盘中读取到块中;然后更新完毕后,再将块中的记录保存到硬盘对应的位置。更 新过程中,ROWID列的值通常情况下不会改变。

但是如果一个块的容量不能够容纳一条记录。也就是会所,当单个数据块没有足够的空间来保存新建的一行记录或者更新的某行记录时,就会发生链化现象。 到一个数据库的容量不足以容纳一条记录时,那么数据库就不得不动用更多的数据块来保存这条记录。在Oracle数据库中,如果某条记录需要利用多个数据库 来保存,我们往往把这行记录叫做链化行。而在访问一行记录时,如果需要访问多个数据块,则会比访问单个数据块需要耗费更多的服务器资源,会大大降低数据库 性能。我们把这种因为链化行而导致的数据库性能下降的现象叫做链化现象。根据专家统计,严重的话,链化现象可能降低数据库10%的性能,甚至更多。所以数 据库管理员如果在数据库部署中,能够有效避免链化现象,那么就可以在很大程度上提升数据库的性能

一、 如何判断是否有链化现象的存在?

那么数据库管理员该如何判断数据库中是否有链化现象的存在呢?如果没有工具,光凭数据库管理员的眼力或者经验的话,是很难判断的。数据库管理员必须 找一个顺手的工具。其实Oracle数据库设计这已经预计到这个问题对于数据库性能的不利影响。为此在数据库中已经提供了追踪、分析链化现象的工具。在 Oracle数据库安装主目录的/rdbms/admin下有一个脚本文件,名字叫做utlchain.sql。这是Oracle数据库自带的一个脚本文 件。我们可以利用文本编辑器等工具来打开这个脚本文件,可以看到这个脚本文件主要是用来创建一个表,用来保存分析脚本现象所需要的内容。

第一步:创建所需要的表。

首先,数据库管理元需要执行Oracle数据库提供的utlchain.sql脚本文件。这个文件位于Oracle主目录下的/rdbms /admin下。这个脚本主要的用途就是建立一个表格。这个表格很有用。数据库系统会把分析的结果保存到这个表中。默认情况下,这个表格在安装数据库时并 不会自动生成。如果数据库管理员需要分析数据库中是否存在链化现象,那么就需要手工执行这个脚本文件,以建立这张表格。这张表格中,,主要有表名、 HEAD_ROWID列等等。

第二步:分析目的表格。

创建上面的表格后,默认情况下里面是没有数据的。因为还没有进行相关的分析。假设现在在数据库中有一个Product的表格,主要用来保存产品信 息。现在数据库管理员想要知道,数据库系统在操作这张表格数据的时候,是否存在有链化现象。此时,数据库管理员就需要利用下面的语句来进行分析查询。

Analyze table product list chained rows;

上面这条语句的作用,就是会分析product这张表格。判断这张表格中的记录是否存在在不同的块中。如果这个product表格中,有记录存储在 不同的块中,则这条语句就会把相关的结果保存到刚才建立的表中。所以,如果数据库管理员查询刚才建立的表chained_rows,如果这个表中有相关记 录的话,则就说明数据库中存在链化现象。数据库管理员需要采取相应的措施来避免这种情况。如果没有的话最好。

不过在使用这个语句的时候,需要注意几点。一是每次分析完治后,最好把这个表个中的记录删除。因为下次分析的时候,如果表中有记录的话,系统不会自 动删除。所以在分析另外一个表的时候,如果也有链化现象。那么此时相关的记录就会很多,数据库管理员阅读的时候会出现故障。二是这个分析的频率最好频繁一 点。当数据库中的记录比较多时或者数据更新比较频繁的情况下,最好能够每隔几天就执行一下这个分析语句,以判断是否有链化现象的存在。等到大量记录或者表 格有链化现象的时候,处理起来就会比较困难了。所以对于大部分事务型的数据库系统,数据库管理员要养成一个周期性分析的习惯。对于大部分的数据库优化作业 来说,事先追踪远远比时候解决要重要的多。当问题出现后再去解决的话,往往会大费周章,有些即使采取有效的措施,也指能够避免后续的操作不会出现这种情 况。要解决以前的记录问题,只有重新导出、导入数据后才能够彻底解决。显然这会增加工作量与数据风险。为此笔者再不厌其烦的强调一次,对于这个链化现象的 追踪分析,最好能够每个星期执行一次。特殊情况下,还可以利用任务计划,每天执行一次。尽早发现问题,并采取有效措施来避免这种情况。

二、 如何避免链化现象?

当数据库发现有链化现象时,就需要及时调整相关设置,来避免这种情况。造成链化现象的主要原因是由于块的大小设置不合适所造成的。如果一个数据块的 大小不能够容纳一条记录,那么就容易造成链化现象。所以如果适当调整数据块的大小,能够在很大程度上避免这个链化现象。在Oracle数据库中,为了有效 避免链化现象,可以通过调整参数PCTFREE来实现。这个参数的主要用途就是为更新一个块所保留的空间。有时候系统默认的值往往不能够满足需求。为此需 要数据库管理员根据实际需要设置合适的值。值得注意的是,这个值可以根据表来进行设置。为此如果数据库管理员认为某张表的记录可能比较长,需要占用比较大 的空间时,则可以针对这张表设置比较大的块。

虽然通过调整PCTFREE参数可以有效避免链化现象。但是有时候表设计不当也是造成这个问题的主要原因之一。如有一张表M_PRODUCT表格, 用来存放产品信息。在这张表中,其产品信息主要分为成品与原材料两类。其中原材料这类产品中,在系统中需要记录详细的产品规格信息,而且还需要同时记录中 英文内容。所以光这个产品规格,中英文加起来最多的就有3000个左右的字符。而成品信息的话相对来说比较简单。此时这个表中的记录就存在着两极分化的现 象。有些记录的容量很大,需要利用多个数据块来进行保存,就发生了链化现象。而有些记录的话,容量不是很大。此时虽然可以通过给这个表设置比较大的数据块 来解决这个链化现象;但是同时也会浪费数据空间。因为还有大部分记录的话,根本用不到这么大的块空间。所以在这种情况下,片面调整PCTFREE参数,会 降低硬盘空间的利用率。此时,笔者认为最好能够调整数据库表格的设计。如可以将产品规格字段保存在另外一个表格中,然后通过关键字连接到Product表 格中。如此的话,在Product表格中,所有记录的的长度都会差不多。此时再根据需要来调整PCTFREE参数,不仅可以有效避免链化现象,而且还同时 提高了硬盘空间的利用率。当然,对于新建立的表格,需要适当的提高PCTFREE参数,避免其出现链化现象。不过这个基表的调整,对于已经投入使用的数据 库系统来说,调整的动作有点大,会影响用户的正常使用。为此在数据库设计的时候,就需要跟用户充分的沟通。在数据库初始化设计时,就能够预见到这种情况。 所以笔者一直强调,数据库优化一定要做在前。

推荐阅读
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 本文总结了设计、开发和部署Web应用程序时应遵循的一些最佳实践,这些实践结合了个人经验和权威资料,旨在帮助开发者提高Web应用的安全性。 ... [详细]
  • 图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • 近期遇到了一个系统中在线文本编辑器上传本地图片时报服务器异常的问题。经过初步调试和排查,最终找到了解决方案。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • 本文介绍了编程语言的基本分类,包括机器语言、汇编语言和高级语言的特点及其优缺点。随后详细讲解了Python解释器的安装与配置方法,并探讨了Python变量的定义、使用及内存管理机制。 ... [详细]
  • 选择一个合适的编辑器,比如notepad++、VS、eclipse、sublimetext等,选中要集体缩进的代码块,按Tab:集体缩进(向右)按Shift+Tab:集体回缩(向左) ... [详细]
  • AutoCAD 2018 菜单栏和工具栏显示方法及配置
    本文介绍了 AutoCAD 2018 中菜单栏和工具栏的显示方法,并提供了详细的配置步骤,帮助用户更好地使用 CAD 软件。 ... [详细]
  • 本文详细介绍了如何将Spring框架与Hibernate ORM框架进行集成,包括配置文件的设置和数据持久化操作的实现。 ... [详细]
  • 如何将两个具有相同主键的Excel表格合并
    本文介绍如何将两个具有相同主键的Excel表格进行合并,通过左连接的方式将表2的数据插入到表1中。具体步骤包括在表1中添加新的列、使用VLOOKUP函数进行数据匹配,以及通过SQL语句实现数据库中的表连接。 ... [详细]
  • 解决Win7安装SQL Server时NetFx3启动失败的问题
    在使用Win7系统安装SQL Server时,部分用户可能会遇到“启动Windows功能NetFx3时出错”的提示。本文将详细介绍这一问题的原因及解决方法。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 本文讨论了在 Oracle 10gR2 和 Solaris 10 64-bit 环境下,从 XMLType 列中提取数据并插入到 VARCHAR2 列时遇到的性能问题,并提供了优化建议。 ... [详细]
  • 本文探讨了在 SQL Server 2012 的 Integration Services 项目中配置 ADO.NET 源时遇到的错误及其解决方案。 ... [详细]
author-avatar
城哥_1986
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有