【发布时间】:2011-07-08 21:46:05
【问题描述】:
听起来和what's asked here的情况类似,但我不确定他的详细信息是否与我的相同。
基本上我有一个关系表,我们称之为用户:
User
-----------
int Id
varchar<100> Name
int AddressId
varchar<max> Description
它具有以下索引: PK_User_Id - 显然是主键。 IX_User_AddressId - 仅包括 AddressId。
当我运行以下查询时:
select Id, Name, AddressId, Description from User where AddressId > 200
执行计划显示扫描已完成,并且使用了 PK_User_Id。
如果我运行这个查询:
select AddressId from User where AddressId > 200
执行计划显示已完成扫描并使用了 IX_User_AddressId。
如果我在 IX_User_AddressId 索引中包含所有列,那么我的原始查询将使用正确的索引,但我必须这样做似乎仍然是错误的。
所以我的 SQL 菜鸟问题是这样的:我必须做些什么才能让我的查询使用最快的索引?要非常具体,因为我无法弄清楚这一点,所以我一定是智障。
【问题讨论】:
-
表格中有多少行与每个示例中返回了多少行
-
如果您使用 = 运算符而不是 > 运行相同的查询,是否使用了非聚集索引?正如 Andrew 所暗示的,我们需要知道 AddressId>200 的行的比例,以确定 MSSQL 是否适当地使用了索引统计信息。
标签: sql tsql indexing sql-execution-plan