【问题标题】:SQL performance Use DateTime or int for indexSQL 性能 使用 DateTime 或 int 作为索引
【发布时间】:2021-07-08 13:53:46
【问题描述】:

我计划实施以下历史记录表,但我想知道什么会提供最佳性能。我将有一个 USP 在第 N 天从 hID X 获取所有记录(它将始终选择给定日期的所有可用记录)。记录将每 15 分钟分组一次,“值”将是 hID 执行某项操作的次数。

拥有一个带有索引的 DateTime 列会更快,还是将其拆分为一个 INT 并将其保存为 YYYYmmdd 和单独的时间列会更好? 如果我选择最后一个选项,我必须在后端将其转换回 DateTime,因为应用程序需要 DateTime 来显示数据。

表 A

  • Id (PK int)
  • hId (FK int) FK 到具有完整键的表(最长 300 个字符)
  • 日期(日期时间) -值(整数)
  • 计数(整数)

上表每天将获得大约 2.000.000 条新记录(对于当前的用户数量,以后可能会增加),并且最多只能保留 7 天的记录。之后,USP 将删除它们。

表 B(现有表)

  • ID(整数)
  • 密钥(nvarchar 300)

【问题讨论】:

  • 数据库是什么?
  • “会不会更快...”——这完全取决于您要优化的特定查询。请将其添加到问题中。
  • 抱歉,刚刚添加了正确的标签。
  • 您对某个时间感兴趣吗?如果不使用date 数据类型。无论哪种方式,datetimedate 列上的索引都可以,不要将日期存储为整数,您会失去很多功能而没有任何好处。

标签: sql-server tsql datetime indexing query-optimization


【解决方案1】:

Sql Server 有一个内置的 Date-only 类型。鉴于您倾向于始终选择给定日期的所有记录,我建议同时拥有 DateTime Date 列(可能作为计算列),您可以在其中拥有索引在Date 列上供您查询。

【讨论】:

  • 没必要,日期时间列上的索引就足够了,您可以将datetime 转换为date - 这完全可以搜索。
  • @Stu Sargeable 但也许是not a good idea
  • @SMor 感谢该链接提供了一些有趣的观点。
  • 一个更有趣的选择是添加一个int 列,用于标识白天的 15 分钟 bucket,然后在 ( EventDate, QuarterHour ) 上创建索引。这将处理where 子句和group by覆盖索引可能对此时优化整个查询有意义。
【解决方案2】:

从索引空间的角度来看,DATETIME 值是 8 个字节,INT 是 4 个字节,所以 DATETIME 索引会稍微大一些。从搜索算法的角度来看,SQL Server 的开发者几十年来一直在努力优化。提及 INT 和 DATETIME 值的 Where 子句对它们来说非常重要。他们把整个职业生涯都花在了让这些东西变得更快的过程中。试图智取他们是不值得的。只需使用他们的劳动成果。

我的观点:选择数据类型这样您的数据就可以与现实世界紧密地模拟。 不要扭曲您的日期类数据值,因为您认为 INT 可能比 DATETIME 更快。使用 DATETIME,并利用软件中的所有优化。

顺便说一句,利用索引对一天进行 WHERE 搜索的正确方法是这样。

WHERE datetime_column >= '2021-04-15'
  AND datetime_column <  DATEADD(DAY, 1, '2021-04-15')

换句话说,您搜索从当天&gt;= 午夜开始的日期,并以第二天&lt; 午夜之前的任何日期结束。这会对索引进行有效的范围扫描

WHERE DATE(datetime_column) = '2021-04-15'    /!!! slower

没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多