强制提示从实体框架索引到SQL Server

时间:2011-03-01 17:32:39

标签: c# sql-server entity-framework-4 sql-execution-plan hint

我在C#中使用Entity Framework调用SQL Server 10,并希望获得对请求的查询提示。数据库具有从Management Studio中的SQL运行中正常运行的索引,但在使用Visual Studio中的实体框架从C#调用命令时,查询计划程序会在已有索引时选择完整扫描。

我正在创建动态谓词,以便以下列形式请求数据:

data.attributeText = data.vegaDB.attributeText.AsExpandable().Where(parentPredicate.Compile()).ToList();

其中parentPredicate是动态生成的,相当于:

(parentID = p1) AND (attributeName = 'name OR ... ')          

SQL Server查询计划从中生成:

SELECT 
[Extent1].[attributeID] AS [attributeID],  
[Extent1].[parentID] AS [parentID],  
[Extent1].[typeID] AS [typeID],  
[Extent1].[attributeName] AS [attributeName],  
[Extent1].[attributeData] AS [attributeData]  
FROM [dbo].[attributeText] AS [Extent1]

所以用直接sql调用使用的索引[Extent1]替换[IX_parentID],通过一些在初始c#调用中执行查询提示的额外命令似乎是解决方案。我环顾四周但还没有成功。知道如何构建问题吗?

您认为这是正确的解决方案吗?

2 个答案:

答案 0 :(得分:0)

运行SQL跟踪以找出为此语句生成实际的SQL查询。

您的谓词或等效内容是否实际出现在SQL Server 所见的查询中?

如果确实出现,那么您需要通过索引优化向导或类似工具运行 查询。

如果没有,那就是你的问题 - 这意味着实体框架正在将整个表加载到内存中并应用谓词本身。

已更新我非常确定最后一步正是发生的事情:AsExpandable()无法将谓词转换为SQL,因此它生成代码来读取整个表,然后应用返回数据的谓词。

解决方案是停止使用AsExpandable并改为使用AsQueryable。使用AsExpandable的唯一原因是,如果AsQueryable不提供您需要的功能,我认为这不是这种情况。

答案 1 :(得分:0)

尝试更新数据库中相关表的统计信息,如果统计信息已过时,则非最佳查询计划可能会用于所有查询。