Sql server 多索引或覆盖索引以及包含?

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].[

我有一个很大的过程,它在一个表中执行大量更新和选择,表中有大约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])

我的问题是,我是否应该:

  • 创建它建议的所有索引

  • 创建包含所有列的覆盖索引,例如

  • 创建包含所有列的索引,例如
  • 其他组合

  • 我知道可能没有一个确切的答案,但您会推荐哪一个?为什么?

    添加索引的主要问题是,它们会减慢数据更新操作(插入、删除、更新),因为索引也需要更新

    虽然这个答案是基于意见的,但imo有一个主要考虑因素——表格更新的频率(例如,新的插入/更新/删除)

    • 如果没有任何更新(或只有手动更新),则根据需要创建尽可能多的索引-这可以针对参考表等进行,但这不是参考表
    • 或者,如果它是一个带有数据负载的数据仓库表,然后每天完成索引重建,那么它也是可行的
    • 另一方面,如果它有很多更新,例如每次加载一个事务,或者以小批量加载,那么更多的索引将降低这些更新的性能
      • 出于这个原因,我通常非常反对在事务表上使用许多非聚集索引(以及太宽的索引)
    注意:对于索引,主索引中只能有一定数量的字节(尽管包含字段可能更长)。因此,对所有字段进行索引可能是不可行的。此外,将所有这些字段作为索引的一部分可能不会有帮助——当它需要(比如)ColB时,数据已经按ColA排序了——因此它无论如何都需要再次读取整个索引

    就我个人而言,我建议先在
    [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])