10,000 から 20,000 の一意のフィルターを、8 つの列と適切なインデックスを使用して 50M 行のデータセットに適用する必要があります。
私の現在のアプローチは、これらのクエリを一度に 1 つずつ動的に生成して実行することです。
var stats = (from a in db.AggregatedStats
where a.StatType.StartsWith("TOTAL_ITEM")
select a);
// Add more filters to the WHERE clause
foreach (var stat in stats) { // Process the data }
この方法は、SQL Server から MoveNext() へのデータの "ストリーミング" と呼ばれていると思います。
データをプログラムのメモリにバッファリングする方が効率的でしょうか?
var stats = (from a in db.AggregatedStats
where a.StatType.StartsWith("TOTAL_ITEM")
select a).ToList();
次に、代わりにこのエンティティのリストにフィルターを適用します。
var result = (from a in stats
where a.Region.Equals(region)
select a);
これにより、SQL Server クエリの数が 10,000 から 1 に効果的に減少します。
この場合、データセットをプログラムにバッファリングすることは、10,000 クエリからデータをストリーミングするのにかかる時間と比較して、追加の RAM に値するでしょうか?
ありがとう!