Sql server 应用程序的大插入-性能

Sql server 应用程序的大插入-性能,sql-server,Sql Server,我必须在.NET中创建一个自定义工具来迁移和清理现有系统中的数据。它还做其他一些事情 我有一个大约2000个用户的表格,每个用户可以有0到9000个客户帐户 然后,对于这些用户及其帐户中的每一个,他们都需要将一个菜单系统插入到该用户及其帐户的另一个表中 因此,我必须检查应用程序中创建的所有对象,并执行insert语句。问题是,性能太差了。完成插入需要3.5个小时,每次插入大约需要3秒钟。。。。相当慢 通过插入,我确保不插入重复数据/确保没有任何现有重复数据,因此我的插入声明: IF NOT E

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

我有一个大约2000个用户的表格,每个用户可以有0到9000个客户帐户

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

因此,我必须检查应用程序中创建的所有对象,并执行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 
为每个用户、客户和应用程序逻辑中的每个菜单项执行此操作。。。。是的,需要很长时间

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


谢谢

如果您的表上没有索引,请从中选择ID。。。可能会减慢速度,因为SQL Server必须逐个查看每条记录并比较WHERE子句中的ID。通过添加包含这三个ID的索引,当WHERE子句指定这三个ID时,SQLServer将能够或多或少地立即定位现有记录

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

在表格上单击鼠标右键,然后单击“设计”。 在显示列列表的位置单击鼠标右键,然后单击“索引/键”。 在出现的下一个对话框中,单击“添加”按钮 在r.h.侧的属性列表中,找到名为Columns的属性,然后单击其右侧的框。当您看到椭圆按钮时。。。点击那个。 在出现的下一个对话框中,添加三个ID列。 索引不必是唯一的。在“索引/键”对话框中,您可以选择指定它是否应唯一


我唯一建议检查的另一件事是在执行IF NOT EXISTS的C/VB代码中。。。SQL-确保每次都没有打开和关闭连接。那真的会让事情慢下来

这三列UserID、CustomerID、MenuID构成主键,还是表中有包含这三列的索引?因此,表UserWebAccessLevel有一个主键-ID。表中没有应用idx。如果需要,如何创建idx?。此外,您可以说,组合的3列是唯一的无重复事实-我不是每次都打开/关闭连接。;-谢谢你的回复,+1,我会查出来让你知道。问题:我是否仍应在检查该记录是否存在时执行我正在执行的操作,如果不存在,则插入但添加索引?