C# SQL Server:附加VARBINARY会降低性能

C# SQL Server:附加VARBINARY会降低性能,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我使用64KB的迭代将一个文件的字节追加到一个VARBINARY字段中到一个SQL Server数据库中 但是,我认为这会将整个byte对象带回内存,追加字节,然后更新行,这会导致性能下降 用于更新VARBINARY字段的SQL语句 long milliseconds = DateTime.Now.Ticks; ExecuteSqlCommand("UPDATE dbo.table SET Item = Item + @item WHERE id = @id", new SqlParamet

我使用64KB的迭代将一个文件的字节追加到一个VARBINARY字段中到一个SQL Server数据库中

但是,我认为这会将整个byte对象带回内存,追加字节,然后更新行,这会导致性能下降

用于更新VARBINARY字段的SQL语句

long milliseconds = DateTime.Now.Ticks; 

ExecuteSqlCommand("UPDATE dbo.table SET Item = Item + @item WHERE id = @id", new SqlParameter("@item", append), new SqlParameter("@id", id));

long millisecondsAfter = DateTime.Now.Ticks;

long timeTook = millisecondsAfter - milliseconds;
之所以这样说,是因为每次循环后毫秒(timetake)值都更大

所以问题是,有没有一种更快、更有效的方法来执行上述查询

---编辑(回答)--

多亏了下面的答案,这是一个新的查询,效果更好

UPDATE dbo.table SET Item.WRITE(@item, NULL, 0) WHERE id = @id", new SqlParameter("@item", append), new SqlParameter("@id", id));

谢谢

这基本上就是人们不阅读文档时发生的情况

您可以通过SQL直接执行部分更新,而无需加载整个对象

是update语句的语法。请注意“.Write”

让我引用

.WRITE(表达式@Offset,@Length)指定 要修改列名称的值。表达式替换@Length 从列名称的@Offset开始的单位。仅列 可以使用指定varchar(max)、nvarchar(max)或varbinary(max) 这一条。列名称不能为NULL,并且不能用 表名或表别名


这基本上就是人们不阅读文档时发生的情况

您可以通过SQL直接执行部分更新,而无需加载整个对象

是update语句的语法。请注意“.Write”

让我引用

.WRITE(表达式@Offset,@Length)指定 要修改列名称的值。表达式替换@Length 从列名称的@Offset开始的单位。仅列 可以使用指定varchar(max)、nvarchar(max)或varbinary(max) 这一条。列名称不能为NULL,并且不能用 表名或表别名


SQL Server没有优化此处的二进制追加情况。事实上,这导致了二次性能。(有人可能会说SQL Server应该对此进行优化。)


使用该语句可以实现流式写入和稳定的性能。

SQL Server不会优化此处的二进制追加情况。事实上,这导致了二次性能。(有人可能会说SQL Server应该对此进行优化。)


使用该语句可以实现流式写入和稳定的性能。

是否索引了
id
列?否,但这种情况发生在只更新表中的一行时,通常索引有助于搜索。您描述的行为是SQL Server更改数据的方式—它总是将数据从磁盘拉到内存缓存并在那里进行更新,然后将其写回磁盘。提高性能的最佳方法是一次进行所有更改,而不是使用循环。实际上不是。这是当程序员避免使用正确的语法来更新博客的一部分时,它更改数据的方式。诚然,大多数人不知道这一点,但它确实存在。假设他的字段是varbinary(max),而不是varbinary(n),这是真的。
id
列是否已索引?否,但这种情况发生在只更新表中的一行时,通常索引有助于搜索。您描述的行为是SQL Server更改数据的方式—它总是将数据从磁盘拉到内存缓存并在那里进行更新,然后将其写回磁盘。提高性能的最佳方法是一次进行所有更改,而不是使用循环。实际上不是。这是当程序员避免使用正确的语法来更新博客的一部分时,它更改数据的方式。当然,大多数人都不知道这一点,但它确实存在。假设他的字段是varbinary(max),而不是varbinary(n),这是正确的。