针对特定查找优化的索引
Posted
技术标签:
【中文标题】针对特定查找优化的索引【英文标题】:Index optimised for specific lookup 【发布时间】:2012-08-17 08:21:44 【问题描述】:我有一个表(可能会变大,大约数百万行),我会定期在其上执行查询 SELECT * from table WHERE somefield = 20
,并且我希望此查询能够快速运行。在任何时候,我都希望这个查询在可能的数百万中最多返回 10 行,对于这个特定的值 20(不保证任何其他值)。索引这个的正确方法是什么?仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?或者还有其他我可以尝试优化的技巧吗?
【问题讨论】:
我已投票决定将其移至 dba.stackexchange.com 【参考方案1】:此查询的理想索引单独应该是具有键列somefield
并包含表中所有其他列的列的索引(通过使索引聚簇或具有INCLUDE
选项)。
这将允许直接查找值并避免书签查找的需要。
但是包含所有这些列的 NCI 的维护开销会影响数据修改操作,您可能更喜欢在不同的键列上定义 CI 以使其他查询受益或避免碎片
因此,出于这个原因,您可能更愿意单独在 somefield
上定义 NCI,并使用 10 个书签查找。这是一个平衡的行为。
编辑。实际上,如果您仅对优化 somefield = 20
的查询感兴趣,那么您可以在该值上创建一个 filtered index。然后我可能会include
该索引定义中的所有列。
【讨论】:
过滤后的索引,这似乎正是我想要的【参考方案2】:仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?
是的,很简单。确保 somefield 是正确的类型(即 int)。如果 somefield 需要包含文本,您可以做更多的事情,否则正常索引就可以了。
如果您不需要通过不使用 SELECT *
返回的每个字段(您可能不需要某个字段,因为您已经知道它是什么)。
【讨论】:
【参考方案3】:是的,您想在某个字段上添加索引。
如果你不做其他查询,那么你可能想把它变成一个聚集索引,但是没有上下文,很难下定论。
【讨论】:
以上是关于针对特定查找优化的索引的主要内容,如果未能解决你的问题,请参考以下文章