Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Int与字节性能&;sqlint与二进制性能_C#_Sql - Fatal编程技术网

C#Int与字节性能&;sqlint与二进制性能

C#Int与字节性能&;sqlint与二进制性能,c#,sql,C#,Sql,在C#windows应用程序中,我处理十六进制字符串。单个十六进制字符串将有5-30个十六进制部分 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值添加到数据库中。当我从数据库中提取这些值时,我将它们提取为int,然后将它们转换回十六进制字符串 将这些字符串转换为字节,然

在C#windows应用程序中,我处理十六进制字符串。单个十六进制字符串将有5-30个十六进制部分

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值添加到数据库中。当我从数据库中提取这些值时,我将它们提取为int,然后将它们转换回十六进制字符串

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

编辑:


5-30个六角零件对应于特定表格,其中所有零件与单个零件构成一个记录。例如,如果我有5个十六进制值,它们对应于1条记录的5个独立列

编辑:

澄清(对不起):

我有9张桌子。每个表都有一组列

表1:30

表2:18

表3:18

表4:18

表5:18

表6:13

表7:27

表8:5

表9:11

每个表中的每一列都对应一个特定的十六进制值

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


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

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

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

    <> LI>如果输入数据不是4字节的倍数,则必须考虑填充。
  • 在使用流读取和写入数据方面,这是一个痛苦的工作
  • 目前还不清楚如何在数据库中存储整数,但如果您只是尝试存储整个数据,我希望blob更有效

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

是的,到目前为止。插入许多行远比插入几个较大的行糟糕。

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

一些考虑:

  • 如果您需要查找某个特定的“十六进制部分”,即使不在“十六进制字符串”的开头,那么每个“十六进制部分”都需要位于单独的行中,以便数据库索引可以将其提取出来
  • 根据您的DBMS/API,通过BLOB或字节数组查找可能并不容易。这对于加载非前缀“十六进制部分”或在“十六进制字符串”中间进行修改可能是重要的。
  • 如果“十六进制字符串”需要是主键、唯一键或外键,或者需要通过前缀进行搜索,那么您通常需要一种实际可索引的数据库类型(BLOB通常不可索引,但大多数DBMS都有可索引的小字节数组的替代类型)

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

@Mausimo:那么为什么您没有一个包含5列的表呢?如果这些列都有不同的含义,那就更有意义了。现在还不清楚到底发生了什么。你的数据模型似乎不正确。每个“十六进制部分”是否有精确的含义(它总是指特定的表和特定的列),或者它可以在表/列之间“游移”?我只是想确定是否有一个更深层次的问题需要首先解决。@BrankoDimitrijevic请检查我的编辑,我澄清了我的数据模型。“5-30个六角零件对应于特定表格,其中所有零件与单个零件构成一个记录。例如,如果我有5个十六进制值,它们对应于1条记录的5个独立列。“这似乎并不有效。你是否研究过更有效的方法来存储数据?我假设5-30表示5到30个不同的十六进制”部分“@Ramhound是的,它意味着5-30个不同的六角部件。必须是这样,因为数据和它对应的内容,我实际上研究了很多数据库结构,但必须是这样。感谢您的回复/@Mausimo,问题是您是否希望在数据库级别转换为字节数组(如果需要,您始终可以在应用程序级别进行转换)?我仍然不清楚“十六进制部分”是否对这些其他表起外键的作用,但如果它们起作用,则必须将它们存储在单独的列中——否则DBMS将无法强制执行引用完整性。你会有很多列(30+18+…+11),但如果这是野兽的本性,那就这样吧。在
表1
(等)中是否确实需要30列是另一个问题。。。