【发布时间】:2017-05-26 14:35:42
【问题描述】:
是否可以通过将 50 个 float 列替换为单个 binary(n)(n 为 50 x 4)来提高 SQL Server 2008 R2(和更新版本)插入性能?
我会假设使用固定大小的binary(n) 应该会提高性能(数据量相同,处理所有列所需的工作更少,SQL 查询更短),但许多网站建议不要使用binary 列,所以我想看看使用它是否真的有问题?
另外,问题是表相当非规范化,并且通常并非所有列都填充有值,因此varbinary(n) 可以让我在许多情况下减小行大小。有时只填充一列,但平均约 10 个。
然后第三个问题是,如何更进一步,用单个 varbinary(5*50*4) 替换(比如说)5 行 x 50 float32 列?
因此,获得一些见解会很酷:
- 将 1 行 50 个
float列替换为单个binary(200); - 将 1 行 50 x
float替换为单个varbinary(204)(标志/长度信息的几个字节) - 以在未使用列时节省空间; - 将 5 行 50 x
float替换为单个varbinary(1024)(标志/长度信息的几个字节)。
在所有情况下总是一次读取整行。
(更新)
为了澄清,存储的数据是:
Timestamp_rounded Value_0ms Value_20ms Value_40ms ... Value_980ms
2016-01-10 10:00:00 10.0 11.1 10.5 ... 10.5
我总是读取整行,主聚集键是第一列(时间戳),我永远不必通过任何其他列查询表。
标准化数据显然会有一个Timestamp/Value 对,其中Timestamp 将具有毫秒精度。但是我将不得不存储 50 行的两列,而不是 1 行 (Timestamp + BLOB)。
【问题讨论】:
-
在一个字段中存储多个值几乎总是错误的决定。
-
稍后你想用这个做什么?你想如何阅读/操作这个 I'm-a-multi-value-binary-something?
-
这些浮点数是一秒钟内的测量值,我总是一次存储和读取它们。因此,如果这会提高插入性能,我的应用程序可以轻松地序列化/反序列化这些列。而我只是希望能够尽快存储
-
@Lousy,如果您永远不需要在 SQL 中读取这些值(嘿,让我们从数据库中创建一个简洁的报告!哦,等等.. .) 你可以存储一个二进制流。这在 SQL-Server 中没有任何意义,但您可能会赢得几毫秒。我不会这样做...
-
我尝试使用 SqlBulkCopy,有 50 列 vs 1 varbinary 列。在我的测试中,与 50 列相比,varbinary 版本非常快。 50Cols 版本在 30 秒内成功插入了 36000 行,二进制版本插入了 160 万行。你可以在这里使用我的测试代码github.com/PeterHenell/binaryBulkInsertComparison 进行尝试。话虽如此,我认为我的代码中有一些东西对 50Cols 版本的惩罚远远超过了单 col 版本,因此更好的测试代码版本将提供更准确的结果。
标签: sql-server performance blob denormalization varbinary