用友软件股份有限公司研发过程 U9 数据库索引设计指南 文件编号: 版 本 号 :V1.0 修改状态: 编 写 人 :黄卫 审 核 人 :张红斌 批 准 人 : 批准时间: 第 1 页 共 17 页 适用对象 该指南适用于 U9 设计人员和开发人员。 适用数据库产品 该指南适用于 MS SQL Server 2005 数据库。 版本记录 此部分要记录该文档形成过程中的历次版本变更过程及变更的内容 版本 修改与参与人 修改时间 修改原因 修改概述 审批人1.0 黄卫 2007/06/01 原始文档建立 张红斌 相关文档 此部分包含对该文档起指导与约束作用的相关文档以及预计在该文档指导与约束下将要建立的文档。 1、 《U9 数据库设计规范》 约定 � 标有 ★ 的条目表示强制性规范。 � 无前缀词的“索引”默认指的是非聚集索引。 第 2 页 共 17 页 数据库索引设计细则 1.索引概述 索引是为了加速数据检索而设计的数据库对象。与书中的索引一样,数据库中的索引可以快速找到表或索引视图中的特定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。 另外,索引还可以强制表中的行具有唯一性,从而确保表数据的数据完整性。 2.索引类型 2.1 聚集索引 官方说明: 在 SQL Server 中,索引是按 B 树结构进行组织的。索引 B 树中的每一页称为一个索引节点。B 树的顶端节点称为根节点。索引中的底层节点称为叶节点。根节点与叶节点之间的任何索引级别统称为中间级。在聚集索引中,叶节点包含基础表的数据页。根节点和叶节点包含含有索引行的索引页。每个索引行包含一个键值和一个指针,该指针指向 B 树上的某一中间级页或叶级索引中的某个数据行。每级索引中的页均被链接在双向链接列表中。 第 3 页 共 17 页 (聚集索引结构图) 聚集索引与非聚集索引最大的不同,是索引的叶节点不仅包含索引项,还同时包含数据行,即:聚集索引和表中数据构成了树结构。这意味着获取每条记录(select *)都会比非聚集索引要少一次 IO。 聚集索引最适合排序性质的范围查询,因为从索引树上搜索到第一行数据后,可以不再做索引查找,而是连续读取直至超出需要的数据范围。这个效率是非常高的! 聚集索引键值的排列顺序决定了表数据的物理存储顺序,所以一个表只能建立一个。默认情况下,会为主键自动创建聚集索引。构成聚集索引键的列越少越好,这样不光可以提高B 树便利效率,而且非聚集索引的索引叶节点要包含聚集索引键。 U9 主数据表的主键(ID)和多语表主键(ID、SysMLFlag)默认采用的是聚集索引。如果有特殊情况需要对其它字段使用聚集索引,需要审批。★ 以下访问方式,较适合建立聚集索引: � 包含大量非重复值的列。 � 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。 � 被连续访问的列。 � 返回大型结果集的查询。 � 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不第 4 页 共 17 页 必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。 � OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。 以下访问方式,不适合建立聚集索引: � 频繁更改的列 这将导致整行移动(因为 SQL Server 必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。 � 宽键 来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。 2.2 非聚集索引 官方说明: 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: � 基础表的数据行不按非聚集键的顺序排序和存储。 � 非聚集索引的叶层是由索引页而不是由数据页组成。 非聚集索引中的每...