我有以下Code First实体:
public class Department
{
public int DepartmentID { get; set; }
public string DepartmentName { get; set; }
}
我设置的配置如下表所示:
dbo.Departments
DepartmentID INT PRIMARY KEY
DepartmentName VARCHAR(75)
我手动为DepartmentName添加了索引并运行以下查询:
var depts = new string[] { "Engineering", "Manufacturing" };
var departments = from d in db.Departments
where depts.Contains(d.DepartmentName)
select d;
当我运行跟踪时,它产生了以下SQL:
SELECT
[Extent1].[DepartmentID] AS [DepartmentID],
[Extent1].[DepartmentName] AS [DepartmentName]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[DepartmentName] IN (N'Engineering',N'Manufacturing')
由于我的列是varchar并且查询正在将文本转换为NVARCHAR,因此优化器选择在我的DepartmentName索引上执行聚簇索引扫描而不是索引搜索。
除了更改我的数据库以使用nvarchar之外,有没有办法解决这个问题?这是一个错误还是正常的?
答案 0 :(得分:0)
如果您的索引数据表很小,这是可以预期的。
SQL将从磁盘读取的最小数据量为8k(一页),因此如果它使用索引,则需要访问磁盘两次,一次针对索引,然后再针对数据。如果所有数据都适合一个8k数据页面,那么无论如何都可以一次性读取,因此使用索引会添加不必要的磁盘IO。