Sql server 多索引或覆盖索引以及包含?
我有一个很大的过程,它在一个表中执行大量更新和选择,表中有大约5000万条记录,查询计划显示缺少索引,这将有助于: 缺少索引(影响89.4367):在[dbo].[myTable]上创建非聚集索引[] ([类别]、[季度]、[可乐])包括([用户ID]、[价格]) 缺少索引(影响90.7279):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLB])包括([UserId]、[Price]) 缺少索引(影响90.4069):在[dbo].[myTable]上创建非聚集索引[] ([类别]、[季度][COLC])包括([用户ID]、[价格]) 缺少索引(影响90.6373):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLD])包括([UserId]、[Price]) 缺少索引(影响88.774):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLE])包括([UserId]、[Price]) 缺少索引(影响89.9133):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLF])包括([UserId]、[Price]) 缺少索引(影响90.1297):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLF])包括([UserId]、[Price]) 缺少索引(影响76.6554):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLG])包括([UserId]、[Price]) 缺少索引(影响90.9105):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLH])包括([UserId]、[Price]) 缺少索引(影响84.1814):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLI])包括([UserId]、[Price]) 缺少索引(影响89.3511):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLJ])包括([UserId]、[Price]) 缺少索引(影响90.3087):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLK])包括([UserId]、[Price]) 缺少索引(影响90.6367):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLL])包括([UserId]、[Price]) 缺少索引(影响75.6598):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLM])包括([UserId]、[Price]) 缺少索引(影响82.8915):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLN])包括([UserId]、[Price]) 缺少索引(影响88.2316):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLO])包括([UserId]、[Price]) 缺少索引(影响81.9138):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLP])包括([UserId]、[Price]) 缺少索引(影响80.1902):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLP])包括([UserId]、[Price]) 我的问题是,我是否应该:Sql server 多索引或覆盖索引以及包含?,sql-server,indexing,Sql Server,Indexing,我有一个很大的过程,它在一个表中执行大量更新和选择,表中有大约5000万条记录,查询计划显示缺少索引,这将有助于: 缺少索引(影响89.4367):在[dbo].[myTable]上创建非聚集索引[] ([类别]、[季度]、[可乐])包括([用户ID]、[价格]) 缺少索引(影响90.7279):在[dbo].[myTable]上创建非聚集索引[] ([Category]、[Quarter]、[COLB])包括([UserId]、[Price]) 缺少索引(影响90.4069):在[dbo].[
我知道可能没有一个确切的答案,但您会推荐哪一个?为什么?添加索引的主要问题是,它们会减慢数据更新操作(插入、删除、更新),因为索引也需要更新 虽然这个答案是基于意见的,但imo有一个主要考虑因素——表格更新的频率(例如,新的插入/更新/删除)
- 如果没有任何更新(或只有手动更新),则根据需要创建尽可能多的索引-这可以针对参考表等进行,但这不是参考表
- 或者,如果它是一个带有数据负载的数据仓库表,然后每天完成索引重建,那么它也是可行的
- 另一方面,如果它有很多更新,例如每次加载一个事务,或者以小批量加载,那么更多的索引将降低这些更新的性能
- 出于这个原因,我通常非常反对在事务表上使用许多非聚集索引(以及太宽的索引)
[Category]、[Quarter]、[COLA]
上建立索引,然后包括所有其他字段。如果使用频率更高,您可以用任何其他列替换ColA。它提供
- ColA部分的良好索引,因为它提供了所需的所有信息(覆盖索引)并正确排序,以及
- 其他部分的覆盖指数
和[Category]、[Quarter]
- 其他字段中的数据很少(例如,表中没有varchar(2000)字段,但该字段未使用)
类似地,如果聚集索引不在
[Category],[Quarter]上,则取决于您可能对表执行的其他操作
那么您可能想这样做。请注意,如果其他任何东西使用此表,您可能会在该表上强制执行较差的性能。如果没有关于您运行的实际查询的信息,一切都是假设。人们就这一主题编写了整本书。我理解,但实际上大约有250个插入和类似数量的s我无法将所有问题都包含在这里,所以只需要一个理论上的答案。非常好的答案,谢谢。表格是pa
CREATE NONCLUSTERED INDEX indexA
ON [dbo].[myTable] ([Category], [Quarter], [COLA], [COLB], [COLC], [COLD], [COLE], [COLF],
[COLG], [COLH], [COLI], [COLJ], [COLK], [COLL], [COLM], [COLN], [COLO], [COLP])
INCLUDE ([UserId],[Price])
CREATE NONCLUSTERED INDEX indexB
ON [dbo].[myTable] ([Category], [Quarter])
INCLUDE ([COLA], [COLB], [COLC], [COLD], [COLE], [COLF], [COLG], [COLH], [COLI],
[COLJ], [COLK], [COLL], [COLM], [COLN], [COLO], [COLP], [UserId], [Price])