【问题标题】:Store big arrays (Lists) of data in XML format into SQL server 2016将 XML 格式的大数据数组(列表)存储到 SQL Server 2016 中
【发布时间】:2018-04-29 19:16:35
【问题描述】:

我需要保存 C# 中生成的多个测量结果。
结果是不同类型数据的大列表:

List<double, double> [20000 records]
List<string, double, double> [20000 records]
List<int, double, double> [20000 records]

我的第一个想法是将这些列表以 XML 格式存储到一个表(xml 字段)中。 因此,对于每个 List,我都会生成一个 XML 文件并将其插入到表中。

<MeasurementList>
  <item>
    <left_measurement>0.1264</left_measurement>
    <right_measurement>6.500</right_measurement>
  </item>
  <item>
    <left_measurement>0.2314</left_measurement>
    <right_measurement>6.968</right_measurement>
  </item>
  <item>
    <left_measurement>0.2365</left_measurement>
    <right_measurement>7.598</right_measurement>
  </item>
  ...
</MeasurementList> 

这每天会发生 3000 次,所以我每天需要 9000 条记录。

我知道磁盘空间是个问题,但我主要关心的是:
这是最好的方法还是有其他解决方案

【问题讨论】:

  • 您可以尝试将数据保存为Json 而不是XML。您可以节省大量磁盘空间。
  • 您是否有理由不将这些值存储在物理表中,并在需要时从T-SQL 创建 XML。 XML - 一般说来 - 并不意味着存储大量数据......
  • 我认为因为表格的大小会很大。在我的示例中,我每天有 20.000 个结果 x 3 个列表 = 60.000 行 x 3000,我每天将获得 1.8 亿行!!!
  • @sarslan 我从没想过 json...

标签: c# sql xml sql-server-2016


【解决方案1】:

由于您自己的答案被删除为 only-link-answer 我将把我的 cmets 作为答案(并在上面删除它们)。

将数百万个值填充到数百万行中所需的空间仍然少于存储相同数量的数据,这些数据嵌套在大约四倍于纯数据所需的字符中。

至少我会使用&lt;lm&gt; 而不是&lt;left_measurement&gt;。 (字符)空间中最短的是

<L v="0.2314"/><R v="6.968"/>
or 
<L>0.2314</L><R>6.968</R>
or 
<v l="0.2314" r="6.968">

最后一个选项将反映您的List&lt;double, double&gt; [20000 records] 最佳...

主要问题是:几天后你打算怎么处理这个?您可以以某种方式存储数百万个值,但您是否需要再次读取它们?如果不是:为什么要存储它?如果是(这就是我的假设):不要把它放在基于字符串的容器中!你会遇到严重的性能问题...

关于性能和磁盘空间:

  • FLOAT 将占用 4 个字节,而 0.2314 占用 6 个字符(NVARCHAR! 中的 12 个字节!)并且元数据不需要额外空间!
  • SQL Server 会将 XML 存储为带有 NVARCHAR 字符串的隐藏层次表(每个字符 2 个字节!)
  • JSON 仍然存储为您看到的字符串(如果 纯拉丁文,您可以使用 VARCHAR,每个字符 1 个字节)。
  • XML 在查询中比 JSON 快得多(不需要结构解析)...
  • (XML 和 JSON)都基于字符串存储它们的值。任何读取这些值的尝试都需要进行类型转换(“0.1234”不是一个数字,而是一个字符串,看起来像一个数字!)这对于几个值来说并不是很昂贵,但这会破坏你的系统数十亿数据...

你可能会读到When can I save JSON or XML data in an SQL Table

【讨论】:

  • 数据数组仅用于存档。我不需要一直查询它们。我将进行一些测试并考虑您的指导方针!
猜你喜欢
  • 2020-11-18
  • 2021-06-28
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多