我想把索引加到我的桌子上。我正在寻找如何向表中添加更多索引的一般想法。而不是PK集群。我想知道当我这样做的时候应该找什么。所以,我的例子:
这个表(让我们称之为任务表)将是整个应用程序中最大的表。期待数以百万计的记录。
重要的:大型大容量插入将在此表中添加数据。
表有27列:(到目前为止,计数:D )
int x 9列= id-s
varchar x 10列
位x2列
日期时间x 5列
INT列
所有这些都是INT ID-s,但是从通常比Task表(10-50条记录最大值)更小的表中,例如: Status表(包含"open“、”closed“等值)或优先级表(具有”重要“、”不重要“、”普通“等值),也有类似于”父-ID“(self - ID)的列。
加入:所有的“小”桌子都有PK,通常的方式..。聚类
字符串列
有一个(公司)列(string!)这就像“5个字符一直长”,每个用户都会被限制使用这个字符。如果在Task中有15个不同的“公司”,登录用户只会看到一个。所以这个总是有过滤器的。在这个列中添加索引可能是个好主意吗?
日期列
我想他们不会给这些.对吗?或者可以/应该是?
发布于 2010-12-22 15:51:21
我不会添加任何索引--除非您有具体的理由这样做,例如性能问题。
为了确定要添加什么样的索引,您需要知道:
WHERE子句是什么,您在做什么ORDER BY?当然,,您可以索引DATETIME列--是什么使您认为不能呢??如果有许多查询会通过日期范围限制其结果集,那么对DATETIME列进行索引是完全有意义的--可能不是它本身,而是在复合索引中,以及表中的其他元素。
不能索引的是包含900字节以上数据的列--任何类似VARCHAR(1000)之类的列。
关于索引的深度和非常有知识的背景,请咨询金伯利·特里普的博客,索引皇后.
发布于 2010-12-22 15:50:36
通常,索引将加速连接、排序操作和筛选器。
因此,如果列在联接中,则ORDER或WHERE子句将有助于performance...but,因为必须维护索引,所以添加、更新、删除和插入操作的but...with总是有一个索引。
所以is...it的答案取决于
我想说的是,使用查询开始命中表,查看扫描的执行计划,尝试通过编写SARGable查询或在需要时添加索引来执行这些查询.不要仅仅为了添加索引而添加索引
发布于 2010-12-22 15:59:38
第一步是了解如何使用表中的数据:如何插入、选择、更新、删除这些数据。不知道你的使用模式,你是在黑暗中射击。(请注意,无论你现在想出什么,你都可能错了。确保在启动和运行之后,将您的决策与实际使用模式进行比较。)一些想法:
如果用户经常在表中查找单个项,则主键上的索引至关重要。
如果数据将以很高的频率插入,并且您有多个索引,那么随着时间的推移,您必须处理索引碎片。阅读并理解聚集和非聚集索引和碎片(ALTER INDEX...REBUILD)。
但是,如果在需要检索大量行的情况下,性能是关键,则可以考虑使用群集索引来支持这一点。
如果您经常想要一组基于状态的数据,那么在该列上建立索引是很好的--特别是如果1%的行是“活动的”,而99%的行是“非活动的”,而您所需要的只是活动的行。
相反,如果您的" PriorityId“只用于获得说明PriorityId 42是什么的”标签“(即加入到查找表中),那么您可能不需要在主表中对其进行索引。
最后一个想法是,如果每个人一次只为一个公司检索数据,那么(a)您肯定希望对其进行索引,(b)您可能需要考虑在该值上对表进行分区,因为它可以在常规索引之外充当“内置筛选器”。(这可能有点极端,只在企业版中提供,但在您的情况下可能是值得的。)
https://stackoverflow.com/questions/4510846
复制相似问题