好的,我需要再说明一次。我在网上看过文章,但我仍然没有找到明确的答案。
在 SQL Server 2008 中,我有一个“核心”表,其中包含大约 50k 条记录和大量读取活动,在所有查询中都以相同的方式使用。该数据每月更新一次,每秒读取数百次。
数据在字段上具有聚集索引,因为它们经常被访问。假设聚集索引是:
聚集索引
Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
现在,没有比这更多的数据了,因此将额外的几列放入“包含的列”是有意义的,但 SQL Server 不允许在聚集索引中包含列。
因此,我们有第二个索引,其字段与聚集索引基本相同,其他列为“包含列”。但是,根据我的阅读,我相信这可能是多余的?
覆盖索引(非聚集)
Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
包含的列
Field6 varchar(96)
Field7 varchar(96)
非聚集索引是否已经定义了聚集索引中的列?
如果是这样,那么如何创建第二个索引时根本没有列(除了聚集索引中已经存在的内容)?换句话说,我想说“这个索引与聚集索引完全相同......带有几个包含列”。
或者,将所有列放入聚集索引(包括不识别记录的两个)会更好吗?varchar 列确实会更频繁地更新(每天几次而不是每月一次),所以我希望将它们排除在聚集索引之外,但我认为它们足够深,不会影响索引树足以在发生更改时引起任何重新平衡。
那么,有没有一种有效的方法来设置这些索引,以便该表的所有列都可以通过索引获得,而无需返回该表?