SQL Server:在select中使用包含索引的字段加入,而不是在PK上加入

时间:2018-02-15 22:07:56

标签: sql-server database indexing

我正在寻找有关Microsoft SQL Server(特别是我的情况下)2016如何决定用于连接的索引的一些信息。大部分时间似乎运作良好,但有时候我不得不挠头......

这是一个简单的查询:

SELECT 
    OrderMaster.StartDate, Employee.EmpName   
FROM 
    OrderMaster
INNER JOIN 
    Employee ON OrderMaster.EmpId = Employee.EmpId

EmpIdint表上的PK(Employee)。

Employee上有2个索引:PK_EmployeeEmpId上的聚簇PK索引,IX_Employee_EmpName是非聚簇索引,仅使用列{ {1}}。

此查询返回500个订单记录,但在EmpName表上使用IX_Employee_EmpName执行了索引扫描,该表读取了30,000条记录。

为什么它会选择这个索引,而不是在Employee上进行索引搜索?

解决此问题的首选方法是什么?我是否会指定联接使用PK_Employee索引,还是应该在PK_Employee上创建新索引,但是包括我可以选择的其他列(empname,address等)?

1 个答案:

答案 0 :(得分:0)

  

此查询返回500个订单记录,但已使用Employee表上的IX_Employee_EmpName执行了索引扫描,该表读取了30,000条记录。

SQL Server是基于成本的优化器,因此它尝试根据成本选择计划,在这种情况下,它选择了此索引IX_Employee_EmpName。由于empid是聚簇键,因此默认情况下会将其添加到所有非聚簇索引中,并且SQL Server具有此窄索引所需的两列