高效的插入语句

时间:2012-10-17 16:28:15

标签: c# sql sql-server

我正在寻找一种有效的方法将记录插入到我的C#/ MVC应用程序的SQL服务器中。谁知道最好的方法是什么?

通常我刚刚完成了一个while循环并插入语句,但是我再也没有那么多记录要处理。我需要插入大约50万个,并且在while循环中每分钟300行,我会整天都在这里!

我正在做的是循环一个大的保持表,并使用它的行在另一个表中创建记录。我为查询数据设置了一些新表所需的函数,这无疑增加了耗尽。

所以这是我的查询。对于大量数据来说效率非常低!

Declare @HoldingID int
Set @HoldingID = (Select min(HoldingID) From HoldingTable)

While @JourneyHoldingID IS NOT NULL
Begin
    Insert Into Journeys (DepartureID, ArrivalID, ProviderID, JourneyNumber, Active)
    Select 
        dbo.GetHubIDFromName(StartHubName), 
        dbo.GetHubIDFromName(EndHubName), 
        dbo.GetBusIDFromName(CompanyName), 
        JourneyNo, 1
    From Holding
    Where HoldingID = @HoldingID

    Set @HoldingID = (Select MIN(HoldingID) From Holding Where HoldingID > @HoldingID)
End

我听说过基于集合的方法 - 有什么可能对上述问题有用吗?

4 个答案:

答案 0 :(得分:5)

如果要将大量数据插入到MSSQL Server中,则应使用BULK INSERTs - 有一个名为bcp utility的命令行工具,以及用于执行{的C#包装器{3}},但在幕后他们都使用BULK INSERT

根据您的应用程序,您可能希望先将数据插入临时表,然后Bulk Copy OperationsINSERT INTO SELECT...将这些行从登台表传输到目标表( s) - 如果你有大量的数据,那么这将需要一些时间,但是比单独执行插入更快批次

如果你想加快速度,那么MERGEvarious things that you can do,例如更改恢复模型或调整/删除触发器和索引(取决于这是否是实时数据库)。如果它仍然非常慢,那么你应该分批研究这个过程(例如每次1000行)。

答案 1 :(得分:3)

这应该就是你现在正在做的事情。

Insert Into Journeys(DepartureID, ArrivalID, ProviderID, JourneyNumber, Active)
Select 
    dbo.GetHubIDFromName(StartHubName), 
    dbo.GetHubIDFromName(EndHubName), 
    dbo.GetBusIDFromName(CompanyName), 
    JourneyNo, 1
From Holding
ORDER BY HoldingID ASC

答案 2 :(得分:1)

你(可能)能够在表格

的一个陈述中做到这一点
INSERT INTO JOURNEYS
SELECT * FROM HOLDING;

如果没有关于您的架构的更多信息,很难绝对确定。

答案 3 :(得分:0)

SQLServer 2008引入了表参数。这些允许您在数据库的单次行程中插入多行(将其作为大型blob发送)。不使用临时表。本文介绍了它的工作原理(文章中的第四步)

http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

它与批量插入不同之处在于您不需要特殊实用程序,并且检查了所有约束和外键。

我使用这个并使插入并行化使我的吞吐量增加了四倍。现在在同一个表中持续存在15.000次/秒。包含索引和超过十亿行的常规表。