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

表空间碎片化一二

最近遇到一个问题,有人说表空间的自动扩展会带来碎片化,我觉得这是一个误区,有必要说说。1.什么时候开始出现碎片化?表空间是一个逻辑的概念,为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一

最近遇到一个问题,有人说表空间的自动扩展会带来碎片化,我觉得这是一个误区,有必要说说。

 

1.什么时候开始出现碎片化?
表空间是一个逻辑的概念,为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空间可以包含多个数据文件。
表空间存放的是段(segment)。而段是数据库一种逻辑结构,包括表段,索引段,回滚段等,段存在于表空间中,并对应一定的存储空间。

那什么时候开始出现碎片化呢?
所有的Oracle段(为了理解方便,后面把segment作为表的一个同义词)都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。
这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。原则上HWM只会增大,不会缩小,即使将表中的数据全部删除(delete),HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。
回过头来,当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在连续的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择),而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。

以上就是产生碎片化的原因。最理想的状况就是一个表初始化后所有段都是连续的,这样就不会有碎片,但是实际生产中不可能所有的表都是不变的。只要表的数据一发生变化就会存在扩展,一涉及到扩展,数据库就有可能申请到分隔开的较小的自由空间,所以说碎片化的产生和和表空间自动扩展还是手工扩展没有啥关系。如果非要保证表空间不会出现碎片化,那么就只有一种可能----数据库不会再发生变化。

2.怎么调整表空间的大小?
表空间是一种逻辑的概念,所谓调整表空间大小其实就是调整这个表空间所对应的物理上的数据文件的大小。
一个表空间可以包含多个数据文件,这些数据文件可以一部分是自动扩展的,可以一部分是不能自动扩展的。
调整表空间的手段有:
(1)添加数据文件
(2)给数据文件设置自动扩展:在块大小为8K的表空间,最大值为:32768M,换句话说,如果这个表空间的某一个数据文件的初始值是10G,那么将该数据文件设置为自动扩展后,该数据文件的最大值能达到32G,而当这个数据文件达到了32G后,如果需要扩展表空间的大小,那么仍然需要添加新的数据文件。
(3)对数据文件进行resize。这个用在2个地方:第1个是觉得初始化的数据文件过大需要收缩可以用;第2个是初始化的数据文件过小,且关闭了自动扩展,那么也可以用resize来使得数据文件变大。

3.是否需要设置表空间自动扩展呢?
个人觉得很有必要,为什么呢?当表空间被写满的时候,如果没有自动扩展的功能,那么相应的表空间就会报错夯住,数据写不进去,这个时候就会影响业务了。而Oracle自身就提供了数据文件自动扩展的功能,我们为什么不用它呢?非要自己监控然后自己再去手工resize来扩展表空间以获取更多的犯错几率?

4.自动扩展是否会影响性能?
当然会影响性能!假设初始化一个表空间只有一个数据文件且这个数据文件设置了自动扩展,这个数据文件只有10G。当表空间满了达到10G的时候,数据文件会一边扩展一边写入数据,肯定对数据库的性能有影响。

表空间能自动扩展的触发条件是什么?
(1)表空间满了
(2)对应的数据文件还有扩展的空间(8K的块大小对应的数据文件最大为32G)
如果表空间满了,而且它对应的数据文件已经扩展到最大的32G了,那么当自动扩展开始的时候,这个表空间仍然会报错,告知无法扩展。

怎么避免或者减少自动扩展带来的性能问题呢?
最不差钱的方法就是咱存储空间特别多先给表空间分配足够多足够大的数据文件;如果没有那么多存储的话,那就在初始化表空间的时候分配一定数量的数据文件,将一部分直接设置为最大的32G,另外一部分初始化为10G并让其自动扩展。剩下的就是监控表空间使用率,当表空间达到一定阈值的时候,对其添加新的数据文件。


推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • andr ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
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社区 版权所有