将 SQL 服务器结果与 XML 文件进行比较的最快方法

本文关键字:比较 方法 文件 服务器 SQL 结果 XML | 更新日期: 2023-09-27 18:36:20

我们的一个客户有一个网上商店,对他们的ERP系统运行同步。由于他们的仓库同时服务于他们的网上商店和实体店,因此经常更新网上商店中每种产品的现有数量非常重要,因为他们不想在仓库中没有的网上商店中销售产品。

目前通过以下方式解决此问题:
每五分钟一个XML文件从ERP系统发布到网上商店。该文件如下所示:

<products>
  <product>
    <productID>1</productID>
    <stock>20</stock>
  </product>
  <product>
    <productID>2</productID>
    <stock>3</stock>
  </product>
</products>

XML 包含数据库中的所有数千种产品,无论产品的现有数量是否已更改。 根据ERP提供商的说法,将其减少到仅更改的产品不是一种选择,因此我们需要自行处理。

然后,网上商店处理 XML 文件,并更新数据库中所有产品的现有数量,每次更新都有一个单独的事务。您可能知道,这是不必要的缓慢和资源繁重。该数据库包含数千种产品,大多数时候,没有或很少有产品实际改变了库存数量。

所以我的想法是,最好的方法是从数据库中为所有产品选择 productID 和库存,将结果与 XML 进行比较,并且只更新数据库中的库存与 XML 文件中的库存不匹配的产品。

我的问题是将 XML 与数据库结果进行比较的最快方法是什么?将 XML 读入内存,从数据库中循环访问结果集,然后在 XML 上使用 XPath 从每个产品中获取库存值?首先将 XML 转换为字典,然后将其用于查找?

提前感谢所有帮助。

将 SQL 服务器结果与 XML 文件进行比较的最快方法

避免不必要地导入文件的一种方法是从文件生成哈希代码。在下次导入之前,再次生成哈希代码并将其与旧哈希代码进行比较,如果它们相同,则不要导入任何内容。

using(var stream = File.OpenRead("C:''temp''file.xml"))
using(var sha = new SHA1Managed())
{
    var hashCode = sha.ComputeHash(stream);
}

如果哈希不匹配,则将数据库读入字典,并在解析 XML 文件时将其与其进行比较。相应地更新数据库。您甚至可以更新字典并将其保留在(可能在静态变量中)以备下次需要导入时使用,这样您就不必一直从数据库中填充它。

为什么你认为从数据库中读取,可能接着是写入,会比直接写入更快?不要从数据库中选择 ,不需要将数据从数据库服务器传输到您的 Web 或应用程序服务器。

对于 XML 中的每个产品项,只需执行

UPDATE tablename SET stock = @stock WHERE productID = @productID AND stock <> @stock

若要提高性能,请不要为每一行启动事务,而是对它们进行批处理,例如,每个事务 10 个更新。无论如何,您不必担心可恢复性。如果发生崩溃,只需从头开始再次处理整个文件即可。

在输入端,读取 XML 的最快方法是使用 XmlReader 读取它,并在读取时执行数据库更新。在开始更新数据库之前,不要将整个 XML 读入内存。