我有一些方法需要从多个数据库中获取统计数据。关键思想是,每个表都包含一个DBName,然后从它深入到客户机主DB,使用所需的数据库名调用存储的proc。最后,我再向下钻一次,从客户端的项目数据库中获取数据。
总结一下:
只需5-6秒就能执行很少的数据。
public List<CloudAnalysisDTO> GetCloudAnalysisForPeriod(DateTime FromDate, DateTime ToDate)
{
var users = FindAll();
List<CloudAnalysisDTO> resultsList = new List<CloudAnalysisDTO>();
HashSet<string> userclients = new HashSet<string>();
using (var db = new ProjSQLDataContext(conn))
{
foreach (var user in users)
{
if (user.ID == 0)
continue;
var ids = string.Join(",", db.UserClients.Where(uc => uc.UserId == user.ID).Select(uc => uc.ClientId.ToString()).ToArray());
var mainDB = user.MainDB;
if (mainDB.Length == 0 || ids.Length == 0)
continue;
List<CloudAnalysisDTO> userClients =
db.ExecuteQuery<CloudAnalysisDTO>(@"EXEC CloudUsersAnalysis {0},{1}", mainDB, ids).ToList<CloudAnalysisDTO>();
List<CloudAnalysisDTO> needRemove = new List<CloudAnalysisDTO>();
foreach (var client in userClients)
{
if (!userclients.Contains(user.MainDB + client.ClientID.ToString()))
userclients.Add(user.MainDB + client.ClientID.ToString());
else
{
needRemove.Add(client);
continue;
}
ClientAnalysisDTO clientAnalysisDTO =
db.ExecuteQuery<ClientAnalysisDTO>(@"EXEC CloudClientAnalysis {0},{1},{2}", client.ProjectDB, FromDate, ToDate).SingleOrDefault<ClientAnalysisDTO>();
if (clientAnalysisDTO != null)
{
client.ClientAnalysisDTO = clientAnalysisDTO;
}
client.UserID = user.ID;
client.MainDB = user.MainDB;
}
foreach (var removeDTO in needRemove)
{
userClients.Remove(removeDTO);
}
if (userClients != null && userClients.Count > 0)
resultsList.AddRange(userClients);
}
}
return resultsList;
}我能做些什么来提高业绩吗?
发布于 2015-06-16 16:16:39
我要做的第一件事是启用.NET跟踪,并在每次调用之前和之后向tracelog写入一行。
https://msdn.microsoft.com/en-us/library/zs6s4h68(v=vs.110).aspx
这一行使我怀疑您可能在其中一个查询中秘密运行一个" in“子句,该子句可能不太符合性能:
var ids = string.Join(",", db.UserClients.Where(uc => uc.UserId == user.ID).Select(uc => uc.ClientId.ToString()).ToArray());下一步,一旦您发现弱执行程序(上面的行只是我的猜测),您应该启用数据库分析,以确定哪里需要新的索引或数据库维护。
https://stackoverflow.com/questions/30872569
复制相似问题