每个数据库查询都会减慢我的页面时间 - asp.net

时间:2013-09-24 14:37:18

标签: asp.net sql performance

我在网站上遇到了巨大的性能问题。 我几乎尝试了所有可以成像的东西,我可以谷歌或者我知道解决这个问题,但没有帮助。

我的网站加载大约700-800毫秒到2.000-2.500毫秒。我可以在数据库查询中完全隔离问题 - 在没有单个查询的单个站点上我有110ms,对于每个查询,尽可能简单,我必须添加大约60ms到150ms,所以一个简单的站点:1)获取用户对象,2)获取所有用户的在线列表,3)获取此用户的好友列表,意味着我已经在300 + ms。一个有更多数据要加载的站点,比方说5个简单的查询,需要大约800多个加载。 好奇的是,我的SQL性能测试表明每个查询本身都不需要1ms!

到目前为止我尝试了什么:

  • 在另一个数据库服务器上尝试相同的数据库,没有执行增加
  • 为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();
        }
    }

基本上它非常容易查询,代码非常简单,没有错误的地方!

我在我的实时网站上运行DataWizard SQL Profiler,而12个用户在线,调用一个正常的站点,其中有几个(10-12)个查询,加载时间约为1.5秒,结果如下: http://abload.de/image.php?img=asdzxkdd.jpg

我不知道要做什么......数据库设置正确,PK是Guids with PK,FK都设置正确,这里是一个屏幕: http://abload.de/image.php?img=asdasdzqjin.jpg

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

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

更新1

在关于索引的一些建议之后,我在UserID和RPGID上设置了索引,95%的Coloumns用于Where子句但没有单个ms增加......

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

对数据驱动应用上的性能问题进行故障排除的标准流程如下:

  1. 调整数据库索引(已删除)
  2. 检查资源利用率:CPU,RAM。如果您的CPU已达到最大值,请考虑添加/升级​​CPU或优化代码或拆分层。如果您的RAM已达到最大值,请考虑添加RAM或拆分层。
  3. 检查硬盘使用情况:如果您的队列长度经常超过1(超过每10秒一次),请升级磁盘带宽或向外扩展磁盘(RAID,多个MDF / LDF,数据库分区)。
  4. 检查网络带宽(已消除)
  5. 优化代码:a)整合数据库调用b)更好地使用缓存(或会话)c)调整单个查询。考虑购买RedGate Ants等产品
  6. 然后事情会更加具体到您的架构,代码和平台。