2014-03-13 51 views
1

我有了這個在它的心臟的實體框架查詢:nvarchar的前綴會導致錯誤的索引被選中

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

的問題是SQL具有轉換每'SomeOtherOrderId'爲unicode,所以你的指數變得usless,它需要恢復的到索引掃描而不是查找。我可以建議的唯一的事情,我不知道它是否會起作用,就是在表格上放一個視圖,並將'SomeOtherOrderId'作爲一個nvarchar,併爲視圖建立索引 - 但有些東西告訴我你不能去做。如果有效,查詢視圖,而不是表格。 – JiggsJedi

+0

@JiggsJedi - 謝謝,至少我知道爲什麼它現在正在做它正在做的事情。 – Vaccano

回答

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。

2

據我所知,從版本4.0開始,EF不會爲非unicode列生成unicode參數。但是,你總是可以通過DbFunctions.AsNonUnicode迫使非Unicode參數(前EF6,DbFunctionsEntityFunctions):

from o in db.WidgetOrder 
where o.SomeOtherOrderId == DbFunctions.AsNonUnicode(param) 
select o 
相關問題