Sql server 2008 针对特定查找优化索引

Sql server 2008 针对特定查找优化索引,sql-server-2008,query-optimization,indexing,Sql Server 2008,Query Optimization,Indexing,我有一个表(可能会扩大到数百万行),我定期在该表上执行查询SELECT*from table WHERE somefield=20,我希望该查询能够快速运行。在任何时候,对于这个特定的值20(不保证任何其他值),我希望这个查询返回最多10行(可能是数百万行)。什么是索引这个的正确方法?仅仅在某个字段上放置一个索引,并确保统计数据大致是最新的,这就足够了吗?或者是我可以尝试优化的其他技巧 仅仅在某个字段上放置一个索引,并确保统计数据大致是最新的,这就足够了吗 是的,很简单。确保somefield是

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

仅仅在某个字段上放置一个索引,并确保统计数据大致是最新的,这就足够了吗

是的,很简单。确保somefield是正确的类型(即int)。如果somefield需要包含文本,那么您可以做更多的事情,但其他情况下,普通索引也可以


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

是的,您需要在somefield上添加索引


如果您不进行其他查询,那么您可能希望将其作为聚集索引,但如果没有上下文,很难得出结论。

此查询的理想索引应该是带有键列
somefield
的索引,并包含表中所有其他列的列(通过聚集索引或使用
INCLUDE
选项创建NCI)

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

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

因此,您可能更喜欢在
somefield
上单独定义一个NCI,并使用10个书签查找。这是一种平衡行为


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

我投票将其移动到dba.stackexchange.com筛选索引,这似乎正是至少我在找