sql server - 尽可能高效地处理值组

时间:2018-03-10 11:45:27

标签: sql sql-server

我有一个服务器应用程序(使用Qt编写的c ++,客户端相同),提供6种不同类型的clinets(通过TCP / IP),这些客户端使用一个数据库(sql server)。 客户端可以要求服务器使用XML执行某些查询。 我无法在一个查询中发送多个语句。

我遇到了问题

目标是:

  • 从csv文件加载数据(约8000多条记录); (需要67毫秒)
  • 如果他们可以通过一些评估,
  • 在数据库中检查它们(在大约4个表中);
  • 如果通过评估,则将它们插入某个表中;
  • 向客户发送处理结果。

我的解决方案是读取整个值集并将其传递给db进行处理然后收到结果。

由于我不是sql server性能的专家,以及他可用的全套工具,我很乐意征求你的意见。

如何更有效地在sql server中完成?

  1. 将解析后的值作为字符串传递给sql server procedure
  2.   

    "(' v11',' v12',' v13',...,' v17'),. ..,(' vn1',' vn2',' vn3',...,' vn7')"

    1. 或将它们插入一个表中,以便使用游标或任何其他可用方法通过该程序进行处理。
    2. 如果是1-st解决方案,那么:

      • 如何迭代(高效)?
      • 是否可以将它们作为一种不同的类型传递(可以加快这个过程)?

      我不知道哪个最好,因为我不是数据库方面的专家。我大约90%使用c ++而不是sql。

      我正在寻找最佳解决方案。

1 个答案:

答案 0 :(得分:0)

无论谁有兴趣进行优化,我都想出了下一个解决方案,它让我的执行时间不到1秒(我使用套装approch,我已经在22000多条记录上测试了它,它花了超过1秒的时间) ,使用我们的数据库"特别清单"我们的生产数据库提出了1小时的预期增长。

  • 我必须处理8000多条记录。
  • 评估4个表格中的每条记录。
  • 如果记录通过评估,则将记录插入目标表。

请考虑我在制作此类approch时所遇到的问题:

  1. 尽可能使用sets approch(避免光标)。
  2. 将所有数据插入一个缓冲表dbo.buff。 (每个插入中不超过1000条记录)。
  3. 创建一个可执行以下操作的过程:
    • 创建临时表以保存通过评估的记录的ID。
    • dbo.buff中的ID保存到临时表中 INSERT INTO @temp as tmp SELECT id FROM dbo.buff LEFT JOIN <tables, in which you need to evaluate your records> ON <evaluatin conditions> WHERE <tables>.id IS NOT NULL <any more conditions>
    • 避免运算符OR代码中的任何位置(如果您使用大型集合),重复INSERT查询但要在{{1之后添加条件(在我的情况下,当我添加OR时(从不到1秒到11秒),性能大幅下降。
    • 最后它确实: OR
    • 您可以返回一个整数值,以指示是否所有记录都通过了评估(进一步处理,它依赖于您)
  4. 每次必须处理这么多记录时,都要将它们插入到缓冲表中,然后调用该过程。

    此解决方案更快,然后检查每条记录。

    P.S。如果我没有在我的问题中声明所有细节,我很抱歉(我认为它非常抽象,我的目标真的取决于细节)。我不允许分享它们。