- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有很多.Net应用程序可将文件上传到SQL Server(2008)并从中检索文件。在大多数地方,我们将文件存储为varbinary(max)。
当然,这是一种常见的做法,但是我想知道是否有人在保存之前就花了很多功夫并压缩了他们的文件(即zip),并在检索时解压缩了(解压缩)?我们的某些数据库在.mdf文件大小方面达到40-100gb的范围,我知道可以对其进行一些调整。
这是一个好习惯吗?有人知道性能影响,或者有任何示例代码吗?
谢谢
汤姆
最佳答案
首先,我们需要查看有关问题和答案的注释中揭示的其他详细信息:
由于企业存储成本高,因此需要节省空间
文件类型为:“大多数是pdf,word文档,excel文件...例如Office文件,但也有一些大型工程文件,例如cad's”
有数千个文件
许多文件为1-3 Mb
我测试了从1 MB到17 MB的PDF文件,压缩率最高为25%,而大多数似乎在10%-15%左右。就Microsoft Office文件而言,如果您谈论的是Office 2007之前的格式(即,扩展名不以“ x”结尾)或较新的格式(即,扩展名以“ x”结尾),则差异很大。较新的格式(例如“ .docx”,“。xlsx”等)已经是压缩文件,因此您在这里不会节省很多钱(亲自看看:使用扩展名复制/粘贴任何Office文档)以“ x”结尾的文件,将副本重命名为具有“ zip”的扩展名,而不是“ docx”或其扩展名,然后双击它)。我不记得有多少CAD工程图压缩,但是我怀疑至少与PDF一样多。
因此,假设2000个文件(每个3 MB)为6 GB。 10%的平均压缩将节省600 MB。最好对文件(尤其是CAD文件)进行一些采样,以更清晰地了解您将要真正保存的内容。知道您实际上希望节省多少钱,应该有助于确定在可用的时间/资源下,以下哪个选项最有意义。
您的选择似乎是:
压缩:就重构现有代码而言,这似乎是最少的工作量。压缩和解压缩Web服务器上的文件应该很简单(.Net框架随附了用于进行Deflate / Inflate以及Gzip / Ungzip的库),并且在DB层上不需要进行任何更改(您只需要将现有数据一次性迁移为压缩格式)。在对这个问题的评论中,JonSkeet询问这样做是否值得。考虑到仅此选项的工作量很小,我认为这是肯定的。开发人员时间为每小时50美元(或左右),而这样的项目可能需要10个小时(包括质量检查),即500美元的已付(按预算)的员工时间。获得新的SAN空间的成本将远远超过500美元(如果出于某种原因需要20个小时才能实施,甚至会超过1000美元),并且通常来自其他预算且需要申请等。
除了立即减小MDF文件大小之外,还有其他好处,即:
从磁盘读取和写入磁盘的所有数据都通过缓冲池。您需要读取和写入这些文件的8k数据页面越多,实际应用程序数据被压出并需要从磁盘再次读取的频率就越高(这很慢,否则我们将没有读/写缓存! )。这会降低您的页面寿命。
备份较小!数据越小,备份文件越小。而且,要备份和还原的数据越小,两个操作就越快。
更快的访问(通常不是)。磁盘是系统中最慢的部分,因此,如果您访问磁盘的次数较少,则通常会获得净收益,因为CPU通常可以以比磁盘可以读写的速度快的方式压缩/解压缩数据。当然,只有在您的系统上使用数据和文件进行测试才能说明问题,但是Microsoft充分有理由在ROW或PAGE级别为SQL Server 2008开始对索引包括内置数据压缩)。
文件流:http://technet.microsoft.com/en-us/library/bb933993(v=sql.100).aspx这会花费更多的精力,但是会将文件移出MDF文件。如果本地文件共享也在SAN上,则可以考虑将文件的压缩与使用FILESTREAM结合使用,以使它们脱离MDF文件。
远程Blob存储(RBS):http://msdn.microsoft.com/en-us/library/gg316768.aspx这是一个附加功能,您需要单独下载,但似乎正是针对这种情况而设计的(将外部文件存储在便宜的存储中)。与上述两个选项不同,该选项在备份数据库时可能不会备份外部文件,并且需要进行辅助备份(某些情况下并非不可能)。在RBS主页面的底部有一个white paper链接(从第40页的底部开始)解释了备份选项。 MSDN文档显示了从SQL Server 2008 R2开始的功能,但我没有看到任何迹象表明该功能在SQL Server 2008中不起作用。
编辑:
一些附加说明:
如文档中所述,FILESTREAM选项的一个非常不错的好处是它跳过了缓冲池,因此数据的大小对于性能(即页面预期寿命)而言不是问题。
如果进行压缩(无论将其与其他选项结合使用,似乎都是一个好主意),那么选择一种更通用的方法可能是最佳选择。意思是,如果使用.Net框架选项-Inflate / Deflate或Gzip / Ungzip,则使用Gzip / Ungzip可能更好,因为它更容易找到处理该格式的工具。
如果将压缩数据存储在数据库中,则是一次性迁移数据,还是通常只需要访问数据库层的“原始”数据(而不需要将某些内容移至应用程序层即可)访问“实际”数据),则可以为Gzip / Ungzip实现SQL CLR函数。如果不确定如何完成此操作,那么在各个站点上都有大量示例,或者您可以下载并使用SQL#中的[Util_Gzip]和[Util_GUnzip]函数(或[Util_Deflate]和[Util_Inflate]),作者,但这些功能在免费版本中可用)。在简单的级别上,一次性数据迁移可以通过执行以下操作来完成:
UPDATE tbl
SET tbl.VarBinaryField = SQL#.Util_GZip(tbl.VarBinaryField)
FROM SchemaName.TableName tbl
WHERE tbl.ID BETWEEN @StartID AND @EndID -- do small batches at a time
关于.net - .Net:将压缩文件保存到SQL Server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333343/
本周我将在 Windows Server 2008 上设置一个专用的 SQL Server 2005 机器,并希望将其精简为尽可能简单,同时仍能发挥全部功能。 为此,“服务器核心”选项听起来很有吸引力
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 8 年前。 Improve
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
TFS 是否提供任何增强的方法来存储对 sql server 数据库所做的更改,而不是使用它来对在数据库上执行的 sql 语句的文本文件进行版本控制? 或者我正在寻找的功能是否仅在第 3 方工具(如
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我即将将我的 SQL Server 2012 实例升级到 SQL Server 2014。 我已经克隆了主机 Windows VM 并将其重命名为 foo-2012至 foo-2014 . 重新启动时
我想为 SQL Server 登录授予对数据库的访问权限。我知道 sp_grantdbaccess,但它已被弃用。我可以改用什么以及如何检查登录名是否还没有访问数据库的权限? 场景:UserA 创建数
客户别无选择,只能在接下来的几天内从 sql server 2000 迁移到 2008。测试显示 2005 年的重要功能出现了 Not Acceptable 性能下降,但 2008 年却没有。好消息是
我有一个测试数据库,我需要将其导出到我们客户的测试环境中。 这将是一次性的工作。 我正在使用 SQL Server 2005(我的测试数据库是 SQL Server 2005 Express) 执行此
我需要将一个 CSV 文件导入到 mongoDB 不幸的是我遇到了以下错误: error connecting to host: could not connect to server: se
我以为 R2 是一个补丁/服务包。我一直在寻找下载,但没有看到。因此,我假设 R2 是一个新版本,并且我需要 sqlserver 2008 r2 的安装介质来进行升级? 另外,我需要为新许可证付费吗?
我无法使用 SQL Server Management Studio 连接到 SQL Server。 我有一个连接字符串: 我尝试通过在服务器名中输入 myIP、在登录名中输入 MyID、在密码中
我们希望使用 SQL Server 加密来加密数据库中的几个列。我们还需要在生产和测试环境之间传输数据。看来最好的解决方案是在生产和测试服务器上使用相同的主 key 、证书和对称 key ,以便我可以
有没有可以分析 SQL Server 数据库潜在问题的工具? 例如: a foreign key column that is not indexed 没有 FILL FACTOR 的 uniquei
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
如果您使用 SQL Server 身份验证 (2005),登录详细信息是否以明文形式通过网络发送? 最佳答案 如您所愿,安全无忧... 您可以相当轻松地配置 SSL,如果您没有受信任的证书,如果您强制
我想将数据从一个表复制到不同服务器之间的另一个表。 如果是在同一服务器和不同的数据库中,我使用了以下 SELECT * INTO DB1..TBL1 FROM DB2..TBL1 (to copy w
我希望得到一些帮助,因为我在这个问题上已经被困了 2 天了! 场景:我可以从我的开发计算机(和其他同事)连接到 SERVER\INSTANCE,但无法从另一个 SQL Server 连接。我得到的错误
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
我是一名优秀的程序员,十分优秀!