我不得不在.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语句的性能?
谢谢
答案 0 :(得分:1)
如果没有表上的索引,SELECT ID FROM...
可能会减慢速度,因为SQL Server必须逐个查看每个记录并比较WHERE
子句中的ID。通过添加包含三个ID的索引,当WHERE
子句指定三个ID时,SQL Server将能够(或多或少)立即找到现有记录。
假设您使用的是SQL Server Management Studio: -
索引不必是唯一的。在“索引/键”对话框中,您可以选择指定它是否应该是唯一的。
我建议检查的唯一另一件事就是执行IF NOT EXISTS...
SQL的C#/ VB代码 - 确保每次都不打开和关闭连接。那将真的减慢了事情!