我正在寻找有关Microsoft SQL Server(特别是我的情况下)2016如何决定用于连接的索引的一些信息。大部分时间似乎运作良好,但有时候我不得不挠头......
这是一个简单的查询:
SELECT
OrderMaster.StartDate, Employee.EmpName
FROM
OrderMaster
INNER JOIN
Employee ON OrderMaster.EmpId = Employee.EmpId
EmpId
是int
表上的PK(Employee
)。
Employee
上有2个索引:PK_Employee
,EmpId
上的聚簇PK索引,IX_Employee_EmpName
是非聚簇索引,仅使用列{ {1}}。
此查询返回500个订单记录,但在EmpName
表上使用IX_Employee_EmpName
执行了索引扫描,该表读取了30,000条记录。
为什么它会选择这个索引,而不是在Employee
上进行索引搜索?
解决此问题的首选方法是什么?我是否会指定联接使用PK_Employee
索引,还是应该在PK_Employee
上创建新索引,但是包括我可以选择的其他列(empname,address等)?
答案 0 :(得分:0)
此查询返回500个订单记录,但已使用Employee表上的IX_Employee_EmpName执行了索引扫描,该表读取了30,000条记录。
SQL Server是基于成本的优化器,因此它尝试根据成本选择计划,在这种情况下,它选择了此索引IX_Employee_EmpName
。由于empid是聚簇键,因此默认情况下会将其添加到所有非聚簇索引中,并且SQL Server具有此窄索引所需的两列