Sql server 是否将索引聚集在日志记录表上不断增加的datetime列上?

Sql server 是否将索引聚集在日志记录表上不断增加的datetime列上?,sql-server,indexing,Sql Server,Indexing,我不是DBA(“很好!”,你马上就会想。) 我有一个具有以下特征和使用模式的日志数据表: 一个datetime列,用于存储日志时间戳,日志时间戳的值不断增加,并且大部分(但仅大部分)是唯一的 频繁的ish插入(例如,每分钟十几次),仅在时间戳范围的末尾(记录新数据) 从时间戳范围开始的不频繁批量删除(清除旧数据) 没有任何更新 频繁ish选择使用时间戳列作为主要标准,以及其他列上的次要标准 不频繁选择使用其他列作为标准(不包括时间戳列) 数据量很大,但还远远不够,我非常担心存储空间 此外,目

我不是DBA(“很好!”,你马上就会想。)

我有一个具有以下特征和使用模式的日志数据表:

  • 一个
    datetime
    列,用于存储日志时间戳,日志时间戳的值不断增加,并且大部分(但仅大部分)是唯一的
  • 频繁的ish插入(例如,每分钟十几次),仅在时间戳范围的末尾(记录新数据)
  • 从时间戳范围开始的不频繁批量删除(清除旧数据)
  • 没有任何更新
  • 频繁ish选择使用时间戳列作为主要标准,以及其他列上的次要标准
  • 不频繁选择使用其他列作为标准(不包括时间戳列)
  • 数据量很大,但还远远不够,我非常担心存储空间
此外,目前有一个日常维护窗口,在此期间我可以进行表优化

坦率地说,即使我对该表进行了一点索引错误,我也不希望该表会挑战它将要运行的服务器,但尽管如此,它似乎是一个向SQL server聚集索引请求一些输入的好机会

我知道聚集索引决定了实际表数据的存储(数据存储在索引本身的叶节点中),而非聚集索引是数据的独立指针。所以在查询术语中,聚集索引将比非聚集索引快——一旦我们找到索引值,数据就在那里。insert和delete是有成本的(当然,更改聚集索引列的值的更新成本特别高)

但我读到,删除留下的间隙直到/除非重建索引,否则不会被清除

所有这些都向我建议,我应该:

  • 在timestamp列上放置一个具有100%填充因子的聚集索引
  • 将非聚集索引放在任何其他列上,这些列可以用作不涉及聚集列的查询中的条件(在我的例子中可能是其中的任何一个)
  • 计划在每日维护间隔期间进行批量删除
  • 计划在批量删除后立即重建聚集索引
  • 放松,多出去走走
我是不是太离谱了?我是否需要像那样频繁地重建索引以避免大量浪费空间?(DBA)还有其他明显的事情需要我做吗

提前感谢。

有两种“最佳实践”方法可以索引高流量日志记录表:

  • 作为主聚集键的整数标识列
  • 作为主键的唯一标识符列,带有
    DEFAULT NEWSEQUENTIALID()
  • 这两种方法都允许SQLServer高效地增长表,因为它知道索引树将以特定的方向增长


    除非存在特定的性能问题,否则我不会将任何其他索引放在表中,也不会安排索引的重建。

    我同意将聚集索引放在时间戳列上。我的查询将基于fillfactor-100%以牺牲写入性能为代价提供最佳读取性能。页面拆分可能会对您造成伤害。选择一个较低的填充因子将延迟页面拆分,而以牺牲读取性能为代价,因此这是一个很好的平衡行为,以获得最适合您的情况

    在大容量删除之后,重建索引和更新统计信息是值得的。这不仅可以保持性能,还可以将索引重置为指定的fillfactor


    最后,是的,将非聚集索引放在其他适当的列上,但只放在非常有选择性的列上,例如非位字段。但是请记住,索引越多,这对写入性能的影响就越大。显然,答案取决于您将如何查询它。索引的目的是在选择数据时减少比较的数量。当您考虑要加载哪些数据和存储的阻塞因子时,聚集索引有助于(可以用一个读取加载64K块中的一堆数据)。如果包含ID和datetime作为主键,但未在选择条件中使用它们,则它们只会影响性能。这就是为什么人们通常在加载数据之前在批量插入时删除索引。

    与许多人认为的相反,在表上拥有一个好的聚集索引实际上可以使插入之类的操作更快-是的,更快

    查看金伯利·特里普(Kimberly Tripp)——终极索引女王的开创性博文

    她提到(大约在文章的中间):

    在集群中插入速度更快 表(但仅在“右侧”中) 群集表)与 堆这里的主要问题是 在IAM/PFS中查找以确定 堆中的插入位置是 比在集群表中慢 (如果已知插入位置, 由聚集键定义)。插入 插入表格时速度更快 订单定义的位置(CL)和位置 这一订单在不断增加

    关键的一点是:只有使用正确的聚集索引,您才能获得好处——当聚集索引是唯一的、狭窄的、稳定的并且以最佳方式不断增加时。最好使用INT-IDENTITY列

    Kimberly Tripp也有一篇很好的文章,介绍了如何为您的表选择尽可能最好的集群键,以及它应该满足哪些标准——请参阅她的文章,标题为

    如果您有这样一个列(例如代理主键),请将其用于集群键,您应该会在表上看到非常好的性能,即使在大量插入时也是如此。

    并注意“NewSequentialID()默认值。非连续的唯一标识符将破坏具有大量插入流量的表的性能。在任何情况下,除非您特别需要唯一标识符,否则请使用inte