Медленные обновления с Entity Framework 4.3 и SQL Server Compact Edition 3.5 - PullRequest
1 голос
/ 14 марта 2012

Я занимаюсь разработкой приложения WPF, которое использует базу данных SQL Server Compact Edition и Entity Framework, но производительность обновлений и удалений очень низкая.Поэтому я создал простое консольное приложение Foobar (ниже) и получил ту же проблему.

Я понимаю, что Entity Framework создает некоторые накладные расходы и что SQL Server Compact Edition медленнее, чем обычный SQL Server.Но так ли велика разница между INSERT и UPDATE/DELETE?

Main

    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;
    }

Результаты (на i7 с SSD и 16 ОЗУ почти удвоилось на старом C2D)

  • Количество Foobars: 0
  • СозданоFoobars?Правда, время: 00: 00: 04: 0700057
  • Количество Foobars: 10000
  • Обновить Foobars?Правда, время: 00: 00: 59: 8800838
  • Количество Foobars: 10000
  • Удалено Foobars?True, время: 00: 00: 57: 8000810
  • Количество Foobars: 0

Проверено

  • LazyLoading = false
  • Отключение удостоверений в базе данных.

1 Ответ

0 голосов
/ 14 марта 2012

Я подозреваю, что ваша функция создания быстрее, потому что она просто создает 10000 локальных объектов и затем фиксирует их все за один шаг в базе данных, в то время как все функции удаления и обновления запрашивают один элемент из базы данных перед его изменением.

...