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.