来自app的大插入 - 性能

时间:2013-02-06 11:29:25

标签: sql-server

我不得不在.NET中创建一个自定义工具来进行数据迁移和清理现有系统。它还做了其他一些事情。

我实际上有一个大约有2000个用户的表,然后对于每个用户,他们可以拥有0到9,000个“客户帐户”的任何内容

然后,对于这些用户及其帐户中的每一个,他们都需要将菜单系统插入到该用户和帐户的另一个表中。

所以我必须浏览应用程序中创建的所有这些对象,并执行insert语句。问题是,表现太可怕了。完成插入需要3.5小时,每次插入需要大约3秒才能完成....非常慢!

使用插入,我确保我不插入重复数据/确保没有任何现有的重复数据,因此我的插入语句:

 IF NOT EXISTS (SELECT ID FROM UserWebAccessLevel WHERE UserID = '{0}' AND CustomerID = '{1}' AND MenuID = {2}) BEGIN INSERT INTO [WebAccessLevel] (UserID, CustomerID, MenuID) VALUES ('{0}', '{1}', {2}) END 

为每个用户,他们的客户以及app逻辑中找到的每个菜单项执行此操作....是的,需要很长时间。

我想知道如何更好地提高insert语句的性能?

谢谢

1 个答案:

答案 0 :(得分:1)

如果没有表上的索引,SELECT ID FROM...可能会减慢速度,因为SQL Server必须逐个查看每个记录并比较WHERE子句中的ID。通过添加包含三个ID的索引,当WHERE子句指定三个ID时,SQL Server将能够(或多或少)立即找到现有记录。

假设您使用的是SQL Server Management Studio: -

  • 右键单击该表,然后单击“设计”。
  • 右键单击列表列表的位置,然后单击“索引/键”。
  • 在出现的下一个对话框中,单击“添加”按钮
  • 在r.h上的属性列表中。找到一个名为“Columns”的,然后单击它右侧的框。当您看到省略号按钮(“...”)时,请单击该按钮。
  • 在出现的下一个对话框中,添加三个ID列。

索引不必是唯一的。在“索引/键”对话框中,您可以选择指定它是否应该是唯一的。

我建议检查的唯一另一件事就是执行IF NOT EXISTS... SQL的C#/ VB代码 - 确保每次都不打开和关闭连接。那将真的减慢了事情!