Sql server 聚集索引对数据库性能的影响
我最近参与了一个新的软件项目,该项目使用SQLServer2000作为数据存储 在查看该项目时,我发现其中一个主表在其主键上使用了聚集索引,该主键由四列组成:Sql server 聚集索引对数据库性能的影响,sql-server,database-design,indexing,sql-server-2000,Sql Server,Database Design,Indexing,Sql Server 2000,我最近参与了一个新的软件项目,该项目使用SQLServer2000作为数据存储 在查看该项目时,我发现其中一个主表在其主键上使用了聚集索引,该主键由四列组成: Sequence numeric(18, 0) Date datetime Client varchar(9) Hash tinyint 此表在正常操作过程中经历了大量插入 现在,我是C++开发人员,不是dB管理员,但我对这个表设计的第一印象是,将这些字段作为聚集索引对插入性能非常不利,因为数据必须在每个插入
Sequence numeric(18, 0)
Date datetime
Client varchar(9)
Hash tinyint
此表在正常操作过程中经历了大量插入
现在,我是C++开发人员,不是dB管理员,但我对这个表设计的第一印象是,将这些字段作为聚集索引对插入性能非常不利,因为数据必须在每个插入件上物理重新排序。
此外,我看不出这有什么好处,因为必须经常查询所有这些字段才能证明聚集索引的合理性,对吗
因此,基本上,我需要一些弹药,以便在我走向权力机构时说服他们,表的设计应该改变。聚集索引(CI)在不断增加的、狭窄的、很少变化的值上工作得最好。您希望您的CI涵盖在查询中使用>=,最多的列。您对SQL如何创建和使用索引有一些误解 聚集索引,至少不是实时的。它们只是一个逻辑顺序 我不希望基于此结构的性能受到重大影响,在您实际确定与该索引相关的性能问题之前删除聚集索引显然是过早优化 此外,索引可能很有用(尤其是其中包含多个字段的索引),即使对于没有对其中包含的所有列进行排序或查询的搜索也是如此 显然,创建一个由多部分组成的聚集索引应该是有道理的,就像任何索引一样,所以如果您认为它是随意添加的,那么请求它是有道理的
一句话:在实际检测到插入的性能问题之前,不要为插入性能优化索引。这通常是不值得的。如果您的表上只有一个聚集索引,那可能不会太糟糕。但是,聚集索引还用于查找实际数据页中非聚集索引中的任何命中-因此,聚集索引(其所有列)也是表中每个非聚集索引的一部分 因此,如果您的表上有一些非聚集索引,那么您肯定是在a)浪费大量空间(不仅仅是在磁盘上,也在服务器的RAM中!),并且b)性能会很差 一个好的聚集索引应该是:
- 小(最好的选择:4字节的INT)-你的非常糟糕,每个条目最多28字节
- 独特的
- 稳定(永不改变)
- 日增
老实说:只需在表中添加一个代理
ID INT-IDENTITY(1,1)
,并将其作为主集群键-如果您有大量的插入(和更新)操作,您应该会看到性能有很大的提升
有关什么是好的群集键以及它们的重要意义的更多背景信息,请参见: