【问题标题】:Index optimised for specific lookup针对特定查找优化的索引
【发布时间】:2012-08-17 08:21:44
【问题描述】:

我有一个表(可能会变大,大约数百万行),我会定期在其上执行查询 SELECT * from table WHERE somefield = 20,并且我希望此查询能够快速运行。在任何时候,我都希望这个查询在可能的数百万中最多返回 10 行,对于这个特定的值 20(不保证任何其他值)。索引这个的正确方法是什么?仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?或者还有其他我可以尝试优化的技巧吗?

【问题讨论】:

  • 我已投票决定将其移至 dba.stackexchange.com

标签: sql-server-2008 query-optimization indexing


【解决方案1】:

此查询的理想索引单独应该是具有键列somefield 并包含表中所有其他列的列的索引(通过使索引聚簇或具有INCLUDE 选项)。

这将允许直接查找值并避免书签查找的需要。

但是包含所有这些列的 NCI 的维护开销会影响数据修改操作,您可能更喜欢在不同的键列上定义 CI 以使其他查询受益或避免碎片

因此,出于这个原因,您可能更愿意单独在 somefield 上定义 NCI,并使用 10 个书签查找。这是一个平衡的行为。

编辑。实际上,如果您仅对优化 somefield = 20 的查询感兴趣,那么您可以在该值上创建一个 filtered index。然后我可能会include 该索引定义中的所有列。

【讨论】:

  • 过滤后的索引,这似乎正是我想要的
【解决方案2】:

仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?

是的,很简单。确保 somefield 是正确的类型(即 int)。如果 somefield 需要包含文本,您可以做更多的事情,否则正常索引就可以了。

如果您不需要通过不使用 SELECT * 返回的每个字段(您可能不需要某个字段,因为您已经知道它是什么)。

【讨论】:

    【解决方案3】:

    是的,您想在某个字段上添加索引。

    如果你不做其他查询,那么你可能想把它变成一个聚集索引,但是没有上下文,很难下定论。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2012-08-06
      • 2021-01-30
      • 2010-09-13
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2023-03-11
      相关资源
      最近更新 更多