【问题标题】:What is the best way to store DateTime in SQL Server to provide maximum search speed at large table?在 SQL Server 中存储 DateTime 以在大表中提供最大搜索速度的最佳方法是什么?
【发布时间】:2012-03-06 12:51:44
【问题描述】:

在 SQL Server 中存储DateTime 以提供最大的大表搜索速度的最佳方法是什么?该表包含记录,其中一行必须包含日期和时间。

搜索是这样的

Value > '2008-1-1' AND Value < '2009-1-1'

Value > '2008-1-1' AND Value < '2008-31-1'

等等

哪个是最好的?带索引的DateTimelong 中带有索引的 unixstamp?多个int 字段,例如年、月、日等?或者是其他东西?

【问题讨论】:

  • 将其存储为datetime。其实我不明白这个问题。
  • 用这种查询让 sql 遍历表中数千(可能是数百万)条记录会不会很慢?
  • 您是否总是在同一日期有下限 ('2008-1-1')?

标签: sql-server search datetime indexing


【解决方案1】:

我会使用支持您需要的日期时间精度的最小数据类型。 例如

  • datetime2 如果您需要低至 100 纳秒(6-8 字节)的高精度 (SQL 2008+)
  • 日期时间精确到 3.33 毫秒(8 个字节)
  • smalldatetime 精确到分钟(4 个字节)
  • 精确到当天的日期(不存储时间,3 个字节)(SQL 2008+)

你没有提到你说的桌子有多大。但是有一些策略可以在标准索引策略(例如分区、过滤索引)之上处理提高查询性能

【讨论】:

  • 他在评论中提到过:“超过数千(可能是数百万)”
  • @TimSchmelter 是的,看到我回答后出现了评论:)
【解决方案2】:

您的示例仅显示日期而不显示时间元素。 如果您只需要日期,请使用相对较新的 DATE 类型而不是 DATETIME。 它更小,索引应该很快。

【讨论】:

  • Index Creation Guidelines: "在大多数情况下,日期时间列的索引不是必需的(也可能是个坏主意)。所以在您知道并测试您的查询之前不要创建它。如果搜索将在 'where' 子句或某些转换机制中使用日期时间函数,很可能查询优化器不会使用索引,但性能会受到影响。"
【解决方案3】:

如果选择较小的数据类型,可以在一个页面上存储更多的记录,这样IO操作会更少,所以工作速度会更快。

当然,引入索引可能会提高性能。索引应包含尽可能少的列,以便在单个页面上存储最大数量的记录。

但是……

过早的优化是万恶之源

首先,考虑到您需要的精度,您应该将日期存储为日期。如果稍后您遇到一些性能问题,您必须调查哪些查询存在性能问题并且可能会引入一些索引,但您必须确保这些索引涵盖您的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多