首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法,该方法从运行缓慢的多个数据库获取数据。

方法,该方法从运行缓慢的多个数据库获取数据。
EN

Stack Overflow用户
提问于 2015-06-16 15:56:18
回答 1查看 117关注 0票数 0

我有一些方法需要从多个数据库中获取统计数据。关键思想是,每个表都包含一个DBName,然后从它深入到客户机主DB,使用所需的数据库名调用存储的proc。最后,我再向下钻一次,从客户端的项目数据库中获取数据。

总结一下:

  1. 我得到了所有云用户的列表。
  2. 对于每个用户,我使用标记为userClients的主DB userClients上存储的proc来获取他的客户端。
  3. 对于每个客户端,我使用客户端Project上存储的proc获取他的统计数据。

只需5-6秒就能执行很少的数据。

代码语言:javascript
复制
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;
    }

我能做些什么来提高业绩吗?

EN

回答 1

Stack Overflow用户

发布于 2015-06-16 16:16:39

我要做的第一件事是启用.NET跟踪,并在每次调用之前和之后向tracelog写入一行。

https://msdn.microsoft.com/en-us/library/zs6s4h68(v=vs.110).aspx

这一行使我怀疑您可能在其中一个查询中秘密运行一个" in“子句,该子句可能不太符合性能:

代码语言:javascript
复制
 var ids = string.Join(",", db.UserClients.Where(uc => uc.UserId == user.ID).Select(uc => uc.ClientId.ToString()).ToArray());

下一步,一旦您发现弱执行程序(上面的行只是我的猜测),您应该启用数据库分析,以确定哪里需要新的索引或数据库维护。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30872569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档