3

SQLServerのテーブルで50Kを超える単純な選択を実行していますが、これを高速化したいと考えています。データをメモリにプルし、データビューのようなものを使用してクエリを実行できることを読みました。

Linqで何かを使用して最終的に-になる方法はありますか?

var dv = CreateTheDataViewFromDatabase();

var result = dv.Where("CategoryId=2 And Uncle='bob'");

そして、これはデータベースに何度もクエリを実行するよりもはるかに高速でしょうか?データビューにインデックスがないので、メモリに保持することによるメリットが失われる可能性があるのではないかと心配しています。

4

4 に答える 4

3

これを行う最も速い方法は、「50Kの単純な選択」のセット全体に対して、結果を順番に返す単一のクエリを生成することです。これにより、すべてを単一のクエリとして実行し、結果を反復処理できます。順次。

これは、テーブルをメモリにプルダウンすると、結果のクエリに役立つSQLサーバーで利用可能だった可能性のあるインデックス情報が失われるためです。もちろん、ペナルティは、クエリが5万クエリ相当のデータを返すことですが、データリーダーとデータテーブルのどちらに対しても正しく実行すれば、クライアントのメモリに不要な情報を保持することを回避できるはずです。

于 2013-01-14T23:11:46.390 に答える
1

はい、を使用して、に対してLinqを使用できDataTableますAsEnumerable。例えば:

var rows = from row in dt.AsEnumerable()
            where row.Field<int>("CategoryId") == 2 && row.Field<string>("Uncle") == "bob" 
            select row;

に参照を追加してくださいSystem.Data.DataSetExtensions

更新:動的SQL

その場で条件を構築することが可能です。DynamicLINQPredicateBuilderをご覧ください

于 2013-01-14T23:09:08.810 に答える
1

プログラムがデータベースとの通信に多くの時間を費やしているようです。データベースに一度クエリを実行し、その結果をコンピュータのメモリに保存すると、プロセスを大幅に高速化できます。ADO.NETエンティティデータモデルを使用している場合は、データベースに簡単にクエリを実行し、取得したレコードをIEnumerableに保存できます。次に、LINQを使用して、保存された値に対してクエリを実行できます。

//Get the data from your database 
public IEnumerable<DataValue> GetDataValues()
{
    try
    {
        using (var db = new MyEntities())
        {
            return (from data in db.DataValues
                   select data).ToList(); 
        }
    }
    catch(Exception e)
    {
        Console.WriteLine(e); 
    }
}


//Perform operations on the data
public void DoSomething()
{
    var data = GetDataValues(); 
    var result = data.Where(p => p.CategoryId == 2 && p.Uncle == "Bob"); 
    //etc...
}

ここここでLINQの使用に関するいくつかの適切な例を見つけることができます。

于 2013-01-15T02:57:41.990 に答える
0

他の回答に示されているようにそれは可能ですが、考慮すべきことがいくつかあります。

まず、プルする必要のあるデータの合計量はどれくらいですか。その量が非常に多くのメモリを必要とし、仮想メモリが大量に起動する場合、OSが必要とする時間だけ速度の利点をすべて失います。ページングについて。

第二に、5万以上のクエリがたくさんあります。クエリの量を減らすために、設計変更/リファクタリングを検討してください。別のアルゴリズムの利点は、提案されたソリューションよりも優れている可能性があります。

于 2013-01-14T23:17:15.183 に答える