2016-10-12 5 views
1

たとえば、10000000レコードのテーブルがあり、に100000のIDを持つというリストがあります。Linq2Sqlは複数のIDでレコードを選択しますか?

どのようにこれらのIDですべてのレコードを選択できますか? もちろん、私はこのようにそれを行うことができます。

var ids = GetIds(); 
var result = from q in ctx.Records 
      where ids.Contains(q.Id) 
      select q; 

しかし、私はこのようにそれを行う場合、それは二つの問題があります:生成されたSQLで

  • 怪物私はこのクエリを使用するたびに。

  • 各行に対して複雑(O)。だから、私は数年後に私の結果を受け取ります。

どうすればいいですか?これはlinq2sqlでどのように行われるのですか、これを回避することは不可能ですか?


更新

  • GetIds - この関数は、およそ100.000 IDを返します。そして、いいえ、私はそれに参加できません。 と計算されます。
  • はい、私はそれをテストし、私はそれをデバッグし、生成されたものを見たことがあります。

    SELECT * FROM Records WHERE id IN (/*one hundreds of thousand goes here O_O*/) 
    

    シンプルな数学::10.000.000 X 100.000与える1.000.000.000.000時間の複雑さは、このようなものです。これは非常に不十分です。あなたのIDが固定されている場合

+0

あなたはそれが各行についてO(N)だと思いますか? – Andrey

+0

'GetIds'とは何ですか?それはどこから来て、戻り値の型は何ですか? –

+1

あなたはそれが遅いことをテストしましたか? 'WHERE ID IN(1,2,3,4,5、...、100000)'クエリに変換されます。もちろん、これは最善の方法ではありません(したがって、ユーザー定義のテーブル型とテーブル値のパラメータを使用できますが、LINQ-To-SQLは使用できません)。 –

答えて

1

を取得するために結合を使用、それにIDを追加、単一列を持つ一時テーブルを作成し、 。

var ids = GetIds(); 
//Insert all ids into database (bulk insert) 

var result = from q in ctx.Records 
      join i in ctx.Ids on q.Id equals i.Id 
      select q; 

操作がデータベースに行われます、あなたがin句内の項目の金額の制限を克服します。この方法:ソリューションは、データベース内の別のテーブルを持つようにして、あなたのコードがされるです。

  1. Recordsidフィールドは、インデックスを持つ必要があり、あなたの新しいIdsテーブルのidフィールドもインデックスを作成する必要があります
  2. (または、それはすでにもインデックス化され、主キーの場合)

この方法では、Hash joinで、ではなく、List<string>の代わりにidsコレクションをHashSet<string>として使用する.Netソリューションに相当します。

最後に、多くの操作を並行してサポートするには、Id,OperationIdの2列のIdsを使用できます。OperationIdは、特定のインサートの全てId Sについて説明すると、あなたのクエリは次のようになります。

var result = from q in ctx.Records 
      join i in ctx.Ids on q.Id equals i.Id 
      where i.OperationId = _the operationId given by the insert_ 
      select q; 

OperationIdがあまりにもインデックス化されていることを確認し_Make - Idの同じインデックスであってもよいが、それことがわかります最初の順序です。少なくともOracleのためのそれが接続されているセッションごとにデータを保存 - - DBMSによっては


あなたもtemporary tableとしてあなたのテーブルを持つことができますので、一度に複数のセッションから挿入することができますが、データが共有されていません - あなたは必要ありませんOperationId

-2

、良いではありませんあなたはメモリ内にこれらの操作を行って言ったように、行

+1

質問のタイトルにもかかわらず、実質的にLinq2Sqlの問題ではないので... – code4life

+0

正解が私のものと同じであるので、下の票を削除してください – ammcom

関連する問題