1

我正在与我网站上的巨大性能问题作斗争。我尝试了几乎所有我能想象的东西,我可以谷歌或我知道解决这个问题,但没有帮助。

我的网站在大约 700-800 毫秒到 2.000-2.500 毫秒内加载。我可以准确地将问题隔离在数据库查询上-在没有单个查询的单个站点上,我有 110 毫秒,对于每个查询,尽管可能很简单,但我必须添加大约 60 毫秒到 150 毫秒,所以一个简单的站点:1)获取用户对象,2)为在线列表获取所有用户,3)为该用户获取好友列表,这意味着我已经在 300+ms 时完成了。一个需要加载更多数据的网站,比如说 5 个简单的查询,需要大约 800 多个来加载。有趣的是,我的 SQL 性能测试表明每个查询本身不需要 1 毫秒!

我到现在为止的尝试:

  • 在另一个数据库服务器上尝试相同的数据库,不增加性能
  • 为 IIS 尝试另一台服务器,因此将页面托管在另一台服务器上,不会提高性能
  • 在不同的服务器版本(2005、2008 和 2012)上尝试数据库,没有增加
  • 确保负载不是由太多用户引起的(我作为唯一用户的新 SQL Server 上的加载时间相同)

这是我的site.master中的一个示例,default.aspx什么都不显示,所以它是空的,只有数据库查询,这个站点将在300ms内加载:

Guid userID = Guid.Parse(Request.Cookies["UserID"].Value);
Dal.User user = DAL.UserDAL.GetUser(userID);
List<DAL.User> onlineList = DAL.UserDAL.GetAllOnlineUser();
List<DAL.UserFriend> friendList = DAL.UserDAL.GetAllFriends(userID);

在我的 DAL 中:

 public static User GetUser(Guid userID)
    {
        using (RPGDataContext dc = new RPGDataContext())
        {

                User u = (from a in dc.Users where a.UserID == userID select a).SingleOrDefault();
                if (u != null && u.UserID != Guid.Empty)
                {
                    return u;
                }
                else
                {
                    return null;
                }

        }
    }

 public static List<User> GetAllOnlineUser()
    {
        using (RPGDataContext dc = new RPGDataContext())
        {
            return (from a in dc.Users where a.RefreshPing > DateTime.Now.AddMinutes(-15) orderby a.Username select a).ToList();
        }
    }
  public static List<UserFriend> GetAllFriends(Guid userID)
    {
        using (RPGDataContext dc = new RPGDataContext())
        {
            DataLoadOptions options = new DataLoadOptions();
            options.LoadWith<UserFriend>(a => a.User);
            options.LoadWith<UserFriend>(a => a.User1);
            dc.LoadOptions = options;

            return (from a in dc.UserFriends where a.UserIDActive == userID select a).ToList();
        }
    }

所以基本上它的查询非常简单,代码非常简单,没有太多错误的地方!

当有 12 个用户在线时,我还在我的实时网站上运行了 DataWizard SQL Profiler,调用一个带有几个(10-12)个查询的普通站点,这些查询在大约 1.5 秒内加载,这就是结果: http://abload。 de/image.php?img=asdzxkdd.jpg

我不知道该怎么办...数据库设置正确,PK是带有PK的Guids,FK都设置正确,这里是一个屏幕: http ://abload.de/image.php?img= asdasdzqjin.jpg

我有想法,但我在互联网上找不到任何东西: - Guid 是 PK 吗?这可能是数据库如此缓慢的原因吗?- 可能是连接本身的问题,是否可以在每个查询中打开一个新的 DataContext?

没有更多的想法......希望有人会在这里帮助......我有点无助!

更新 1

在对索引提出了一些建议之后,我在 UserID 和 RPGID 上设置了索引,其中 95% 的大多数列在 Where-Clauses 中使用但没有增加一个毫秒...

4

2 回答 2

2

由于您尚未添加任何索引,这很可能是您的问题。如果没有好的索引,随着数据库的增长,响应时间会变得很慢。

听起来您已经运行了性能分析器,它收集查询信息和统计信息。下一步是通过数据库调整向导运行这些结果。最简单的方法是通过 SSMS(菜单:工具、数据库引擎优化顾问)。通常,我不建议盲目接受这些建议,但这是一个很好的开始方式。

您可以在此 MSDN 文章中阅读有关使用调整向导的更多信息:http: //msdn.microsoft.com/en-us/library/ms186354 (v=sql.100).aspx/html 或者如果您对其他方式感兴趣要调整数据库或监控您的索引,这是另一篇 SO 帖子,其中有一些与您的问题相关的非常好的建议: SQL Profiler and Tuning Advisor

于 2013-09-24T15:13:58.640 回答
2

解决数据驱动应用程序性能问题的标准流程如下:

  1. 调整数据库索引(已消除)
  2. 检查资源利用率:CPU、RAM。如果您的 CPU 已用尽,请考虑添加/升级​​ CPU 或优化代码或拆分您的层。如果您的 RAM 已用尽,请考虑添加 RAM 或拆分您的层。
  3. 检查 HDD 使用情况:如果您的队列长度经常超过 1(每 10 秒超过一次),请升级磁盘带宽或横向扩展您的磁盘(RAID、多个 MDF/LDF、DB 分区)。
  4. 检查网络带宽(已消除)
  5. 优化代码:a) 整合数据库调用 b) 更强大地使用缓存(或会话) c) 调整单个查询。考虑购买 RedGate Ants 或类似产品。

然后事情变得更加具体到您的架构、代码和平台。

于 2013-09-24T19:54:29.783 回答