我有一个实体框架查询,它的核心是:
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
所以,我的问题是我无法真正改变实体框架进行查询的方式。
从索引的角度来看,我能做些什么可能导致选择正确的索引?
答案 0 :(得分:2)
据我所知,自版本4.0起,EF不会为非unicode列生成unicode参数。但您始终可以DbFunctions.AsNonUnicode
强制执行非unicode参数(在EF6之前,DbFunctions
为EntityFunctions
):
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。