text: 每个DBA都应该知道：进行数据库优化的方法
  优化操作数据库及其访问应用的性能是数据库管理员（DBA）持续进行的挑战。当然，编写高效的SQL是确保数据库优化性能的最重要方面，但是对SQL的调整或系统的调优都无法优化针对设计不良或组织混乱的数据库运行的查询的性能。因此，必须花时间对数据库对象的设计、参数和物理结构进行调优和优化，特别是对表和索引以及存储它们数据的文件。如果数据库效率降低，必须不断监控数据库对象的实际组成和结构，并相应地进行变更。为了应用适当的数据库优化技术，DBA必须对DBMS的许多方面有所了解。尽管可能名称不同，但大多数主要的DBMS都支持以下做法。以下每种技术都可以用于调优数据库性能：分区 - 将单个数据库表分割成多个文件中的部分原始分区与文件系统 - 选择是否将数据库数据存储在操作系统控制的文件中索引 - 选择合适的索引和选项以实现高效的查询反规范化 - 从逻辑设计中变化以获得更好的查询性能聚类 - 强制磁盘上数据的物理顺序交织数据 - 将多个表的数据合并到单个顺序文件中空闲空间 - 留出数据增长的空间压缩 - 通过算法减少存储要求文件放置和分配 - 将正确的文件放在正确的位置页大小 - 使用适当的页大小（或块大小）进行高效的数据存储和I/O重组 - 通过重新对齐和重构数据库对象，从数据库中移除效率低下的部分尽管，无疑，所有这些技术在不同的时候都是有用和适当的，但建立适当的索引和重组数据结构无疑是两种最重要的数据库性能方法。索引在数据库表中创建正确的索引可能是数据库管理员（DBA）可以执行的最重要的性能调优技术。索引可以通过以下方式提高性能：根据列中的值定位行使连接更加高效在表间关联数据聚合数据对满足查询的数据进行排序如果没有索引，对数据库中的数据的所有访问都必须通过扫描所有可用的行来执行，这对于大型表来说效率非常低。在通过创建新索引进行调优之前，务必要了解添加索引的影响。这意味着需要了解将要创建索引的表的访问模式。有用的信息包括访问而不是更新表的查询的百分比，为表上的查询设定的服务级别协议内的性能阈值，以及在运行数据库实用程序（如加载、重组和恢复）时添加新索引的影响。偶尔会有一些善意的人问，“一个表应该创建多少个索引？”这个问题没有固定的答案。DBA将需要利用他们的专业知识来确定每个表的适当的索引数量，以便优化数据库查询，并且不会降低数据库插入、更新和删除的性能。确定每个表的适当索引数量需要对数据库和访问数据库的应用程序进行深入分析。索引分析的一般目标是使用较少的I/O满足对表的查询。当然，索引可以帮助某些查询，也可能妨碍其他查询。因此，DBA必须评估向所有应用程序添加索引的影响，而不仅仅是在真空中调整单个查询。这可能是一项艰巨但有益的任务。有许多正确的索引设计方面需要熟练的DBA和性能分析师了解，但现在，让我们转向下一个重要话题。数据库重组关系技术和SQL使得数据修改变得容易。只需发出带有适当WHERE子句的INSERT、UPDATE或DELETE语句，DBMS就会处理实际的数据导航和修改。为了提供这种抽象级别，DBMS处理磁盘上数据的物理放置和移动。理论上，这使每个人都感到满意。程序员的接口简化了，RDBMS负责处理困难的部分——操纵数据的实际放置。然而，事情并非如此简单。随着DBMS物理管理数据，事情可能会出现错位或混乱，这可能会导致性能问题。每个DBA都遇到过这样的情况：查询或应用程序在投入生产一段时间后，原本运行良好的性能会变慢。这些减速有许多可能的原因，其中之一可能是数据库混乱，这是当数据库的逻辑和物理存储分配包含许多散乱的存储区域，这些区域太小，不是物理连续的，或者组织太混乱，无法有效地使用。引起混乱的主要原因是非聚簇（随着数据的添加和改变，数据可能不在聚簇序列中）、分段，即数据分散在许多存储区域、页面分裂，即一个页面分裂为两个以容纳新数据、文件扩展，即添加更多关联文件以容纳增长、行链接（或行迁移），即更新的数据不适合当前占用的空间，DBMS在其他地方找到空间，需要指向另一个页面或块的指针，这会减慢后续的访问。重组可以解决所有这些问题。通常使用数据库实用程序，重组会寻找并修复数据库混乱。有时需要卸载和重新加载数据以便进行重组。可以使用来自系统目录的统计查询来确定何时重组数据库对象。每个DBMS都提供了一种方法，通过该方法可以读取数据库的内容，并记录每个数据库对象的统计信息。根据DBMS的不同，这些统计信息存储在系统目录中，或者存储在数据库对象本身的特殊页面中。其他方法当你开始进行调优和优化工作时，这个关于数据库性能的简要总结应该会有所帮助。当然，这个性质的专栏中可以提供的详细信息还有很多，所以请把这个作为一个跳跃点，去了解更多的数据库性能技术。