理想的なクラス構造
ゲームには多くのプレイヤーがいて、それぞれが多くの統計を持っています。つまり、それぞれList<Game>
に が含まれ、List<Player>
それぞれPlayer
に が含まれますList<Statistic>
。
Game -> Player1 -> Statistic1
....
Statistic30
....
Player10 -> Statistic1
....
Statistic30
基本的なテーブル スキーマ
Game
----
GameId (int)
Region (nvarchar(4))
Player
------
GameId (int)
Region (nvarchar(4))
AccountId (int)
Statistic
---------
GameId (int)
Region (nvarchar(4))
AccountId (int)
私の試み
var b = (from g in db.Games
select new GameDTO()
{
GameId = g.GameId,
Players = (from p in db.PlayerGames
where p.GameId == g.GameId && p.Region.Equals(g.Region)
select new PlayerGameDTO()
{
AccountId = p.AccountId,
GameId = p.GameId,
Region = p.Region,
Statistics = (from r in db.Statistics
where r.AccountId == p.AccountId && r.GameId == p.GameId && r.Region.Equals(p.Region)
select r).ToList()
}).ToList()
});
このソリューションは (明らかに) を使用しません。これは主に、目的の結果を得るために正しい順序で sJoin
を実行する方法がわからないためです。Join
毎日、約 10 万の新しいゲーム、約 100 万人のプレイヤー、約 3,000 万の統計情報を集計していることに言及しておく必要があります。現在のクエリは、1 秒あたり最大 1.4 ゲームを選択でき、ハイパー スレッド化されたクアッド コア CPU の 99% を使用します。
何かご不明な点がございましたら、お気軽にお問い合わせください。
更新 #1
var d = (from g in db.Games
join p in db.PlayerGames on new { g.GameId, g.Region } equals new { p.GameId, p.Region }
join r in db.Statistics on new { p.GameId, p.Region, p.AccountId } equals new { r.GameId, r.Region, r.AccountId }
select new StatisticsDTO()
{
GameId = r.GameId,
AccountId = r.AccountId,
StatType = r.StatType,
Value = r.Value
});
この単純なことは、毎秒最大 9,000 行 (元の 22 倍の速さ) を生成することです。SQL Server が明らかにすべての作業を行っており、CPU の約 90% を使用しています。ただし、ネストされたオブジェクトの代わりに、1 次元のクエリが残っています。
この更新について何か提案があれば、ぜひ聞かせてください。