2009-10-06 56 views
2

示例表索引日期列:SQL服务器:在日志表

CREATE TABLE Log (
    logID int identity 
    logDate datetime 
    logText varchar(42) 
) 

LOGID已在索引中,因为它是一个主键,但如果你要查询这个表,你可能会想使用LOGDATE作为一个约束。但是,logID和logDate将按照相同的顺序,因为logDate将始终设置为GETDATE()。

在logDate上添加一个额外的非聚集索引是否有意义,同时考虑到对于日志表,重要的是要进行快速写入。

回答

6

制作聚簇索引logDate,logID(按该顺序)。由于日期时间是“增长”,这不应该花费任何额外的费用。 logID不会在同一时间插入两个日志条目(可能发生)

+0

你如何实现这样的事情?你是否将这两个列都声明为主键或跳过PK并通过对logID的唯一检查来创建索引? – SurroundedByFish 2009-10-06 13:29:28

+1

1)将logID保留为主键(这本身不是索引)。 2)在logID上删除当前的聚集索引 3)在logDate上创建一个聚簇索引,logID 4)最终在logID上创建一个唯一的索引(如果你需要访问logID) – Arthur 2009-10-06 13:58:28

+0

当PK有时,我无法创建聚簇索引已经自动创建一个,我也不能在PK存在的时候删除索引。但是,我确实通过在为ID添加PK约束之前为两个coluns创建索引来实现它。 – SurroundedByFish 2009-10-06 14:12:14

3

如果你会有很多的查询与

WHILE LogDate > ......

(或类似的东西)条款 - 是的,通过各种手段!

如果您按日期进行选择,LogID上的聚集索引将无济于事 - 所以如果这是一种常见操作,那么日期上的非聚集索引肯定会有很大帮助。

Marc

+0

或者的确,使LogDate上的索引为聚簇索引(如果它将成为查找行的主要方法) – 2009-10-06 12:37:21

+2

鉴于日期时间的准确性,聚簇索引如果仅在LogDate上时不可能是唯一的,则SQL将被迫添加一个4字节的uniquifier,这将浪费LogID,因为LogId可能会以相同的成本添加。 – Andrew 2009-10-06 13:07:15

0

由于考虑了logdate上的聚集索引,logid,因为您可能潜在地碰到日期时间精度窗口内的重复项(3.33 ms在SQL 2005上)。

我也会事先考虑表格是否会变大,并且应该使用表分区来允许日志有一个滑动窗口和删除旧数据,而不需要长时间运行删除语句。这一切都取决于日志记录的数量以及您是否拥有企业版。