繁体   English   中英

Entity Framework 4.3和SQL Server Compact Edition 3.5的更新缓慢

[英]Slow updates with Entity Framework 4.3 and SQL Server Compact Edition 3.5

我正在开发使用SQL Server Compact Edition数据库和Entity Framework的WPF应用程序,但是更新和删除的性能确实很慢。 因此,我创建了一个简单的Foobar控制台应用程序(如下),并遇到了同样的问题。

我知道实体框架会产生一些开销,并且SQL Server Compact Edition比常规SQL Server慢。 但是,在INSERTUPDATE/DELETE之间有这么大的区别吗?

主要

    public static void CreateFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            Foobar foobar = new Foobar();
            foobar.FoobarID = i;
            foobar.Column1 = "Column1";
            foobar.Column2 = "Column2";
            foobar.Column3 = "Column3";
            foobar.Column4 = "Column4";

            _localRepository.CreateFoobar(foobar);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Created Foobars? {0}, Time: {1}", result, timeSpan);
    }

    public static void CountFoobars()
    {
        Console.WriteLine("Count Foobars: {0}", _localRepository.GetAllFoobars().Count());
    }

    public static void UpdateFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            Foobar foobar = new Foobar();
            foobar.FoobarID = i;
            foobar.Column1 = "Column11";
            foobar.Column2 = "Column22";
            foobar.Column3 = "Column33";
            foobar.Column4 = "Column44";

            _localRepository.UpdateFoobar(foobar);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Updated Foobars? {0}, Time: {1}", result, timeSpan);
    }

    public static void DeleteFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            _localRepository.DeleteFoobar(i);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Deleted Foobars? {0}, Time: {1}", result, timeSpan);
    }

资料库

    public IQueryable<Foobar> GetAllFoobars()
    {
        return _entities.Foobars;
    }

    public Foobar GetFoobar(int foobarID)
    {
        return _entities.Foobars.ByFoobarID(foobarID).FirstOrDefault();
    }

    public bool CreateFoobar(Foobar foobar)
    {
        try
        {
            _entities.AddToFoobars(foobar);
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool UpdateFoobar(Foobar foobar)
    {
        try
        {
            Foobar f = this.GetFoobar(foobar.FoobarID);

            if (f != null)
            {

                f.Column1 = foobar.Column1;
                f.Column2 = foobar.Column2;
                f.Column3 = foobar.Column3;
                f.Column4 = foobar.Column4;

                return true;
            }
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool DeleteFoobar(int foobarID)
    {
        try
        {
            Foobar f = this.GetFoobar(foobarID);

            if (f != null)
            {
                _entities.DeleteObject(f);

                return true;
            }
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool Save()
    {
        try
        {
            this.Context.SaveChanges();

            return true;
        }
        catch (Exception e)
        {
        }

        return false;
    }

结果 (在具有SSD和16 RAM的i7上,使用旧版C2D的时间几乎翻倍)

  • Foobars伯爵:0
  • 创建了Foobars? 正确,时间:00:00:04:0700057
  • Foobars伯爵:10000
  • 更新Foobars? 正确,时间:00:00:59:8800838
  • Foobars伯爵:10000
  • 删除了Foobars? 正确,时间:00:00:57:8000810
  • Foobars伯爵:0

经过测试

  • LazyLoading =否
  • 在数据库中禁用身份。

我怀疑您的create函数会更快,因为它只是创建10000个本地对象,然后将它们全部提交到数据库中,而您的delete和update函数都会在更改之前从数据库中查询一项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM