nvarchar的前缀导致选择错误的索引(NVarchar Prefix causes wrong

2019-10-19 13:29发布

我有了这个在它的心脏的实体框架查询:

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

此执行计划选择一个索引是三列的复合物。 这需要10到12秒。

然而,这仅仅是[SomeOtherOrderId]与在“包括”其他一些列的索引。 这是应该使用的索引。 当我运行下面的查询使用它:

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

所以,我的问题是, 我无法去改变实体框架是如何让查询

有什么我可以从这一观点可能会导致正确的索引的索引点做选择?

Answer 1:

就我所知,自从4.0版本,EF不会生成非Unicode列的Unicode参数。 但是,你可以随时通过强制非Unicode参数DbFunctions.AsNonUnicode (之前EF6, DbFunctionsEntityFunctions ):

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


Answer 2:

你可以试试....

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

此查询提示SQL Server的明确使用什么指标来获得resutls。



文章来源: NVarchar Prefix causes wrong index to be selected