0

C#のEntityFrameworkからSQLServer 10を呼び出しており、リクエストにクエリヒントを取得したいと考えています。データベースには、Management Studioで実行されるSQLから通常どおりに動作するインデックスがありますが、Visual StudioのEntityFrameworkを使用してC#からコマンドを呼び出すと、クエリプランナーは既にインデックスが存在する場合にフルスキャンを選択します。

次の形式でデータを要求する動的述語を作成しています。

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

ここで、parentPredicateは次と同等の動的に生成されます。

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

SQLServerクエリプランの生成元は次のとおりです。

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]インデックスを、最初のc#呼び出しでクエリヒントを実行する追加のコマンドに置き換えることは、解決策のように思われます。[IX_parentID]私は周りを見回しましたが、まだ成功していません。質問を組み立てる方法はありますか?

これが正しい解決策だと思いますか?

4

2 に答える 2

0

SQL トレースを実行して、このステートメントに対して実際に生成されている SQL クエリを確認します。

述語または同等のものは、SQL Server から見たクエリに実際に表示されますか?

表示される場合は、インデックス チューニング ウィザードなどを使用してそのクエリを実行する必要があります。

そうでない場合は、それが問題です。これは、Entity Framework がテーブル全体をメモリに読み込み、述語自体を適用していることを意味します。

AsExpandable () は述語を SQL に変換できないため、テーブル全体を読み取るコードを生成し、返されたデータに述語を適用しています。

解決策は、AsExpandable の使用をやめ、代わりに AsQueryable を使用することです。AsExpandable を使用する唯一の理由は、AsQueryable が必要な機能を提供しない場合であり、ここではそうではないと思います。

于 2011-03-01T17:51:30.957 に答える
0

Try updating statistics for the related tables in your database, if statistics are outdated non-optimal query plans are likely to be used for all queries.

于 2012-11-19T11:43:43.087 に答える