SQL 2000数据库 以下是一个常用的方案以帮助说明如何选择聚集索引。假设某个表包含一个发票日期列、一个唯一的发票编号列和其它数据。假设每天大约有 10,000 个新的记录要插入到这个表,而SQL 2000数据库租用,申请,购买,注册经常需要搜索这个表中的所有记录以找到一个星期的数据,且有许多用户需要并发存取这个表。不适合在发票编号上设置聚集索引的原因有以下几点:首先,发票编号是唯一值,且用户不会按发票编号的范围进行搜索,因此物理上将发票编号连续放置在磁盘上对搜索不会有什么帮助,因为不可能进行发票编号的范围扫描。第二,发票编号的值很可能是单调递增(如 1001、1002、1003 等等)。如果在发票编号上设置聚集索引,所有新行均将插入到表的末尾(最大的发票编号的旁边),因此,将在同一个物理磁盘位置上产生热点。 接下来,考察发票日期列。要获得最大的连续 I/O,可在发票日期上设置聚集索引,因为用户经常搜索一个星期的数据(大约有 70,000 行)。但是从并发的角度来看,发票日期可能不适合用于聚集索引。SQL Server 2000数据库租用,申请,购买,注册如果在发票日期上设置聚集索引,日期的特性决定了所有的数据都将插入到表的末尾,因此表的末尾所在的硬盘有可能发生热点。请注意插入发生在表的末尾这样一个事实可能会与在同一天插入 10,000 行这样一个事实有所抵消,因此发票日期发生热点的可能性比发票编号要小。而且,硬件 RAID 控制器可以帮助将 10,000 行分散在多个磁盘上,这也减小了发生插入热点的可能性。
对于以上情况没有十全十美的解决方案。可能有必要确定是否值得承担发生热点的风险,如果值得,则可以在发票日期中设置聚集索引,以加速涉及到发票日期范围的查询。如果是这种情况,需仔细监视与该表相关的磁盘上的磁盘队列,并记住插入在到达表的末尾时可能需要依次排队。我建议在这种情况下,在发票日期中定义聚集索引,因为具有可基于发票日期进行范围扫描这一优势,且发票编号在磁盘上的物理位置不连续。 让我们考察另一个让人感觉愉快一些的例子。假设某个表由发票编号、发票日期、发票金额、销售办公室和其它数据组成。假设每天要在这个表中插入 10,000 个记录。且用户经常根据销售办公室查询发票金额。因此,应该在销售办公室这一列中设置聚集索引,因为可根据它进行范围扫描。并且因为新插入的行可能包含不同的销售办公室,因此插入将均匀分散在整个表和表所在磁盘中。 在某些情况下,范围扫描可能不是最重要的问题。假设某个超大型的职员表有职员编号、社会安全编号和其它数据。当插入行时,职员编号就递增。我们假设这个表每天有 100,000 个检索,并且每个检索都是根据社会安全编号提取一个记录。SQL 2000数据库租用,申请,购买,注册在社会安全编号中创建非聚集索引可以为这种情况提供极好的查询性能。在社会安全编号中创建聚集索引可能会提供比非聚集索引稍好的查询性能,但是因为没有涉及范围扫描,所以可能有些多余。本例中的问题是是否在这个表中定义聚集索引。在以前的 SQL Server 版本中,很重要的一点就是即便查询不要求使用聚集索引,也总要在表中定义聚集索引,因为这样有助于删除行空间的恢复。有了 SQL Server 7.0 新的空间分配算法和存储结构,这已不再是问题,SQL Server 2000数据库申请,租用,,购买,注册中我们建议您在社会安全编号中创建聚集索引。对于数据的分布不遵循职员编号连续模式且社会安全编号分布十分均匀的表,该方法非常适合查找该表中的某一列。如果在这种均匀分布的列数据中创建聚集索引,职员记录将均匀地分布在磁盘上。这种分布以及将在下一节讨论的 FILLFACTOR 和 PAD_INDEX 将在整个表中提供开放数据页区域以插入数据。假定新插入职员记录的社会安全编号均匀分布,职员表将均匀填充,从而避免发生页拆分。如果某个表中没有均匀分布的列,就有必要在这个表中创建整型列,并用均匀分布的值填充这一列,以便在这一列中创建聚集索引。查询中没有使用定义了聚集索引的“填充”列或“多余”列,但是使用该列可在磁盘中均匀分布数据 I/O,以改进表的存取并发和总体 I/O 性能。这对于存取频繁的大型 SQL 表是一种非常有效的方法。SQL 2000数据库购买,租用,申请,注册中另一种可能的解决方案是不在这个表中创建聚集索引。本例中,SQL Server 7.0 对空间管理的各个方面进行管理。SQL Server 查找可用空间以插入行,重复使用已删除行的空间,而且在有意义时,自动重新组织磁盘上数据页的物理顺序(以产生更多的连续 I/O)。数据页的重新组织发生在数据库文件的自动收缩操作过程中。有关详细信息,请在 SQL Server Books Online 中搜索字符串“Managing Space Used by Objects”和“Space Allocation and Reuse”。
SQL Server 2000数据库 考虑热点的另一种方法是在选择环境中进行考虑。如果许多用户正在用十分接近但实际上彼此都不在同一行的键值选择数据,大多数磁盘 I/O 活动将发生在磁盘 I/O 子系统的相同物理区域中。假如某一列可将键值均匀分布在磁盘中,那么在这一列中为表定义聚集索引,可以使磁盘 I/O 活动的分布更加均匀。如果所有的选择使用的都是同一个唯一键值,则使用聚集索引将不会帮助平衡这个表的磁盘 I/O 活动。使用 RAID(硬件或软件)可以通过将 I/O 分布在多个磁盘驱动器中帮助解决这一问题。可以将此处所介绍的这类行为看成磁盘存取争用问题。但不是锁定争用。
FILLFACTOR 和 PAD_INDEX 的重要性
如果 SQL Server 数据库要经历大量的插入活动,那么很重要的一点是进行计划,以便在索引页和数据页上提供和维持开放空间,防止出现页拆分。当某个索引页或数据页不再能容纳任何新的行,但由于该页中所定义的数据的逻辑顺序需要插入一行时,便会发生页拆分。发生页拆分时,SQL Server 2000 数据库需要分割整页中的数据,并将大约一半数据移动到新的页,以使这两页均有一些开放空间。这会消耗一些系统资源和时间。
当最初生成索引时,数据库将索引 B 树结构放置在连续的物理页上,以便通过连续 I/O 扫描索引页获取最佳 I/O 性能。当由于发生页拆分,需要将新的页插入索引的逻辑 B 树结构时,SQL Server 必须分配新的 8 KB 索引页。这种插入发生在硬盘上的其它位置,从而打断了索引页的物理连续特性。它使 I/O 操作从连续变为不连续,从而使得性能减低一半。可以通过重建索引页以恢复索引页的物理连续顺序来解决过多的页拆分。聚集索引的叶级也会遇到相同的问题,从而影响表的数据页。
银川、伊宁、乌鲁木齐、台北、高雄、香港、澳门、张家界、开封、连云港、海南、河北、黑龙江、河南、湖北、湖南、内蒙、SQL Server 2000数据库、江苏、江西、吉林、辽宁、宁夏、青海、山西、陕西、山东、四川、西藏、新疆、云南、安徽、北京、天津、上海、珠海、深圳、南京、长沙、承德、秦皇岛、保定、黄骅、大同、五台山、
广州、宁波、无锡、苏州、杭州、扬州、常州、沈阳、浙江、福建、甘肃、广东、广西、贵州、大连、SQL 2000数据库、长春、哈尔滨、石家庄、太原、包头、呼和浩特、锦州、鞍山、抚顺、丹东、牡丹江、温州、合肥、九华山、黄山、武夷山、福州、厦门、赣州、庐山、景德镇、南昌、烟台、威海、济南、数据库、泰山、淄博、潍坊、青岛、洛阳、郑州、宜昌、武汉、肇庆、惠阳、汕头、湛江、桂林、南宁、北海、海口、三亚、西沙、南沙、九寨沟、绵阳、成都、峨眉山、重庆、黄果树、贵阳、大理、昆明、拉萨、延安、西安、华山、敦煌、兰州、西宁。
对于查找或搜索唯一值不是很多的列和列范围的查询,聚集索引比非聚集索引要好得多,因为聚集索引在物理上按顺序排列表数据,从而可以进行键值的连续 64 KB I/O。租用、申请、购买、注册比较适合聚集索引的有州/省、分公司、销售日期、邮政编码和客户地区。在只有唯一值的列上定义聚集索引是一种浪费,除非系统中的典型查询提取大型的连续范围的唯一值。当试图提取每个表中的最佳列以创建聚集索引时,要询问的关键问题是:“是否有许多查询需要根据该列的顺序来提取大量的行?”答案因每个用户环境的不同而不同。某个公司可能根据日期范围进行大量查询,而另一公司可能根据银行分行的范围来进行大量查询。
|
 |
 |
 |
|