NVarchar Prefix会导致选择错误的索引

时间:2014-03-13 20:27:00

标签: sql-server entity-framework tsql indexing sql-server-2012

我有一个实体框架查询,它的核心是:

SELECT 1 AS dummy
FROM   [dbo].[WidgetOrder] AS widgets
WHERE  widgets.[SomeOtherOrderId] = N'SOME VALUE HERE'

此执行计划选择一个由三列组合而成的索引。 这需要10到12秒。

但是,有一个索引只是[SomeOtherOrderId],其中包含" include"中的其他一些列。这是应该使用的索引。当我运行以下查询时,它会被使用:

SELECT 1 AS dummy
FROM   [dbo].[WidgetOrder] AS widgets
WHERE  widgets.[SomeOtherOrderId] = CAST(N'SOME VALUE HERE' AS VARCHAR(200))

SELECT 1 AS dummy
FROM   [dbo].[WidgetOrder] AS widgets
WHERE  widgets.[SomeOtherOrderId] = 'SOME VALUE HERE'

会立即返回。它使用的索引仅为SomeOtherOrderId

所以,我的问题是我无法真正改变实体框架进行查询的方式

从索引的角度来看,我能做些什么可能导致选择正确的索引?

2 个答案:

答案 0 :(得分:2)

据我所知,自版本4.0起,EF不会为非unicode列生成unicode参数。但您始终可以DbFunctions.AsNonUnicode强制执行非unicode参数(在EF6之前,DbFunctionsEntityFunctions):

from o in db.WidgetOrder
where o.SomeOtherOrderId == DbFunctions.AsNonUnicode(param)
select o

答案 1 :(得分:0)

尝试类似......

SELECT 1 AS dummy
FROM   [dbo].[WidgetOrder] AS widgets WITH (INDEX(Target_Index_Name))
WHERE  widgets.[SomeOtherOrderId] = N'SOME VALUE HERE'

此查询明确提示sql server使用什么索引来获取resutls。