2013-03-08 87 views
0

我们有一个非常大的数据库,并且使用了我们想要远离的碎片。每当表格变得非常大时,我们就开始创建一个与前一个表格具有相同模式的新表格,并在另一个表格中保留一个数字,以帮助我们找到数据所在的表格。这是一个繁琐的手动过程,意味着我们有数据分布在N个不同的表格上,并且都具有相同的模式。非唯一键上的sql server聚簇索引

我们尝试的想法是通过使用索引来消除对分片的需求。我们的数据查询查询不使用唯一键,并且许多记录在列之间返回值相同。

以下说明了我们对特定表格的许多查找选择,带*的字段表示该字段可能会或可能不会被选中。

where子句:scheduled_test,*脚本,*标签,* ERROR_MESSAGE

组/顺序:messenger_id,时间片,脚本标签,ERROR_MESSAGE,step_sequence,* adapter_type

我的想法是,我不会想要创建一个包含所有这11个字段的索引。我选择了其中3个似乎更常用的包括总是在where子句中的那个。我已经读过,建议不要有太多的领域太宽的索引。我也听说优化器将首先使用索引字段,即使MSDN声明唯一索引是最大优势,但拥有非唯一索引并不少见。这不仅仅是我们的数据设计。我意识到SQL会向索引添加一些东西来使其具有独特性,但这对我们的目的似乎并不重要。

当我查看与我们可能运行的查询类似的SQL Server管理工作室的执行计划时,它说“聚集索引查找成本100%”,但它使用我创建的聚集索引我希望这比只是生成的主键的默认聚簇索引(以前如何定义表)更好。我希望我在这里拥有的和我们的分片方法一样好或者更好,并且会消除对分片的需求。

我们一次将大量数据插入表中,但这些行在许多列中都有相同的数据值,我认为他们甚至会倾向于在最后插入数据。这些插入不会与较旧的数据共享值,如果索引只是3列,希望这对插入不会造成太大打击。

我说的话看起来是否合理,还有什么我应该考虑或考虑的?非常感谢,我对这些类型的索引问题并不熟悉,但一直在各种网站上进行查看和试验。

+2

单词“键”和“非唯一”是正交的。如果列不唯一,则不能将其称为键。 – 2013-03-08 20:11:57

回答

3

通常,聚簇索引越窄越好,因为聚簇索引的聚簇键将被添加到所有非聚簇索引中,使得它们效率较低。

SQL服务器会为非唯一聚簇索引添加一个唯一值,使它们(以及所有非聚簇索引)仍然更宽。

如果这些索引使用的空间对您来说不是问题,那么您应该考虑聚集索引键的值是否不断增加(或减少),就好像它不是,您将得到页面拆分和碎片,肯定会伤害你的插入。

如果您可以检查不同索引策略对普通查询的影响,可能需要在测试系统中设置此值。

相关问题