假设我有两个存储过程和一个表。
Table_Aproc1和proc2当我运行带有执行计划的proc1时,它建议我为Table_A for tblID (它不是主键)列创建一个索引,并建议包含column_A和column_B。
proc2建议再次为Table_A创建一个索引,用于tblID列,但这一次它建议包括column_B和column_C (这个过程建议column_C而不是column_A )。
因此,我的问题是,如果我创建了一个索引,其中包括所有建议的列,如:
CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])这会导致性能问题吗?
收集INCLUDE列有什么缺点吗?
或者我是否应该创建两个不同的索引:
CREATE NONCLUSTERED INDEX indexTest_1
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B])
CREATE NONCLUSTERED INDEX indexTest_2
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_B],[column_C])更新:,我想在这个问题上再添加一件东西。
如果我也对主字段执行同样的操作:
我是说,
proc-1建议在tblID字段上创建一个索引。proc-2建议在tblID和column_A上创建一个索引。
如果我把它们收集起来:
CREATE NONCLUSTERED INDEX indexTest_3
ON [dbo].[Table_A] ([tblID],[column_A])
INCLUDE ([[column_B])这会导致性能问题吗?还是应该为建议的主字段创建两个单独的索引?
发布于 2014-05-06 18:06:27
一定要创建包含所有三列的one索引!
索引越少,索引维护越好--索引维护是一个成本因素--更多的索引需要更多的维护。
所包含的列仅包含在索引的叶级中--这对性能的影响非常小。
Update:如果您在(tblID, column_A)上有一个索引,那么您可以将其用于在WHERE子句中只使用 tblID的查询,也可以用于在WHERE子句中使用两列的查询。
:但是,对于在WHERE子句中只使用 column_A的查询,此索引是无用的。一个复合索引(由多个列组成的索引)只有在给定的查询使用时才有用,这是索引中指定的n个最左边的列。
因此,在您的示例中,一个查询似乎表示tblID,而另一个查询则需要(tblID, column_A) --因此,在本例中,我认为(tblID, column_A)上的单一索引将适用于这两个查询。
发布于 2014-05-06 18:08:30
听起来你在看缺失指数dmvs。这里有几件事要意识到。dmvs确实告诉您一些特定的查询或类似于特定索引可能有帮助的组。
从这个意义上说,组合索引是正确的。这是正确的主意。
但是,也要记住索引是有代价的,衡量成本不是这个dmv的工作。您肯定不希望仅仅自动创建一个索引来覆盖每个推荐。您还需要检查这些索引:一旦包含了A、B和C列,是否将整个表(或几乎是这样)保存在索引中?您是否可以通过更改主键以匹配此索引来获得更好的结果?请仔细评估最后一部分,因为更改主键可能会将先前的键保留为更重要的缺失索引。
https://stackoverflow.com/questions/23501707
复制相似问题