0

我必须在 .NET 中创建一个自定义工具来迁移数据并清理现有系统。它还做一些其他的事情。

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

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

所以我必须遍历应用程序中创建的所有这些对象,并执行插入语句。问题是,性能很糟糕。完成插入需要 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 

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

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

谢谢

4

1 回答 1

1

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

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

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

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

我可以建议检查的唯一另一件事是在执行IF NOT EXISTS...SQL 的 C#/VB 代码中 - 确保您不是每次都打开和关闭连接。这真的会减慢速度!

于 2013-02-06T12:49:27.600 回答