0

エンティティ フレームワークに、外部キーである列でグループ化する 2 つの非常に単純なクエリがあります。つまり、テーブル フィールドは次のとおりです。

pk : Primary key
name : name of object
f1: foreign key1
f2: foreign key2
...

特に次のようなタイムアウト例外が発生します。

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

クエリは次のとおりです。

var q = from x in db.Table select x;
var query_1 = q.GroupBy (record => record.f1);
var query2 = q.GroupBy(record => new {record.f1, record.f2});

DB に約 30,000 のレコードがあり、単純な group by がタイムアウトする理由がわかりません。私が何をすべきかについて何か提案はありますか?私はEntity Framework 4.1を使用しているので、データベースを実装から抽象化したいので、dbエンジン自体を何も変更しないソリューションが必要です。f1 または f2 (または両方) フィールドにインデックスを付けると、より高速なクエリを取得できますか? もしそうなら、誰かがインデックス作成の概念と、Enfity フレームワークでの方法を説明してもらえますか? タイムアウトを増やすことが解決すべき唯一の解決策になるとは思いません。より多くのデータが来ると問題が残るのではないかと心配しています。

編集:ここでEF移行について言及されていることを試しました

私は結果としてこのクラスを持っています:

namespace DataAccessLayer.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class IX_Table1_fId : DbMigration
    {
        public override void Up()
        {
            Console.WriteLine("Creating Index");
            CreateIndex("Table1", "fId");
            Console.WriteLine("Index Created");
        }

        public override void Down()
        {
            DropIndex("Table1", "IX_Table1_fId");
        }
    }
}

しかし、このコードはいつ呼び出されるのでしょうか? コンソールにある印刷ステートメントが表示されません。

4

1 に答える 1

1

最初に行う必要があるのは、パフォーマンスの問題がどこにあるかを確認することです。SQL Server プロファイラー インスタンスを開始し、クエリを実行するコードを実行します。実際の SQL クエリの実行をキャプチャし、所要時間を確認します。

時間がかかる SQL の実行である場合、それを分析する最も簡単な方法は、SQL Server Management Studio に貼り付けてそこから実行し、クエリ プランを確認することです。追加するインデックスが提案されます。

クエリ自体が高速な場合、結果の EFs 処理が問題になります (この場合は疑問です)。

データベースにインデックスを適用する方法は、データベース スキーマの処理方法によって異なります。EF 移行を使用してコードからスキーマを更新する場合は、個別の移行手順として、またはテーブルの作成と一緒にインデックスを追加できます。

于 2012-07-31T17:17:05.703 に答える