【发布时间】:2010-09-30 01:51:58
【问题描述】:
我有一个名为“EventTable”的 SQL Server 2005 表,定义如下:
EventID、EventTypeCode、EventStatusCode、EventDate
当前该表在主键“EventID”上有一个聚集索引,目前没有其他索引
EventTypeCode 和 EventStatusCode 列是 CHAR(3)(例如 'NEW'、'SEN'、'SAL')并且是外键
Common Selects 将是...
select * from EventTable Where EventDate = @dateparam;
select * from EventTable Where EventTypeCode = @eventtype;
select * from EventTable Where EventStatusCode = @statustype;
你会使用什么索引策略来处理上面的 Select 语句?
在 3 列上有一个覆盖(复合)索引会更好吗?如果是这样,复合索引应该按什么顺序排列?
或者 3 列中的每一列都有一个单独的索引?
表格将以每天大约 300 个事件的速度增长..
执行查询也很常见,例如
where EventDate between '2008-12-01' and '2008-12-31'
and EventTypeCode = 'todo'
- 该表更有可能以每天 500-800 条记录而不是 300 条记录的速度增长
- 在正常使用 ASP.NET 应用程序期间,第一个问题中提到的查询将在一天中运行多次
- NHibernate 'HQL' 用于执行此类查询
- 没有初始数据加载,该表现在只有大约 10K 条记录,因为这是一个新应用程序
- ...我或多或少只是想避免客户不得不在几年后打电话给我们抱怨应用程序变得“慢”,因为这张桌子会受到如此多的打击
【问题讨论】:
-
编辑:Select 语句 where 子句还可以包含字段的组合,即 @fromdate 和 @todate AND EventTypeCode = @eventcode 之间的 EventDate 每天 300 次插入可能是保守的,可能更像500-800
-
这完全改变了问题。
标签: sql sql-server sql-server-2005 indexing