【问题标题】:C# Int vs Byte performance & SQL Int vs Binary performanceC# Int vs Byte 性能 & SQL Int vs Binary 性能
【发布时间】:2012-03-17 05:14:00
【问题描述】:

在 C# windows 应用程序中,我处理 HEX 字符串。一个 HEX 字符串将有 5-30 个 HEX 部分。

07 82 51 2A F1 C9 63 69 17 C1 1B BA C7 7A 18 20 20 8A 95 7A 54 5A E0 2E D4 3D 29

目前我使用 Convert.ToInt32(string, 16) 将这个字符串解析为 N 个整数。然后我将这些 int 值添加到数据库中。当我从数据库中提取这些值时,我将它们提取为 Ints,然后将它们转换回 HEX 字符串。

将这些字符串转换为字节,然后将它们作为二进制数据类型添加到数据库中会更好吗?

编辑:

5-30 个 HEX 部分对应于特定表,其中所有部分与单个部分组成 1 条记录。例如,如果我有 5 个 HEX 值,它们对应于 1 条记录的 5 个单独的列。

编辑:

澄清(对不起):

我有 9 张桌子。每个表都有一定数量的列。

table1:30

table2:18

table3:18

table4:18

table5:18

table6:13

table7:27

table8:5

table9:11

每个表中的每一列都对应一个特定的 HEX 值。

例如,我的应用将收到一个包含 13 个 HEX 组件的“有效负载”,采用单个字符串格式:07 82 51 2A F1 C9 63 69 17 C1 1B BA C7。目前我使用这个字符串并解析各个 HEX 组件并将它们转换为整数,将它们存储在一个 int 数组中。然后我将这些 int 值存储在数据库中相应的表和列中。当我读取这些值时,我将它们作为整数获取,然后将它们转换为 HEX 字符串。

我想知道是否应该将 HEX 字符串转换为字节数组并将字节存储为 SQL 二进制变量类型。

【问题讨论】:

  • 您的数据模型似乎关闭了。每个“十六进制部分”是否具有精确的含义(它始终指代特定的表和特定的列),或者它可以在表/列之间“游走”?我只是想确定是否有更深层次的问题需要先解决。
  • @BrankoDimitrijevic 请检查我的编辑,我澄清了我的数据模型。
  • "5-30 个 HEX 部分对应于特定表,其中所有部分与单个部分组成 1 条记录。例如,如果我有 5 个 HEX 值,它们对应于 1 条记录的 5 个单独列。”这似乎没有效果。您是否研究过更有效的数据存储方式?我假设 5-30 表示 5 到 30 个不同的十六进制“部分”。
  • @Ramhound 是的,这意味着 5-30 个不同的十六进制部分。一定是这样,因为数据和对应的关系,我其实对数据库结构研究了很多,但一定是这样。谢谢回复/
  • @Mausimo 问题是您是否甚至想在数据库级别转换为字节数组(如果需要,您总是可以在应用程序级别进行)?我仍然不清楚“十六进制部分”是否对这些其他表表现为外键,但 如果它们这样做,您必须将它们存储在单独的列中 - 否则 DBMS 将无法执行参照完整性。你会有很多列(30 + 18 + ... + 11),但如果这是野兽的本性,那就这样吧。 table1(等等)中是否真的需要 30 列是一个不同的问题......

标签: c# sql


【解决方案1】:

就性能而言,您当然应该测试两种方式。

但是,就可读性而言,如果这只是任意数据,我当然建议使用字节数组。如果它 实际上 意味着表示整数序列,那很好 - 但为什么要使用 4 字节整数的集合来表示任意字节数组呢?它不适合其他任何东西:

  • 如果输入数据不是 4 字节的倍数,则必须考虑填充
  • 使用流读取和写入数据很痛苦
  • 目前尚不清楚您是如何在数据库中存储整数的,但如果您只是尝试存储整个数据,我预计 blob 会更高效

我建议以更自然的方式编写代码,让您的数据接近它真正试图表示的东西,然后测量性能。如果它足够好,那么你就不需要再看下去了。如果不是,您将有一个很好的调整基础。

【讨论】:

  • @Mausimo:那你为什么没有一个 5 列的表格呢?如果这些列都有不同的含义,那就更有意义了。目前还不清楚发生了什么。
【解决方案2】:

是的,到目前为止。插入多行比插入几行大得多。

【讨论】:

    【解决方案3】:

    数据模型通常不仅取决于您希望如何写入,还取决于您希望如何查找和读取数据。

    一些注意事项:

    • 如果您需要找到一个特定的“HEX 部分”,即使不在“HEX 字符串”的开头,那么每个“HEX 部分”都需要在一个单独的行,以便数据库索引可以提取它。
    • 根据您的 DBMS/API,通过 BLOB 或字节数组查找可能并不容易。这对于加载非前缀“HEX 部分”或在“HEX 字符串”中间执行修改可能很重要。
    • 如果“HEX 字符串”需要是 PRIMARY、UNIQUE 或 FOREIGN KEY,或者需要通过前缀进行搜索,那么您通常需要一个实际可索引的数据库类型(BLOB 通常不是,但大多数DBMS 为较小的字节数组提供了替代类型,)。

    总而言之,字节数组可能是您需要的,但请注意上述注意事项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2020-10-11
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多