我想通过在LogDate(DateTime)列上添加非聚集索引来优化我的Logs表的性能,以提高性能,因为我的大多数查询都包含一个时间范围(From Date - To Date)。线程波纹管建议舍入到最接近的小时。
How to improve performance for datetime filtering in SQL Server?
我正在寻找一个最佳实践示例&建议使用datetime列的索引来提高性能。
提前致谢
答案 0 :(得分:1)
您的问题中引用的答案是错误的或遗漏了一些关键细节。添加带有舍入值的其他datetime
列不会减小索引大小。无论存储的值如何,datetime
数据类型都是固定的8个字节。要实现减小的索引大小,需要使用不同的数据类型,例如smalldatetime
(只有4个字节,分辨率不超过一分钟)和/或使用数据压缩。
如果查询通常仅指定日期时间范围,则聚簇索引应位于datetime列上。我在野外看到的一个常见的反模式是一个聚集的标识列主键,它没有用处。日志表是表应具有主键的一般规则的一个例外,因为它们不是关系的。
如果它们具有相当的选择性,您可能还需要在频繁指定的其他列上使用非聚集索引,但应谨慎使用,以避免影响插入性能。考虑使用datetime2
以及所需的最大精度,可能每行保存一个字节或2个字节。还要考虑表和索引的页面压缩。我已经将这种方法用于数十亿行的日志表,并实现了出色的性能。