Sql server 是否将索引聚集在日志记录表上不断增加的datetime列上?
我不是DBA(“很好!”,你马上就会想。) 我有一个具有以下特征和使用模式的日志数据表:Sql server 是否将索引聚集在日志记录表上不断增加的datetime列上?,sql-server,indexing,Sql Server,Indexing,我不是DBA(“很好!”,你马上就会想。) 我有一个具有以下特征和使用模式的日志数据表: 一个datetime列,用于存储日志时间戳,日志时间戳的值不断增加,并且大部分(但仅大部分)是唯一的 频繁的ish插入(例如,每分钟十几次),仅在时间戳范围的末尾(记录新数据) 从时间戳范围开始的不频繁批量删除(清除旧数据) 没有任何更新 频繁ish选择使用时间戳列作为主要标准,以及其他列上的次要标准 不频繁选择使用其他列作为标准(不包括时间戳列) 数据量很大,但还远远不够,我非常担心存储空间 此外,目
- 一个
列,用于存储日志时间戳,日志时间戳的值不断增加,并且大部分(但仅大部分)是唯一的datetime
- 频繁的ish插入(例如,每分钟十几次),仅在时间戳范围的末尾(记录新数据)
- 从时间戳范围开始的不频繁批量删除(清除旧数据)
- 没有任何更新
- 频繁ish选择使用时间戳列作为主要标准,以及其他列上的次要标准
- 不频繁选择使用其他列作为标准(不包括时间戳列)
- 数据量很大,但还远远不够,我非常担心存储空间
- 在timestamp列上放置一个具有100%填充因子的聚集索引
- 将非聚集索引放在任何其他列上,这些列可以用作不涉及聚集列的查询中的条件(在我的例子中可能是其中的任何一个)
- 计划在每日维护间隔期间进行批量删除
- 计划在批量删除后立即重建聚集索引
- 放松,多出去走走
DEFAULT NEWSEQUENTIALID()
除非存在特定的性能问题,否则我不会将任何其他索引放在表中,也不会安排索引的重建。我同意将聚集索引放在时间戳列上。我的查询将基于fillfactor-100%以牺牲写入性能为代价提供最佳读取性能。页面拆分可能会对您造成伤害。选择一个较低的填充因子将延迟页面拆分,而以牺牲读取性能为代价,因此这是一个很好的平衡行为,以获得最适合您的情况 在大容量删除之后,重建索引和更新统计信息是值得的。这不仅可以保持性能,还可以将索引重置为指定的fillfactor
最后,是的,将非聚集索引放在其他适当的列上,但只放在非常有选择性的列上,例如非位字段。但是请记住,索引越多,这对写入性能的影响就越大。显然,答案取决于您将如何查询它。索引的目的是在选择数据时减少比较的数量。当您考虑要加载哪些数据和存储的阻塞因子时,聚集索引有助于(可以用一个读取加载64K块中的一堆数据)。如果包含ID和datetime作为主键,但未在选择条件中使用它们,则它们只会影响性能。这就是为什么人们通常在加载数据之前在批量插入时删除索引。与许多人认为的相反,在表上拥有一个好的聚集索引实际上可以使插入之类的操作更快-是的,更快 查看金伯利·特里普(Kimberly Tripp)——终极索引女王的开创性博文 她提到(大约在文章的中间): 在集群中插入速度更快 表(但仅在“右侧”中) 群集表)与 堆这里的主要问题是 在IAM/PFS中查找以确定 堆中的插入位置是 比在集群表中慢 (如果已知插入位置, 由聚集键定义)。插入 插入表格时速度更快 订单定义的位置(CL)和位置 这一订单在不断增加 关键的一点是:只有使用正确的聚集索引,您才能获得好处——当聚集索引是唯一的、狭窄的、稳定的并且以最佳方式不断增加时。最好使用INT-IDENTITY列 Kimberly Tripp也有一篇很好的文章,介绍了如何为您的表选择尽可能最好的集群键,以及它应该满足哪些标准——请参阅她的文章,标题为 如果您有这样一个列(例如代理主键),请将其用于集群键,您应该会在表上看到非常好的性能,即使在大量插入时也是如此。并注意“NewSequentialID()默认值。非连续的唯一标识符将破坏具有大量插入流量的表的性能。在任何情况下,除非您特别需要唯一标识符,否则请使用inte