日期的整数表示

时间:2008-10-29 08:53:04

标签: sql performance

在最近的项目中,我们遇到了一些问题,这些查询很少依赖于按日期时间字段(MSSQL 2008数据库)对结果进行排序。

当我们使用ORDER BY RecordDate DESC(或ASC)执行查询时,执行的查询比没有它的情况慢10倍。任何其他领域的排序都不会产生如此缓慢的结果。

我们尝试了所有的索引选项,使用了调优向导,没有什么真正有任何区别。

建议的解决方案之一是将datetime字段转换为表示该datetime字段中的秒数或毫秒数的整数字段。它将通过一个简单的算法计算,例如“让我从RecordDate到1980-01-01的秒数”。此值将在插入时存储,并且所有排序将在整数字段上完成,而不是在datetime字段上完成。

我们从未尝试过,但我很好奇你们的想法是什么?

13 个答案:

答案 0 :(得分:3)

我总是将日期存储为整数,使用标准化的unix timestamp作为我编程使用的大多数语言,作为默认的日期 - 时间表示。显然,这使得对日期的排序更加有效。

所以,是的,我推荐它:)

答案 1 :(得分:2)

我认为基本上这就是SQL datetime数据类型在SQL Server后台存储的方式,所以我对这些结果感到惊讶。

你能复制Northwinds或Pubs的缓慢 - 如果是这样的话,可能值得给MS打电话,因为它不应该慢10倍。如果没有,那么你的桌子可能有些奇怪。

如果您使用的是SQL 2008,并且只需要存储日期(而不是时间部分),则可以尝试使用新的日期数据类型。这样精度较低,因此应该更快地进行排序。

答案 2 :(得分:1)

插件是否来自.Net Code ...

您可以将DateTime.Ticks值存储在DB上的bigint列中,并将其存储在索引上。

在更新现有数据库方面,编写一个CLR函数将现有DateTimes转换为TickCount应该是相对简单的

ALTER TABLE dbo.MyTable ADD TickCount BigInt Null

Update dbo.MyTable Set TickCount = CLRFunction(DateTimeColumn)

这绝对可行并且会显着提高您的分类能力

答案 3 :(得分:1)

日期时间是否已存储为数字?

答案 4 :(得分:1)

你真的需要DateTime或更具体地说,'时间'部分吗?如果没有,我会调查将日期存储为ISO日期格式(YYYYMMDD)的整数或字符串表示,并查看是否为您提供了所需的性能提升。存储ticks / time_t值等会让你能够存储时间,但除非你真的需要时间组件,否则我不会真的很烦。此外,存储人类可读日期的附加值是,调试与数据相关的问题要简单一些,因为您可以阅读并理解您的程序运行的数据。

答案 5 :(得分:0)

存储日期的唯一合理方法是朱利安天 - unix时间戳是范围缩短的方法。

明智地我的意思是在代码中 - 通常(但不总是)将日期作为日期时间存储在数据库中更好。

您遇到的数据库问题听起来像是一个不同的问题。我怀疑改变字段类型会产生巨大的变化。

如果没有查看详细信息(如查询,记录数量等),很难具体,但一般建议是重新构建查询的顺序和方法,以减少订购的记录数量 - 因为这样可以大量影响绩效。

答案 6 :(得分:0)

我真的不明白为什么索引没有帮助,如果封面后面的SQL将日期存储为整数表示。

按ID列排序可产生出色的结果,或者通过任何其他索引字段进行排序。

答案 7 :(得分:0)

我投票索引。正如我在上面的评论中所说,你的日期无论如何都存储为两个int(无论如何是sql 2000)。我看不出这有什么不同。很难说真正的问题是什么没有更多的信息,但我的直觉是,这不是问题。如果你有一个dev environemnt(你应该:)),尝试在那里创建int字段并运行原始查询。这应该不难,而且你会对这个想法有结论性的结论。

答案 8 :(得分:0)

您的RecordDate是WHERE子句中的字段之一吗? RecordDate是您唯一的ORDER BY标准吗?第三,您的Query是多表连接还是单表查询?如果您没有在RecordDate上进行SELECTING,并将其用作ORDER BY标准,则可能是性能问题的原因,因为在这种情况下索引不会真正对排序做出贡献。索引会尝试解决连接问题,然后排序会发生。

如果是这种情况,那么更改RecordDate的数据类型可能对您没有多大帮助,因为您仍然在事后对记录集应用排序。

答案 9 :(得分:0)

我见过一个BI数据库,其中日期以YYYMMDD格式存储为整数。一个单独的表用于将这些整数与等效日期时间,格式化字符串,年份编号,季度编号,月份编号,星期几,假日状态等相关联。您只需加入该表以获取与日期相关的任何内容你需要的。非常方便。

答案 10 :(得分:0)

我建议你使用Excel中使用的Julian日期(link text)。所有财务应用程序都使用此表示来获得性能,并提供相对较好的值范围。

答案 11 :(得分:0)

SELECT CAST(REPLACE(convert(varchar, GETDATE(), 102),'.','')AS INT) 

- 效果很好(快速!)。

答案 12 :(得分:-1)

我相信datetime is physically stored as float所以改进与将float转换为INT时相同。

我宁愿使用索引,因为它就是它们的设计目标,而datatime则用于存储日期和时间。有一组与日期时间相关的功能,因此如果您决定使用自定义存储类型,则需要自己处理。