我有一个表(它可能会变大,大约数百万行),我经常在上面执行查询SELECT * from table WHERE somefield = 20
,我希望这个查询能够快速运行。在任何时候,我都希望这个查询在可能的数百万中最多返回 10 行,对于这个特定的值 20(不保证任何其他值)。索引这个的正确方法是什么?仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?或者还有其他我可以尝试优化的技巧吗?
问问题
41 次
3 回答
1
仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?
是的,很简单。确保 somefield 是正确的类型(即 int)。如果 somefield 需要包含文本,你可以做更多的事情,否则一个普通的索引就可以了。
如果您不需要不使用返回的每个字段(您可能不需要某个字段,因为您已经知道它是什么),那么您可以获得小幅增加(我的意思是small )。SELECT *
于 2012-08-17T08:25:38.337 回答
1
此查询的理想索引将是具有键列的索引somefield
并包含表中所有其他列的列(通过使索引聚集或带有INCLUDE
选项的 NCI)。
这将允许直接查找值并避免需要书签查找。
但是包含所有这些列的 NCI 的维护开销会影响数据修改操作,您可能更喜欢在不同键列上定义的 CI 以使其他查询受益或无论如何避免碎片
因此,出于这个原因,您可能更喜欢somefield
单独定义 NCI 并使用 10 个书签查找。这是一种平衡行为。
编辑。实际上,如果您只对优化查询感兴趣,somefield = 20
那么您可以在该值上创建一个过滤索引。然后我可能会include
在该索引定义中的所有列。
于 2012-08-17T09:15:19.597 回答
0
是的,您想在某个字段上添加索引。
如果您不进行其他查询,那么您可能希望将其设为聚集索引,但如果没有上下文,则很难得出结论。
于 2012-08-17T08:26:20.040 回答