设计SQL Server集簇索引以提升性能(二)

日期: 2009-02-01 作者:Matthew Schroeder翻译:陈柳/曾少宁 来源:TechTarget中国 英文

多对多表和集簇索引 多对多表有非常快速的JOIN并允许快速的从一个记录到另一个记录的重新联合。设想有下面这样的数据结构: CustomerCustomerID (bigint identity)NameFieldn+ CustomerOrderCustomerIDOrderID OrdersOrderID (bigint identity)DateFieldn+ 这些结构中的集簇索引是CustomerID和OrderID。组合键是CustomerID/OrderID。下面这个结构的优点: JOIN都是基于集簇索引(比非集簇索引JOIN快很多)。

将一个Order赋给另一个Customer只需要对……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

多对多表和集簇索引

多对多表有非常快速的JOIN并允许快速的从一个记录到另一个记录的重新联合。设想有下面这样的数据结构:

Customer

CustomerID (bigint identity)NameFieldn+

CustomerOrder

CustomerIDOrderID

Orders

OrderID (bigint identity)DateFieldn+

这些结构中的集簇索引是CustomerID和OrderID。组合键是CustomerID/OrderID。下面这个结构的优点:

  • JOIN都是基于集簇索引(比非集簇索引JOIN快很多)。
  • 将一个Order赋给另一个Customer只需要对CustomerOrder表作一个UPDATE操作,这是改动非常少的,只影响到一个集簇索引。因此,它减少了你在更新一个大表时的数据库锁的时间,如Orders表。
  • 使用多对多表就不需要大表中的一些非集簇索引,如Customer/Orders。因此,它减少大表的维护时间。

这个方法的一个缺点是CustomerOrder表的碎片(不是连续的)。然而,这并不是一个大问题,因为这个表是相对较小的,它只有2个字段,数据类型也很少,并且只有一个集簇索引。这些本来是在包括CustomerID的Orders表的非集簇索引的减少,带来的好处是大于额外开销的。

SQL Server 2005的集簇索引和分割表

SQL Server 2005中的分割表是一些表面上为一个独立的表,但实际上——在存储子系统中——它们包含能够存储在许多文件组(Filegroup)的多个部分。表的部分是根据一个字段的值来分割成不同文件组的。这种方式的分割表会有几个缺点。这里我会说明几个基本的缺点,希望能让你对相关的原因有一些了解。我建议你使用分割表时先学习它的使用方法。

你可以在这个环境中基于一个字段创建一个集簇索引。但是,如果这个字段不是表用于分割的那个字段,那么集簇索引就被称为非对齐的。如果一个集簇索引是非对齐的,那么任何分区的数据进/出(或合并)都需要你删除集簇索引以及非集簇索引,然后再重建这些索引。这是必要的,因为SQL Server并不知道集簇/非集簇索引的哪部分属于哪个表的分区。毫无疑问,这会带来一定的系统停机时间。

分割表上的集簇索引应该总包含常规的集簇字段,它是不断增加和静态的,并且它是用于分割数据库表的。如果集簇索引包含用于分割表的字段,那么SQL Server就知道集簇/非集簇索引的哪个部分属于哪个分区。当一个集簇索引包含了用于分割表的字段时,那么这个集簇索引就是“对齐的”。这时表的分区就可以在数据进/出(和合并)而不需要重建集簇/非集簇索引,这样就不会带来额外的系统停机时间。表的INSERT/UPDATE/DELETE操作也会更快,因为这些操作只需要关注处于它们自己分区的索引。

总结

SQL Server集簇索引是数据体系结构的一个重要部分,我希望你已经从本文学习中知道了为什么你需要在一开始就仔细设计好集簇索引。集簇索引应该是窄小的、静态的和不断增加的,这对于将来数据库的健壮性是非常重要的。集簇索引可能帮你实现更快速的JOIN和IUD操作,并最小化系统的忙时拥塞时间。

最后,我们讨论了SQL Server 2005的分割表是如何影响你对集簇索引的使用,集簇索引与分区的“对齐”的意思是什么,以及为什么集簇索引必须按顺序对齐以使分割表正常工作。请继续关注关于将在二月发表的文章《非集簇索引》(第二部分)和三月发表的文章《最优索引维护》(第三部分)。

Matthew Schroeder是一位高级软件工程师,从事于SQL Server数据库系统开发工作,规模从2GB到3+TB、2k到40+k的每秒事务。Matt目前在游戏供应商IGT工作,它为游戏公司提供服务。他也是一位独立顾问,专门为游戏、汽车、电子商务、娱乐、银行和非营利性行业提供SQL Server、Oracle和.NET技术的咨询服务。Matt精通OLTP/OLAP DBMS系统,以及用.NET实现的高可扩展处理系统。他是一个Microsoft认证MCITP数据库开发人员,拥有计算机科学的博士学位,以及超过12年的SQL Server/Oracle工作经验。你可以通过电子邮件与他联系:cyberstrike@aggressivecoding.com。

作者

Matthew Schroeder
Matthew Schroeder

Matt在SQL Server和Oracle这两个领域具有12年的经验。他获得微软MCITP认证、是一名数据库开发人员,他还获得了计算机科学专业硕士学位是SQL Server数据库系统高级软件工程师,范围从2 GB到3+ TB、2k和40+ktrans/sec之间。目前他任职于IGT公司,同样是一名独立的咨询师、专攻覆盖自动化、电子商务、娱乐和银行业的SQL Server、Oracle以及.NET方面。Matt擅长OLTP/OLAP数据库管理系统以及用.NET语言写可升级的处理系统。

相关推荐