【问题标题】:Run the application faster with Run Query at Start使用 Run Query at Start 更快地运行应用程序
【发布时间】:2018-12-18 23:28:31
【问题描述】:

当应用程序运行时,会运行多个查询。

现在,由于信息量增加(500 KB SQLite 数据库大小),程序运行延迟 5 秒。我应该怎么做才能更快地运行应用程序?

这是我写的代码:

public void getInitialData()
{
    try
    {
        using (var db = new DataClass.myDbContext())
        {
            var query = db.Schools.ToList();
            txtScCount.Text = query.Count().ToString();
            var query2 = db.Users.ToList();
            txtUCount.Text = query2.Count().ToString();
            var query3 = db.Students.ToList();
            txtStCount.Text = query3.Count().ToString();
        }
    }
    catch (Exception)
    {
    }
}

private void getSchool()
{
    try
    {
        using (var db = new DataClass.myDbContext())
        {
            var query = db.Schools.Select(x => x);
            if (query.Any())
            {
                cmbEditBase.ItemsSource = query.ToList();
            }
        }
    }
    catch (Exception)
    {
    }
}

private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    getInitialData();
    getSchool();
    cmbEditBase.SelectedIndex = Convert.ToInt32(FindElement.Settings.DefaultSchool);
    getTopStudent(Convert.ToInt64(cmbEditBase.SelectedValue));

    try
    {
        using (var db = new DataClass.myDbContext())
        {
            long baseId = Convert.ToInt64(cmbEditBase.SelectedValue);
            var query = db.Scores.Join(
               db.Students,
               c => c.StudentId,
               v => v.Id,
               (c, v) => new DataClass.DataTransferObjects.StudentsScoresDto { Id = c.Id, BaseId = v.BaseId, StudentId = v.Id, Name = v.Name, LName = v.LName, FName = v.FName, Scores = c.Scores }
           ).Where(y => y.BaseId == baseId).ToList();
    }
}

【问题讨论】:

  • 您可以/应该异步填充模型,如下所述:stackoverflow.com/questions/38076147/…
  • 500KB 对于当今最慢的计算机或 SQLite 来说,什么都不是。 db 可以很容易地完全放入内存中,并且将其加载到您的程序中非常快。此时延迟不太可能来自数据库。

标签: c# performance entity-framework async-await


【解决方案1】:

不要将整个表加载到内存中:

var query = db.Schools.ToList();
txtScCount.Text = query.Count().ToString();

如果您只需要记录数,那么只需获取记录数:

txtScCount.Text = db.Schools.Count().ToString();

让 Entity Framework 帮助您针对数据库引擎优化数据查询。数据库引擎在优化查询执行路径方面非常好。不要只是将整个数据库加载到内存数组中并尝试优化自己。

除此之外,您显示的代码实际上没有任何繁重的操作。确保您具体确认您的实际瓶颈是什么/在哪里。我不敢假设它来自区区 500KB 的数据。在海量数据的规模上,500KB的数据和没有数据是分不开的。


旁注:您可能不应该这样做:

catch (Exception)
{
}

这告诉代码是“如果有任何错误,我不想知道它。”因此,如果您发现自己试图追踪一个错误或奇怪的错误,请记住您明确告诉代码不要告诉您是否有任何问题:)

至少,将异常捕获到变量中并将其记录在某个地方。或者根本不捕获异常,让它在堆栈中冒泡到可以有意义地捕获和处理它的其他东西。

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多