gpt4 book ai didi

sql - 为什么 DNN 中 DAL2 存储库的默认 GetById() 执行缓慢?

转载 作者:行者123 更新时间:2023-12-01 11:41:35 24 4
gpt4 key购买 nike

我遇到一个问题,DAL2 存储库的默认 Get() 函数需要几秒钟才能返回结果。当我使用 SQL Server Management Studio 直接查询数据库以获取记录时,查询会快速返回。该函数是一个基本函数,如下所示:

public MyThing Get(string primaryKey)
{
MyThing myThing;
using (IDataContext ctx = DataContext.Instance(“DATABASECONN”))
{
var rep = ctx.GetRepository<MyThing>();
myThing = rep.GetById(primaryKey);
}
return myThing;
}

该表有 80 万多个条目。

即使启用缓存设置,该函数在后续执行中具有相同的执行时间。

为什么它运行缓慢,我怎样才能加快它的速度?

最佳答案

调查

我在调试代码时在数据库上运行了 SQL Profiler。它显示第一次调用 GetById() 函数时,执行了从数据库表中选择所有记录的查询。主键未传递到数据库。下次执行 GetById() 函数时,不再查询数据库。结果从缓存值返回。

因此,从 GetById() 函数返回的单个记录必须是对表中所有记录的结果集进行某种搜索的结果。这个函数如何操作和检索记录的细节在编译代码中(这个编译代码的源代码可能是可用的,但我还没有调查它)。

我查看了这段代码执行期间的内存使用情况,以确保 IIS 有足够的内存量。 IIS 中的设置已设置为允许应用程序池使用可用内存。调试 w3wp.exe 进程的内存使用量在 0.75 到 1.3 GB 之间波动。有大量可用的额外 RAM,因此网站可以根据需要使用更多内存。

这些实验的亮点是:

  • GetById() 函数第一次访问数据库表时,它将从表中选择所有记录。
  • 缓存按预期运行,因此重复查询不会访问数据库。
  • 无论有多少内存可供 IIS 使用,从缓存中检索结果都需要几秒钟。

解决方案

为了解决这个问题,我改变了我的方法。在SELECT中直接使用主键查询数据库时,查询返回很快。这导致我使用 DAL2 存储库的 Find() 函数,这样我就可以自己指定 SELECT 的条件。
我创建的函数如下所示:

public MyThing Get(string primaryKey)
{
MyThing myThing = (MyThing)DataCache.GetCache(primaryKey);
if (myThing != null)
return myThing;

IList<MyThing> myThings;
using (IDataContext ctx = DataContext.Instance(“DATABASECONN”))
{
var rep = ctx.GetRepository<MyThing>();
myThings = (IList<MyThing>)rep.Find("WHERE myPrimaryKeyFieldName = @0", primaryKey);
if (myThings.Count > 0)
DataCache.SetCache(primaryKey, myThings[0]);
}
return myThings.Count > 0 ? myThings[0] : null;
}

上面的函数使用了 Find() 函数,因此 DAL2 没有实现缓存。为了解决这个问题,我使用了自定义缓存技术。使用 SQL Profiler 调查此函数表明,使用相同的 primaryKey 值重复调用该函数不会命中数据库,因此缓存的行为符合预期。

以这种方式使用缓存不会像使用 GetById() 时那样减慢执行时间。放置在函数中的日期时间用作计时器,显示以下执行时间。当数据库被命中时,00:00:00.1 或更少。当缓存被命中时,执行时间为 0。这没有进行大规模测试,但执行时间在我运行的测试中是一致的。

结论

以上测试和解决方案说明DAL2中的GetById()要慎用。根据数据库的大小检索记录不一定是最佳解决方案。如果数据检索执行缓慢,请探索替代方法,例如解决方案中建议的方法。

找出 GetById() 不再是最佳解决方案的表中记录的确切数量会很有帮助。此数字可能因对象中数据的大小而异。它可能是可计算的,但目前没有方程式,因此需要根据具体情况计算。

如果其他人有关于此主题的额外信息,请将其添加到讨论中。

关于sql - 为什么 DNN 中 DAL2 存储库的默认 GetById() 执行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com