0

我正在为我的 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

4 回答 4

5

如果你想在 MSSQL Server 中插入大量数据,那么你应该使用BULK INSERTs - 为此有一个名为bcp 实用程序的命令行工具,还有一个用于执行Bulk Copy Operations的 C# 包装器,但在幕后它们是全部使用BULK INSERT.

根据您的应用程序,您可能希望首先将数据插入临时表,然后将MERGE这些INSERT INTO SELECT...行从临时表传输到目标表 - 如果您有大量数据,那么这将需要一些时间,但是会比单独执行插入快得多。

如果您想加快速度,那么您可以执行各种操作,例如更改恢复模型或调整/删除触发器和索引(取决于这是否是实时数据库)。如果它仍然很慢,那么您应该考虑分批执行此过程(例如,一次 1000 行)。

于 2012-10-17T16:32:49.927 回答
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
于 2012-10-17T17:03:01.217 回答
1

you (probably) are able to do it in one statement of the form

INSERT INTO JOURNEYS
SELECT * FROM HOLDING;

Without more information about your schema it is difficult to be absolutely sure.

于 2012-10-17T16:40:21.017 回答
0

SQLServer 2008 引入了表参数。这些允许您在一次访问数据库中插入多行(将其作为大 blob 发送)。不使用临时表。本文描述了它是如何工作的(文章中的第四步)

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

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

使用它并并行化插入,我的吞吐量增加了四倍。现在在同一个表中以 15.000 次插入/秒的速度持续。具有索引和超过十亿行的常规表。

于 2012-10-17T19:19:34.637 回答