¿Cómo puedo evitar que Entity Framework genere consultas ineficientes en SQL Server?
Tengo una entidad definida en un EF 4.0 que se basa en una vista. La vista se extiende sobre una tabla con aproximadamente 18 millones de filas de datos. He seleccionado las 4 propiedades deterministas de la entidad como una clave de entidad compuesta para esta entidad. He expuesto el acceso al modelo que contiene esta vista a través de un servicio de datos OData WCF. El servicio de datos WCF está configurado para limitar los resultados de esta manera
config.SetEntitySetPageSize("*", 100)
Cuando hago una consulta básica contra esta vista:
var fcbs = this.iBenchmarkCostContext.FtCostBenchmarks.ToArray();
Esta es la consulta que veo en mi herramienta de creación de perfiles:
SELECT TOP (100) [Extent1].[MonthBeginDt] AS [MonthBeginDt],
[Extent1].[dmCostBenchmarkKey] AS [dmCostBenchmarkKey],
[Extent1].[dmProductKey] AS [dmProductKey],
[Extent1].[IsImputedFlg] AS [IsImputedFlg],
[Extent1].[ProjectedCopayPerRxAmt] AS [ProjectedCopayPerRxAmt],
[Extent1].[ProjectedPricePerQtyAmt] AS [ProjectedPricePerQtyAmt],
[Extent1].[ProjectedQtyPerRxQty] AS [ProjectedQtyPerRxQty],
[Extent1].[ProjectedRxCnt] AS [ProjectedRxCnt],
[Extent1].[AvgPriceRxAvgPriceQtyDenominator] AS [AvgPriceRxAvgPriceQtyDenominator],
[Extent1].[AvgQtyDenominator] AS [AvgQtyDenominator],
[Extent1].[AvgCopayDenominator] AS [AvgCopayDenominator],
[Extent1].[ProjectedTotalCostAmt] AS [ProjectedTotalCostAmt],
[Extent1].[AllowedRxCnt] AS [AllowedRxCnt],
[Extent1].[CopayRxCnt] AS [CopayRxCnt],
[Extent1].[TotalAllowedAmt] AS [TotalAllowedAmt],
[Extent1].[TotalCopayAmt] AS [TotalCopayAmt],
[Extent1].[TotalCostPerUnitAmt] AS [TotalCostPerUnitAmt],
[Extent1].[TotalUnitQty] AS [TotalUnitQty],
[Extent1].[RC] AS [RC]
FROM (SELECT [ftCostBenchmark].[MonthBeginDt] AS [MonthBeginDt],
[ftCostBenchmark].[dmCostBenchmarkKey] AS [dmCostBenchmarkKey],
[ftCostBenchmark].[dmProductKey] AS [dmProductKey],
[ftCostBenchmark].[IsImputedFlg] AS [IsImputedFlg],
[ftCostBenchmark].[ProjectedCopayPerRxAmt] AS [ProjectedCopayPerRxAmt],
[ftCostBenchmark].[ProjectedPricePerQtyAmt] AS [ProjectedPricePerQtyAmt],
[ftCostBenchmark].[ProjectedQtyPerRxQty] AS [ProjectedQtyPerRxQty],
[ftCostBenchmark].[ProjectedRxCnt] AS [ProjectedRxCnt],
[ftCostBenchmark].[AvgPriceRxAvgPriceQtyDenominator] AS [AvgPriceRxAvgPriceQtyDenominator],
[ftCostBenchmark].[AvgQtyDenominator] AS [AvgQtyDenominator],
[ftCostBenchmark].[AvgCopayDenominator] AS [AvgCopayDenominator],
[ftCostBenchmark].[ProjectedTotalCostAmt] AS [ProjectedTotalCostAmt],
[ftCostBenchmark].[AllowedRxCnt] AS [AllowedRxCnt],
[ftCostBenchmark].[CopayRxCnt] AS [CopayRxCnt],
[ftCostBenchmark].[TotalAllowedAmt] AS [TotalAllowedAmt],
[ftCostBenchmark].[TotalCopayAmt] AS [TotalCopayAmt],
[ftCostBenchmark].[TotalCostPerUnitAmt] AS [TotalCostPerUnitAmt],
[ftCostBenchmark].[TotalUnitQty] AS [TotalUnitQty],
[ftCostBenchmark].[RC] AS [RC]
FROM [dbo].[ftCostBenchmark] AS [ftCostBenchmark]) AS [Extent1]
ORDER BY [Extent1].[MonthBeginDt] ASC,
[Extent1].[dmCostBenchmarkKey] ASC,
[Extent1].[dmProductKey] ASC,
[Extent1].[IsImputedFlg] ASC
Aunque no he solicitado explícitamente ningún pedido, se agrega un pedido por cláusula que incluye los campos incluidos en la clave de entidad compuesta definida para la Entidad. La ejecución de esta consulta lleva una cantidad excesiva de tiempo y genera bloqueos de página en la base de datos. Eliminación de laORDER BY
de la consulta en el entorno de SQL Server devuelve resultados en menos de un milisegundo.
Entonces mi pregunta es:
¿Cómo puedo evitar que EF agregue ese orden por cláusula a la consulta?