2009-01-30 92 views
3

我正在支持由另一个开发人员编写的现有应用程序,并且我对于开发人员选择存储日期的数据类型的选择是否影响某些查询的性能存在疑问。数据库性能和数据类型

相关信息:该应用程序在我们的某个表中大量使用了“Business Date”字段。此业务日期的数据类型是nvarchar(10),而不是日期时间数据类型。日期的格式为“MM/DD/YYYY”,因此2007年圣诞节的存储时间为“2007年12月25日”。长话短说,我们有一些每周运行一次并且执行时间很长的重型查询。

我从头开始重写这个应用程序,但是由于我在看这个,我想知道在使用datetime数据类型和存储日期之间是否存在性能差异当前数据库。

回答

6

如果您使用datetime而不是nvarchar(10),那么您将节省磁盘空间并提高性能。

如果您使用日期字段进行日期计算(DATEADD等),您将看到查询执行速度大幅增加,因为字段不需要在运行时转换为日期时间。

3

DATETIME的操作比将VARCHAR转换为DATETIME s更快。

如果出现日期的任何地方,但在SELECT条款(比如,你添加它们,DATEDIFF他们,WHERE条款等搜索他们的),那么你应该让他们在内部格式。

0

有很多原因应该使用DateTime而不是varchar来存储日期。性能是一个......但我会关注这样的查询:

SELECT * 
FROM Table 
WHERE DateField > '12/25/2007' 

给你错误的结果。

0

我不能用数字来支持它,但是datetime类型应该快很多,因为它可以很容易地进行比较,不像varchar。在我看来,将UNIX时间戳作为数据类型也值得一试。

+0

咦? Unix时间戳?数据库支持数据库支持的内容。有没有一个特定的数据库有一些名为“UNIX时间戳”? – 2009-01-30 20:23:57

0

是的。日期时间对于日期计算来说要比varchar或nvarchar高效得多(为什么nvarchar - 你没有办法在那里得到真正的unicode,对吧?)。 Plus字符串可能无效并被曲解。

如果您仅使用日期部分,则系统可能只有日期时间较短的日期时间版本。此外,如果您只是在进行连接和某些类型的操作(>/</=比较但不包含datediff),则日期“id”列实际上是yyyymmdd形式的整数,通常用于数据仓库中。不幸的是,这确实允许“无效”日期,但它也允许更明显保留,“特殊”日期,而在datetime中,您可能会使用1/1/1900的NULL或其他东西。完整性通常通过对日期“维度”的关键约束来强制执行。“

看到您将问题标记为”sql server“,我假设您使用的是某个版本的SQL Server,因此我建议您使用datetimesmalldatetime来查看此外,在SQL Server 2008中,你有一个date类型以及一个更大范围内的datetime2。退房this link这给一些细节

0

我从架构的角度认为,日期时间将是一个更有效的数据类型,因为它会被存储为两个4字节整数,而您的nvarchar(10)将被存储为最多22个字节(输入的字符数+ 2字节的两倍)。因此可能会超过存储空间量的两倍与使用日期时间相比,现在需要e。

这当然可能会对索引产生影响,因为数据项越小,索引数据页上可放置的记录越多。这反过来会产生一个更小的索引,这个索引当然可以更快地遍历,因此会更快地返回结果。

总之,日期时间是要走的路。

0

机遇是datetime类型更加紧凑和更快,但更重要的是使用DATETIMES来存储日期和时间是更好的架构选择。你不太可能遇到在特定日期范围内寻找记录的奇怪问题,大多数数据库库会将它们映射到你的语言日期类型,所以代码更清晰,从长远来看这更重要。

即使速度较慢,您也会花费更多时间调试字符串日期,而不是所有用户都会看到节省的总和。

+0

真的吗?你认为MSSS或MySql或Oracle的选择会对选择产生最大的影响吗? IMNSHO,今天还没有一个实用的关系数据库管理系统(RDBMS),它的日期会更好。 – 2009-01-30 20:26:21

0

nvarchar字段中的日期过滤并不容易,因为索引中的数据按照字典顺序排序,与您对日期的排序不匹配。这是日期格式“mm/dd/yyyy”的问题。这意味着“12/25/2007”将在“12/01/2008”之后的nvarchar索引中,但这不是你想要的。 “yyyy/mm/dd”会很好。

因此,您应该使用日期字段并将字符串值转换为日期。你一定会获得巨大的性能提升。这就是如果你可以改变表格模式。

0

使用varchar(或任何其他字符串数据类型)的另一个问题是,数据可能包含无效日期,因为它们不会在条目中自动进行验证。如果您尝试将字段更改为日期时间字段,那么您会惊讶地发现有人们添加了诸如ASAP,Unknown,1/32/2009等日期的转换问题。您将需要检查不会使用方便的isdate函数,并且在尝试更改数据类型之前修复或将它们清零。

也许您还有很多代码可以将varchar类型转换为日期数据类型,以便您可以进行日期数学运算。所有的代码也需要修复。