具有非唯一列的日志表;要创建什么索引

时间:2016-11-18 15:31:47

标签: sql-server database performance tsql indexing

我有一个包含两列的日志表。

  1. DocumentType(varchar(250),非唯一,非null)
  2. DateEntered(日期,不唯一,非空)
  3. 该表只会插入行,从不更新或删除。

    以下是报告的存储过程:

    SELECT DocumentType, 
           COUNT(DocumentType) AS "CountOfDocs"
    FROM DocumentTypes
    WHERE DateEntered>= @StartDate AND DateEntered<= @EndDate
    GROUP BY DocumentType
    ORDER BY DocumentType ASC;
    

    将来,用户可能还希望在不同的报告中按文档类型进行过滤。我目前有一个包含两列的非聚集索引。这是创建的正确索引吗?

2 个答案:

答案 0 :(得分:1)

日期上的聚集索引,当然。

我认为您的NCI很好。我会说两个都在命名列中,因为我假设您将在查询的WHERE子句中有日期。我不认为每天最多1000个案例会在加载数据时对插入时间产生重大影响。

答案 1 :(得分:1)

不要添加任何索引。这将是堆表并等待你的“未来你”,任务从这个表中选择一些东西:)。

如果你想索引:

  1. 使用堆:在将要过滤的字段上添加索引,如果第二个仅在select(=不在where子句中),则将第二个作为包含列。如果您在两列上都使用两个列put index进行过滤。

  2. 如果要添加聚簇索引(例如,在新的自动增量主键列上),只需在col上添加一个索引,或者尝试不添加aditional索引并检查执行计划和效率 - 在大多数情况下是聚集索引与寻求足够。

  3. 不要在非唯一列上创建聚簇索引(仅在非常特殊的情况下使用它)。