表索引设计

Ash*_*Ash 2 sql database-design sql-server-2005 clustered-index non-clustered-index

我想在我的表中添加索引.我正在寻找如何向表中添加更多索引的一般想法.除PK聚集外.我想知道当我这样做时要寻找什么.所以,我的例子:

这个表(我们称之为TASK表)将成为整个应用程序的最大表.期待数百万条记录.

重要信息:大量批量插入正在此表中添加数据

表有27列:(到目前为止,并计数:D)

int x 9列= id-s

varchar x 10列

位x 2列

datetime x 5列

INT COLUMNS

所有这些都是INT ID-s,但来自通常小于Task表的表(最多10-50个记录),例如:状态表(具有"打开","关闭"等值)或优先级表(值类似于"重要的","不是那么重要","正常")还有一个像"父ID"(自我ID)的列

join:所有"小"表都有PK,通常的方式......聚集

STRING COLUMNS

有一个(公司)列(字符串!)类似于"始终长5个字符",并且每个用户都将被限制使用这个.如果在任务中有15个不同的"公司",则登录用户只能看到一个.所以这个过滤器总是有一个过滤器.为这个专栏添加索引可能是个好主意吗?

日期栏目

我认为他们没有索引这些......对吧?或者可以/应该是?

mar*_*c_s 5

我不会添加任何索引 - 除非您有特定的理由这样做,例如性能问题.

为了弄清楚要添加哪种索引,您需要知道:

  • 你的桌子上使用了什么样的查询 - WHERE条款是什么,ORDER BY你在做什么?

  • 你的数据是如何分配的?哪些列足够有选择性(<2%的数据)对索引很有用

  • 附加索引对表上的INSERT和UPDATE有什么样的(负面)影响

  • 任何外键列都应该是索引的一部分 - 最好是作为索引的第一列 - 以加速JOIN到其他表

确定你可以索引一个DATETIME列 - 是什么让你认为你不能?如果您有大量的查询会通过日期范围限制其结果集,那么索引DATETIME列可能是完全有意义的- 可能不是单独的,而是在复合索引中与表的其他元素一起使用.

你不能索引的是包含超过900字节数据的列 - 任何类似的东西VARCHAR(1000).

有关索引的深入且知识渊博的背景,请参阅索引女王Kimberly Tripp博客.