2

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

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

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

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

int x 9 列 = id-s

varchar x 10 列

位 x 2 列

日期时间 x 5 列

整数列

所有这些都是 INT ID,但来自通常小于任务表(最多 10-50 条记录)的表,例如:状态表(具有诸如“打开”、“关闭”之类的值)或优先级表(具有诸如“重要”,“不太重要”,“正常”)还有一个类似“父ID”的列(self-ID)

加入:所有“小”表都有PK,通常的方式......集群

字符串列

有一个(公司)列(字符串!)类似于“一直有 5 个字符”,每个用户都将被限制使用这个。如果在 Task 中有 15 个不同的“公司”,则登录用户只会看到一个。所以总是有一个过滤器。向该列添加索引可能是个好主意?

日期栏

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

4

3 回答 3

5

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

为了弄清楚要添加什么样的索引,您需要知道:

  • 正在对您的表使用什么样的查询 -WHERE子句是什么,ORDER BY您在做什么?

  • 您的数据是如何分布的?哪些列具有足够的选择性(< 2% 的数据)可用于索引

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

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

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

您无法索引的是包含超过 900 字节数据的列 - 任何类似VARCHAR(1000)或类似的数据。

有关索引方面的深入和知识渊博的背景,请参阅索引女王Kimberly Tripp 的博客。

于 2010-12-22T15:51:21.187 回答
3

一般来说,索引会加速 JOIN、排序操作和过滤器

因此,如果列在 JOIN、ORDER BY 或 WHERE 子句中,那么索引将有助于提高性能……但总有一个但是……对于您添加的每个索引,UPDATE、DELETE 和 INSERT 操作将放慢速度,因为必须维护索引

所以答案是......这取决于

我会说开始用查询访问表并查看扫描的执行计划,尝试通过编写 SARGable 查询或在需要时添加索引来进行这些搜索......不要只是为了添加索引而添加索引

于 2010-12-22T15:50:36.750 回答
1

第一步是了解如何使用表中的数据:如何插入、选择、更新、删除。在不知道您的使用模式的情况下,您是在黑暗中拍摄。(另请注意,无论您现在想出什么,您都可能是错的。请务必在启动并运行后将您的决定与实际使用模式进行比较。)一些想法:

如果用户经常查找表中的单个项目,则主键上的索引至关重要。

如果数据插入频率很高并且您有多个索引,那么随着时间的推移,您必须处理索引碎片。阅读并了解聚集和非聚集索引和碎片 (ALTER INDEX...REBUILD)。

但是,如果在需要检索大量行的情况下性能是关键,则可以考虑使用聚集索引来支持它。

如果您经常需要基于状态的一组数据,那么对该列进行索引可能会很好——特别是如果您的行中有 1% 是“活动的”,而 99% 的行是“不活动的”,而您想要的只是活动的行。

相反,如果您的“PriorityId”仅用于获取说明 PriorityId 42 是什么的“标签”(即加入查找表),您可能不需要在主表中对其进行索引。

最后一个想法,如果每个人总是一次只检索一个公司的数据,那么(a)你肯定会想要索引那个,(b)你可能想考虑对那个值的表进行分区,因为它可以充当超越传统索引的“内置过滤器”。(这可能有点极端,仅在企业版中可用,但在您的情况下可能值得。)

于 2010-12-22T15:59:38.003 回答