right left ejemplos convert charindex sql-server entity-framework tsql indexing sql-server-2012

sql server - left - El prefijo NVarchar causa que se seleccione un índice incorrecto



right sql server ejemplos (2)

Tengo una consulta de marco de entidad que tiene esto en el corazón de esto:

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

El plan de ejecución para esto elige un índice que es un compuesto de tres columnas. Esto toma de 10 a 12 segundos.

Sin embargo, hay un índice que es solo [SomeOtherOrderId] con algunas otras columnas en el "include". Ese es el índice que debería usarse. Y cuando ejecuto las siguientes consultas, se usa:

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''

Esto regresa al instante. Y usa el índice que es solo SomeOtherOrderId

Entonces, mi problema es que realmente no puedo cambiar la forma en que Entity Framework realiza la consulta .

¿Hay algo que pueda hacer desde un punto de vista de indexación que pueda hacer que se seleccione el índice correcto?


Hasta donde yo sé, desde la versión 4.0, EF no genera parámetros unicode para columnas que no sean Unicode. Pero siempre puede forzar parámetros que no sean Unicode mediante DbFunctions.AsNonUnicode (antes de EF6, DbFunctions es EntityFunctions ):

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


Prueba algo como ...

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

Esta consulta indica indirectamente al servidor sql qué índice usar para obtener resutls.