私はC#とSQL Serverを使用しています。私は各ドキュメントの行を持っているSQL Serverのテーブルの主キーに対応するドキュメントのIDのリストを持っていて、その行にはそのIDのIDとドキュメントが含まれています。各IDの行の文書を取得したいと思います。現在、IDごとにクエリを実行していますが、10,000個あるため、大量のクエリが実行され、非常に時間がかかります。それは、テーブルからメモリにすべてをロードしてから、私が持っているIDでフィルタリングするほうが速くなってしまいますが、効率が悪く、時間が経ってもスケールされません。それが意味をなさない場合は、うまくいけば、実行に時間がかかる次のコードが私がしようとしていることを示していることを願っています。IDリストから多くの行を取得
private static Dictionary<Guid, string> foo(IEnumerable<Guid> guids, SqlConnection conn)
{
using (SqlCommand command = new SqlCommand(null, conn))
{
command.CommandText = "select document from Documents where id = @id";
SqlParameter idParam = new SqlParameter("@id", SqlDbType.UniqueIdentifier);
command.Parameters.Add(idParam);
command.Prepare();
var documents = new Dictionary<Guid, string>();
foreach (var guid in guids)
{
idParam.Value = guid;
object obj = command.ExecuteScalar();
if (obj != null)
{
documents[guid] = (string)obj;
}
}
return documents;
}
}
私はプログラム的にこのようなwhere句を使用するクエリ文字列を構築することができます:一度に100件のドキュメントを取得するには "(ID1、ID2、ID3、...、ID100)のidがどこ...." かそのようなものですが、これはジャッキーを感じ、より良い方法になるはずです。
私はこれに遭遇する唯一の人ではないと確信しています。これについては受け入れられる方法がありますか?
わかりませんが、送信できるクエリのサイズに制限はありませんか? idはguidで、それぞれ36バイトになります。したがって、もし私が20,000のIDを持っていれば、72,000バイト以上のクエリです。そして、これは何十万人もの人に成長するかもしれません。クエリのサイズに制限はありませんか? – cabird