2017-04-06 54 views
2

我有以下表为什么非聚集索引列仍然索引扫描而不是索引查找

EmployeePatientLink

Id nvarchar(128) PK & clustered index 
PatientId nvarchar(128) FK NULL -- nonclustered index created 
EmployeeId int NULL-- nonclustered index created. 

患者

Id nvarchar(128) PK & clustered index 
Id PK & clustered Index -- this links to above table 

PatientSchedule

PatientId为nvarchar(128)NULL - 非聚集索引创建

与此查询

select 
    Id, PatientId 
from 
    PatientSchedule ps 
Inner join 
    EmployeePatientLink ep on ps.PatientId = ep.PatientId 
    where ep.EmployeeId=1111 

我有有像上述类似的查询和其他执行索引在执行计划中寻求和嵌套循环连接。

但是,这个总是包含合并加入和分类和索引扫描。

我想我有足够的索引创建和一切都是为了它应该做索引搜索。

查询优化器选择索引查找的具体原因是什么?

+0

是的,有一个具体的理由。根据内置于SQL Server优化器的统计信息和规则,它确定索引查找是运行查询的最便宜方式。您可以添加提示以避免合并连接,并查看在这种情况下的成本。 –

+1

SQL Server查询优化器可能已确定它执行索引扫描而不是索引查找是**更便宜**。这可能是因为缺少“WHERE”子句 - 如果您的查询需要从该连接返回**每个条目**,则可能更容易**扫描索引。如果你只用一个好的'WHERE'子句选择一个或几个(少数)条目,这可能会改变...... –

+4

哇,'nvarchar(128)'聚集索引键?哎,没有更好的选择?你可能会这样看:这个关键的成本是多少? (加上sp_helpindex9) - 金佰利Tripp](http://www.sqlskills.com/blogs/kimberly/how-much-does-that-key-cost-plus-sp_helpindex9/) - 我不认为我可以带我自己试着查询调谐具体的查询,直到我有更好的集群密钥。 – SqlZim

回答

0

尝试创建包含的列的索引,以避免“键查找”(SQL服务器需要搜索PatientId值时,发现雇员)

CREATE INDEX IX_EmployeePatientLink_EmployeeId ON EmployeePatientLink(EmployeeId) 
INCLUDE (PatientId) 
相关问题