我正在開發一個使用SQL Server Compact Edition數據庫和實體框架的WPF應用程序,但我得到的性能確實非常低,無法更新和刪除。所以我創建了一個簡單的Foobar
控制檯應用程序(下圖),並得到了同樣的問題。使用Entity Framework 4.3和SQL Server Compact Edition 3.5進行緩慢更新
我知道Entity Framework會創建一些開銷,並且SQL Server Compact Edition比常規SQL Server慢。但INSERT
和UPDATE/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? True,Time:00:00:04:0700057
- Count Foobars:10000
- 更新Foobars?真,時間:00:00:59:8800838
- 計數Foobars:10000
- 已刪除Foobars?的確,時間:00:00:57:8000810
- 計數Foobars:0
數據庫測試
- 惰性加載=假
- 禁用身份。
從來沒有找到任何解決這個問題的辦法,我改用SQL Express代替。 – 2012-04-11 13:45:47