【问题标题】:What is the fastest way to pass a large amount of data from a C++ application to SQLServer Stored Procedure?将大量数据从 C++ 应用程序传递到 SQLServer 存储过程的最快方法是什么?
【发布时间】:2017-12-06 20:10:35
【问题描述】:

我试图以最有效的方式将一千行从 c++ 应用程序中的 xml 对象传递到 sqlserver 存储过程。在将 xml 元素插入数据库之前,需要对其进行一些字符串处理/转换。目前,我们正在获取 C++ 应用程序中的每个单独的 xml 节点,然后调用 sqlserver 将其插入(并且这样做一千次)。为了改善这一点,我想同时将所有 1000 条记录发送到 sqlserver。最快的方法是什么?

另外,我已经看到我可以将 xml 直接发送到存储过程,但这需要我在将数据插入数据库之前对数据进行大量处理。在 C++ 应用程序中处理字符串然后通过 xml 发送或在未处理的 xml 中将其发送到 SQLServer 然后处理/转换字符串是否更有效,还是有另一种方法来完全传递数据?

【问题讨论】:

  • 我还应该说,由于这个过程可以同时调用 100,000 次,因此需要稍微提高性能。
  • 在插入过程中使用 BULK INSERT 或使用表值参数。
  • 那么将C++端的xml转换成表值参数然后传递过来,比在sqlserver端进行xml解析和字符串处理要快吗?
  • 不可能肯定地说明这一点,因为我不知道您的数据是什么或需要进行多少处理,但 sql server 不太擅长字符串操作。如果在 sql 中执行速度更快,我会感到惊讶。但绝对最好的了解方法是构建它并尝试两种方式。
  • 在 C++ 中使用表值对有什么好的例子吗?

标签: c++ sql-server xml performance stored-procedures


【解决方案1】:

设置一个表值参数,每个参数集一行。然后使用该参数的行来调用存储过程。即使您要将行作为批处理提交给存储过程,每一行都将是与服务器的单独通信,但如果您作为 TVP 执行此操作,驱动程序可以将其捆绑到单个往返行程中(也就是说,所有数据将被发送,然后服务器将开始处理,而不是发送一个参数集并返回该参数集的结果。

我不了解 XML 处理,这很可能取决于所需操作的性质,这部分听起来像是分析工作。

基本上是这样的:

CREATE TYPE ARGS_TABLE TABLE (ID BIGINT, DATA XML);

CREATE PROCEDURE WRAPPER_PROC
@Args ARGS_TABLE READONLY
AS
BEGIN
DECLARE @ID BIGINT, @Data XML
DECLARE ArgCurs CURSOR FOR SELECT ID, DATA FROM @Args;
OPEN ArgsCurs ;
FETCH NEXT FROM ArgsCurs INTO @ID, @Data
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.REAL_PROC @ID, @Data
FETCH NEXT FROM ArgsCurs INTO @ID, @Data
END
CLOSE ArgsCurs 
    DEALLOCATE ArgsCurs 
END

【讨论】:

  • 这很好,只是光标很烂。使您的过程接收一个表值参数并将插入作为单个插入语句进行。在游标中执行此操作对于 OP 正在谈论的数据量来说将是可怕的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多