添加主键并将列更改为Datetime2

时间:2013-11-18 21:00:32

标签: sql sql-server composite-primary-key data-conversion datetime2

我有一个表格,可以跟踪特定文件在我们的系统检查时所经历的状态。它看起来像这样:
FileID int
状态tinyint
TouchedBy varchar(50)
当触摸日期时间

此表上目前没有主键,但Status和TouchedWhen上有聚集索引

随着表的不断增长和查询性能的下降,人们认为我有一个想法是添加一个PrimaryKey以便我从堆查找 - FileID上的主键,Status和TouchedWhen < / p>

我遇到的问题是TouchedWhen,由于它的舍入问题,有时会有2个条目具有完全相同的日期时间。

然后我开始研究将它转换为datetime2(7)所需的内容并改变当时重复的内容。我的桌子看起来像:
FileID int
状态tinyint
TouchedBy varchar(50)
TouchedWhen datetime2(7)

FileID,Status和TouchedWhen上的主键

我的问题是 - 如果有重复的话,最好的方法是在现有表格中添加毫秒?如何在需要保持在线状态的表格中执行此操作?

事先,谢谢,
布伦特

1 个答案:

答案 0 :(得分:2)

您不需要添加主键来更快地进行查询 - 只需在FileID, Status, TouchedWhen上添加索引就会产生与添加主键一样多的性能影响。定义主键的主要好处是记录标识和参照完整性,这可以通过自动增量主键完成。

(我不是说你不应该有一个主键,我说主键的性能影响在索引本身,而不是它是主键的事实

另一方面,将群集索引更改为包含FileID可能会产生更大的影响,因为使用这些列的查找不需要搜索index 然后查找数据 - 数据页面就是索引值。