我如何才能大大提高性能在加载多个相互关联的东西从数据库

本文关键字:关联 数据库 加载 高性能 | 更新日期: 2023-09-27 18:14:42

所以,我认为一定有更好的方法来做我正在做的事情…

我目前有一个类,称为"英雄"。它包含19个属性(当然,可能会有变化)。它代表了我拥有的信息的数据库表。

然后,我有另一个数据库表,用于评论这些英雄。每个英雄中都有一个属性是ObservableCollection,而comment只包含几个基本属性。

我计划在未来,因为我建立了这个有其他相关的表附件也。

在ViewModel中,我有一个ObservableCollection,我用我的SQLite DB中的每个英雄初始化。

程序启动时,执行以下操作:

首先,我查询Heroes Table,并将所有英雄提取到VM中的ObservableCollection中。例子:

DataTable dt = db.GetDataTable("SELECT * FROM Heroes");
foreach (DataRow Row in dt.Rows)
{
    Heroes.Add(new Hero(
        HID: Convert.ToInt32(Row["ID"]),
        HName: Row["Name"].ToString(),
        ETC.....
        ));
}

然后,我对Heroes_Comments表做了完全相同的操作——我从那里取出所有内容,并将其存储在ObservableCollection中。和上面一样,唯一的查询是"SELECT * FROM Heroes_Comments",不同的字段使用ETC ofc.

最后,我对ObservableCollection中的每个注释运行foreach,并将其添加到Hero Collection中。所以:

foreach (Comment c in HeroesDBComments)
{
    HeroesDBHeroes.Single(h => h.ID == c.Foreign).Comments.Add(c);
}

这一切都工作,并做它的工作等…然而,没有那么多的测试数据,它似乎需要一个公平的时间来做每件事,我觉得,当我添加更多的东西,这将完全陷入困境,毫无价值。

我能做些什么来改善这一点?我宁愿现在就得到它,也不愿以后改进和修复它。:)

(供参考-测试数据目前大约有10个英雄和5条评论,所有5条评论都是针对同一个英雄的。)每个英雄都有2张图像存储为BLOB…所以这不是最小的数据量,但我觉得好像在评论的foreach是坏的,当它涉及到添加更多的链接表和做同样的那些…我只是不知道更好的?)

思考:是否ObservableCollections更慢,也许有更好的选择?

我如何才能大大提高性能在加载多个相互关联的东西从数据库

光是网络往返就消耗了很多周期——比你意识到的要多得多。

我想说不要害怕SQL连接。如果您编写一个SQL查询,在一次调用中提取所有数据,那么您几乎肯定会获得更好的总体性能。按"英雄"排序,然后按评论表中重要的内容排序。当你遍历结果集时,只需检查Hero id的变化,这样你就知道上下文什么时候发生了变化。是的,您将提取一些冗余数据,但总体性能可能会大幅提高。

是否使用连接池?您是在同一个连接上进行所有这些调用,还是每次都启动一个新连接?

对于select * from ...查询,也有可能(很可能)您提取的数据比您正在使用的数据多,并且您从向数据库发出多个请求中获得的任何效率都超过了拉出比您需要的更多列的开销一次又一次地重新连接。

或者,拉出英雄,只拉出id值,然后在另一个调用中拉出所有英雄的所有注释。使用多线程,这样您就可以在提取注释数据的同时开始填充数据结构。