【发布时间】:2011-07-06 16:45:28
【问题描述】:
我在 C# 中从实体框架调用 SQL Server 10,并希望在请求中获得查询提示。数据库有索引,在 Management Studio 中运行 SQL 可以正常操作,但是在 Visual Studio 中使用 Entity Framework 从 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]
因此,将[Extent1] 替换为直接sql 调用使用的索引[IX_parentID],通过一些在初始c# 调用中执行查询提示的额外命令似乎是解决方案。我环顾四周,但还没有成功。知道如何提出问题吗?
你认为这是正确的解决方案吗?
【问题讨论】:
-
如果查询优化器选择全表扫描,它可能有充分的理由这样做;表可能太小而无所谓,索引可能没有足够的选择性,统计数据可能已经过时......我会调查为什么,而不是直截了当地强制查询提示。 ....
-
我已经按照stackoverflow.com/questions/117301/… 的建议运行了查询分析器,并且对设置很满意
-
如果索引对搜索方式的改进不超过30%,sql命令会选择全扫描而不是索引
标签: c# sql-server entity-framework-4 sql-execution-plan hint