【问题标题】:How to compress datatable column before calling stored procedure via .net?如何在通过.net调用存储过程之前压缩数据表列?
【发布时间】:2013-02-15 18:58:49
【问题描述】:

我正在为远程 sql server 2012 数据库编写一个 .net 客户端。客户端通过调用以表值参数作为输入的存储过程来工作。客户端通过创建 .net datatables 调用这些存储过程,然后将这些数据表作为参数 (SqlCommand.Paramters.AddWithValue()) 传递。然后在我调用dataAdapter.Fill(dataset) 时将数据表传输到sql server。这些数据表的一列包含文件路径,即nvarchar(max)。这会使数据表变得非常大。这是一个严重的瓶颈,因为 sql server 位于世界的另一端。我的问题是:是否有可能以某种方式压缩文件路径,以尽量减少通过 Internet 传输的数据量?我应该在什么级别进行此压缩?还是已经自动完成了一些压缩?注意:我说的是列,但当然可以压缩整个数据表。谢谢

【问题讨论】:

  • 你的代码是否工作(除了瓶颈)?
  • 您始终可以异步执行此操作。它不会解决瓶颈,但至少你可以反馈正在发生的事情。
  • 因为.net框架中没有compatible datatype匹配sql table类型。
  • 我已经在异步进行了。但是批处理操作需要一个多小时,因为我传递了 10000 个文件路径。数据表的大小可以压缩 99%...

标签: .net sql-server tsql datatable dataset


【解决方案1】:

您对远程服务器有任何控制权吗?您可以更改存储过程吗?

我不认为有支持压缩的内置连接类型(尽管它可能是write your own),但如果您能够修改您的方法,您可以通过 SQL CLR 轻松支持您的要求。 .

  • 将目标存储过程更改为接受 varbinary(max) 而不是表
  • 让您的 .NET 客户端对数据进行编码和压缩(可能是 json?)和 然后调用存储过程,将其作为二进制有效负载传递
  • 让目标 sproc 将二进制文件解压缩并解码为表(通过 SQL CLR)
  • ...照旧继续

【讨论】:

  • 我可以完全控制服务器。我写了存储过程。已经避开了SQL CLR,现在不想介绍了……
  • 您说“让目标存储过程解压缩并将二进制文件解码为表”----- 究竟如何?我不能在普通的 t-sql 中做到这一点吗? t-sql 中是否有类似 UNCOMPRESS_STRING 的操作?我可以在使用它们之前修改我存储的过程以解压缩字符串...
  • 我不知道任何内置方法。 SQL CLR 非常适合这种重要的数据操作要求,虽然您可能可以work around it 这样做,但最终会增加更多的复杂性。
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多