我正在与我网站上的巨大性能问题作斗争。我尝试了几乎所有我能想象的东西,我可以谷歌或我知道解决这个问题,但没有帮助。
我的网站在大约 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 中使用但没有增加一个毫秒...