Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 监控和提高数据库性能 » 提高数据库性能 » 性能提高提示

 

减少表碎片

当没有连续存储行时,或者当行在多个页之间被拆分时,会出现表碎片。这些行需要附加的页面访问,因此会降低数据库服务器的性能。

碎片对性能的影响在不同情况下各不相同。表的碎片可能非常多,但是如果表装入内存,并且访问表的方式允许对页进行高速缓存,则碎片对性能的影响可能会非常小。另一方面,如果频繁地访问拆分行并且高速缓存不能减少额外 I/O 的开销,则可能需要更多的 I/O 才能访问碎片表,从而导致性能显著降低。

尽管重组表和重建数据库可减少碎片,但此类操作过于频繁或不够频繁也会影响性能。使用下面一节中介绍的工具和方法进行试验,以确定表的可接受碎片程度。

如果减少了碎片但性能仍然很差,则可能存在另外的问题(如不准确的统计信息)。

确定表碎片的程度

可以使用 sa_table_fragmentation 系统过程来获取有关数据库表的碎片程度的信息。要确定是否整理碎片以提高性能,仅运行一次此系统过程是没有用的。而应重建数据库并运行此过程来建立基线结果。然后,在较长的时间内继续定期运行该过程,查找其输出变化与性能测量变化之间的关系。这样,您就可以确定表以什么速率进行碎片化才能达到影响性能的程度,从而确定对表进行碎片整理的最佳频率。

要运行此过程,必须具有 DBA 权限。使用以下语句可调用 sa_table_fragmentation 系统过程:

CALL sa_table_fragmentation( [ 'table-name' [, 'owner-name' ] ] );
减少碎片的方法

以下方法有助于控制表碎片:

  • 使用 PCTFREE   SQL Anywhere 在每一页上保留了额外的空间,以允许行略微地增大。当对行的更新使行大小超过为它分配的初始空间时,该行将被拆分,而初始行位置将包含一个指针,它指向存储整个行的另一页。例如,如果用 UPDATE 语句填充空行或将新列插入表,可能会导致严重的行拆分。当更多的行存储在单独的页上时,需要更多的时间来访问附加页。

    通过指定应该为将来的更新而保留的空间在表页中所占的百分比,可以减少表中的碎片数。对 PCTFREE 的指定可以用 CREATE TABLE、ALTER TABLE、DECLARE LOCAL TEMPORARY TABLE 或 LOAD TABLE 来设置。

  • 重组表   可以使用 REORGANIZE TABLE 语句来整理特定表的碎片。重组表的操作不会中断数据库访问。

  • 重建数据库   倘若重建分两步过程执行(即,将数据卸载并存储到磁盘,然后重装),则重建数据库将整理包括系统表在内的所有表的碎片。以这种方式进行重建还有一个优点,会重排表行以便它们按聚簇索引和主键指定的顺序出现。一步重建(例如,使用 -ar、-an 或 -ac 选项)不会减少表碎片。

另请参见