2010-08-30 34 views
0

我的问题是关于在表上聚集索引的限制。根据理论,在单个表中,我们只能有一个集群索引。但是如果我在表格中有日期时间的列,说“From date”和“To date”?这些列通常需要在WHERE子句中填充我的应用程序中的报表。如果我还需要在同一个表中的主键上创建一个集群索引,那么仍然如何在其他列上获得集群索引的优势?在这种情况下,我的查询仍然会在较大的记录中运行得更慢多个集群索引效应

回答

2

实际上,您也可以在表上只有一个聚簇索引 - 因为表的数据是由该聚簇索引物理排序的。

如果您在WHERE子句中频繁需要两个日期时间列,最好的选择是在这两列上有一个非聚集索引,并且可能包含您经常用这些查询检索的其他列,以便使它一个covering index

就查询性能而言,在包含非聚簇索引和聚簇索引的情况下,确实没有太大区别。

但是,你不想膨胀你的聚集索引,因为这些列也将被添加到同一个表上的所有非聚集索引 - 保持它很小,最好是一个INT,不断增加,稳定(不改变),你应该很好。

+0

想一想吧..谢谢了! – 2010-08-31 04:05:37

0

如果您需要为同一个表的多个索引执行集群索引表,那么我看到的唯一路由是为每个集群索引保留一个表副本。

0

聚集索引影响表中数据的物理存储,所以根据定义,只能有一个。您可以扩大聚簇索引以包含其他列,但这可能有其自身的缺点。

聚集索引的性能优势在于记录以反映索引的方式进行存储(这就是为什么随机插入和更新聚集索引会非常快速地分段表),因此基于此查询性能索引可以像从存储设备读取一样好,但不能在其他索引上获得。

1

另一个选项是索引(或物化)视图:您可以在表上创建多个视图,每个视图具有不同的聚簇索引。这在报告场景中可能很有用,但索引视图有很多限制,并且会影响修改表数据的查询的性能。联机丛书提供了创建和测试所需的全部信息。我怀疑你真正的需求确实是要实现一个报告解决方案,如果是这样,那么最好做到这一点:创建一个单独的数据库,其中包含一个针对报告优化的模式(Google“星型模式”)和加载数据定期从主数据库导入报告中。但这是一个全新的研究领域,我不会急于进入。

+0

意见也是一个不错的选择。感谢名单! – 2010-08-30 09:00:11

0

我建议你选择你从中获得最大收益的索引,并将其作为聚集索引。使剩余的索引不聚集。您可能想要运行一些测试,以了解将不同索引集群化与非集群化所带来的好处。

分享和享受。