【问题标题】:Table index design表索引设计
【发布时间】:2011-05-29 11:48:42
【问题描述】:

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

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

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

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

int x 9 列 = id-s

varchar x 10 列

位 x 2 列

日期时间 x 5 列

INT 列

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

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

字符串列

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

日期栏

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

【问题讨论】:

  • 从查询开始设计索引。基本上,每个索引都旨在覆盖查询或强制执行约束。
  • 索引设计指南:msdn.microsoft.com/en-us/library/ms191195。在进一步做任何事情之前阅读它们。

标签: sql sql-server-2005 database-design clustered-index non-clustered-index


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    • 您的数据是如何分布的?哪些列具有足够的选择性(

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

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

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

    您不能索引的是包含超过 900 字节数据的列 - 诸如 VARCHAR(1000) 之类的任何内容。

    如需深入了解索引方面的背景知识,请咨询索引女王blog by Kimberly Tripp。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-26
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多