【发布时间】:2010-11-07 13:14:17
【问题描述】:
我在使用 MSSQL DB 的应用程序中遇到了性能问题。我有一个包含以下表格的数据库架构:
- 工作(主键:
Job ID), - Jobitem(主键:
Jobitem ID,外键:Job ID), - Job2Property(外键:
Job IDProperty ID), - Jobitem2Property(外键:
Jobitem IDProperty ID), - 属性(主键:
Property ID)。
现在,当我想删除作业时,我首先必须删除它的 Jobitems,然后是 Job2Property 引用,最后我可以删除属性和作业本身。对于 Jobitem,我还需要先删除 Jobitem2Property 引用,然后是其属性和 Jobitem 本身。
这是删除作业的方法:
public void Delete(List<Job> jobsToDelete)
{
var jobitemsToDelete = new List<Jobitem>();
// Gather references to jobitems to delete
foreach (Job job in jobsToDelete) {
List<Jobitem> jobitems =
(from ji in job.Jobitems.Values
select ji).ToList();
jobitemsToDelete.AddRange(jobitems);
}
// first the related jobitems and the properties have to be deleted
PropertyManager.Instance.Delete(jobsToDelete);
Delete(jobitemsToDelete);
dbc.Job.DeleteAllOnSubmit(jobsToDelete);
dbc.SubmitChanges();
// Remove Job from dictionary to avoid using Refresh()
foreach (Job job in jobsToDelete) {
Jobs.Remove(job.Id);
}
}
以下方法删除jobitems:
public void Delete(List<Jobitem> jobitemsToDelete)
{
PropertyManager.Instance.Delete(jobitemsToDelete);
dbc.Jobitem.DeleteAllOnSubmit(jobitemsToDelete);
dbc.SubmitChanges();
}
最后是删除属性的方法:
public void Delete(List<Job> jobsToDelete)
{
List<Property> propsToDelete = new List<Property>();
foreach (Job job in jobsToDelete) {
if (JobProperties.ContainsKey(job.Id))
propsToDelete.AddRange(JobProperties[job.Id]);
}
List<Job2Property> j2pToDelete =
(from p in propsToDelete
select p.Job2Property.First()).ToList();
dbc.Job2Property.DeleteAllOnSubmit(j2pToDelete);
dbc.Property.DeleteAllOnSubmit(propsToDelete);
dbc.SubmitChanges();
}
删除jobitem属性的方法看起来完全一样,只是它以List<Jobitem>作为参数。
现在删除的性能真的很差。对于单个作业,大约需要 3 秒。当我删除 10 行时,需要 13 到 14 秒。在我拥有 Property 和 XYZ2Property 表之前,它只需要不到一秒钟的时间。
如何优化这个速度? 使用 ProfileSharp 分析应用程序我得出的结论是,删除函数占用了应用程序总处理时间的大约 17%(即 9405781250 个时间单位),而在最后一种删除属性的方法似乎占用了大部分时间(它说 1475%,但这似乎是 ProfileSharp 的一个错误。相反,我猜它占用了这 17% 的大部分)。
Here's a picture of the profile.
我能做点什么吗?
【问题讨论】:
标签: c# sql-server performance optimization linq-to-sql