SQL Server : 升级到SQL Server 2008,也许只需要一个理由
2009-07-29 15:34
274 查看
这个理由就是:你如果经常需要在SQL Server中存取大量的二进制内容。
话说,我本来对此也没有太大的感性认识,全因为近日在写一个文件备份工具而起。我在下面这篇文章中大致提到了一些相关的背景
/article/4661511.html
代码那样写没有任何问题,也能正常工作。但是有一个致命的麻烦就是:SQL Server对于内存的处理。例如,我插入的那个“功夫熊猫.rmvb”,大约 519MB,执行一次之后,SQL Server所占的内存就到了将近600MB,然后再执行一次,又往上涨了600MB。这也太恐怖了。
而且更让人绝望的是,这个内存居然无法释放。就永远停在那里。
以前不怎么发现这个问题,是因为我们大多都是提交一些常规数据,即便有一些图片啦,都比较小。
为了限制这个内存的疯涨,我还特别设置了“最大服务器内存”的值,但仍然无效。可能它是觉得我内存既然有那么多,干啥不用呢?这也有点强盗逻辑了吧
服务器各种指令都尝试过了,仍然无解。
下午用SQL Server 2008试了一下,也是如此。
但是,如果在SQL Server 2008中,使用FileStream的功能来做,就没有这个问题了。那个内存占用很小的
为了做这个测试,我准备了一个数据库
USE [master] GO /****** Object: Database [demo] Script Date: 07/27/2009 10:04:05 ******/ CREATE DATABASE [demo] ON PRIMARY ( NAME = N'demo', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL10.SQL2008/MSSQL/DATA/demo.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [Test] CONTAINS FILESTREAM DEFAULT ( NAME = N'Test', FILENAME = N'E:/Temp/Test' ) LOG ON ( NAME = N'demo_log', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL10.SQL2008/MSSQL/DATA/demo_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO ALTER DATABASE [demo] SET COMPATIBILITY_LEVEL = 100 GO EXEC sys.sp_db_vardecimal_storage_format N'demo', N'ON' GO USE [demo] GO /****** Object: Table [dbo].[Files] Script Date: 07/27/2009 10:04:06 ******/ CREATE TABLE [dbo].[Files]( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [FileName] [varchar](256) NULL, [FileContents] [varbinary](max) FILESTREAM NULL, CONSTRAINT [PK_Files] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] FILESTREAM_ON [Test] ) ON [PRIMARY] FILESTREAM_ON [Test] GO SET ANSI_PADDING OFF GO /****** Object: Default [DF_Files_ID] Script Date: 07/27/2009 10:04:06 ******/ ALTER TABLE [dbo].[Files] ADD CONSTRAINT [DF_Files_ID] DEFAULT (newid()) FOR [ID] GO 利用SQL Server 2008的FileStream功能,同样是这个“功夫熊猫.rmvb”,大小为519MB,整个数据提交过程耗时最快只要30秒。而在SQL Server 2005中,常规的方式来做,则平均需要90秒。
另外,使用FileStream功能,真正的二进制内容是直接用文件的方式存在在一个特殊目录的,然后在表中根本就没有存放内容
【提醒】这些文件并不神奇,其实就相当于是源文件,大小也接近。而且你只要将扩展名加上,就和源文件是一模一样的了
鉴于二进制内容的复杂性,即便是说在表中没有保存那些内容,也不建议经常去SELECT * FROM 。。。
通常都会报告一个错误出来,说磁盘空间不够。血的教训告诉我们,使用二进制内容的时候,还是要尽量小心。
最后总结一下:针对频繁需要读写二进制文件的应用,SQL Server 2008的FileStream功能是一个不错的消息。当然,至于SQL Server 本身的varbinary(max)存储为什么会有那样的问题,实在也是有些费解的。我觉得从设计角度来说,应该不至于此的。该问题还在考证。
本文由作者:陈希章 于 2009/7/29 15:34:23 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
本文是使用博客同步和管理系统自动于2009/7/29 15:34:28 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/07/29/1534152.html ,发表于2009/7/29 7:34:00.
话说,我本来对此也没有太大的感性认识,全因为近日在写一个文件备份工具而起。我在下面这篇文章中大致提到了一些相关的背景
/article/4661511.html
代码那样写没有任何问题,也能正常工作。但是有一个致命的麻烦就是:SQL Server对于内存的处理。例如,我插入的那个“功夫熊猫.rmvb”,大约 519MB,执行一次之后,SQL Server所占的内存就到了将近600MB,然后再执行一次,又往上涨了600MB。这也太恐怖了。
而且更让人绝望的是,这个内存居然无法释放。就永远停在那里。
以前不怎么发现这个问题,是因为我们大多都是提交一些常规数据,即便有一些图片啦,都比较小。
为了限制这个内存的疯涨,我还特别设置了“最大服务器内存”的值,但仍然无效。可能它是觉得我内存既然有那么多,干啥不用呢?这也有点强盗逻辑了吧
服务器各种指令都尝试过了,仍然无解。
下午用SQL Server 2008试了一下,也是如此。
但是,如果在SQL Server 2008中,使用FileStream的功能来做,就没有这个问题了。那个内存占用很小的
为了做这个测试,我准备了一个数据库
USE [master] GO /****** Object: Database [demo] Script Date: 07/27/2009 10:04:05 ******/ CREATE DATABASE [demo] ON PRIMARY ( NAME = N'demo', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL10.SQL2008/MSSQL/DATA/demo.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [Test] CONTAINS FILESTREAM DEFAULT ( NAME = N'Test', FILENAME = N'E:/Temp/Test' ) LOG ON ( NAME = N'demo_log', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL10.SQL2008/MSSQL/DATA/demo_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO ALTER DATABASE [demo] SET COMPATIBILITY_LEVEL = 100 GO EXEC sys.sp_db_vardecimal_storage_format N'demo', N'ON' GO USE [demo] GO /****** Object: Table [dbo].[Files] Script Date: 07/27/2009 10:04:06 ******/ CREATE TABLE [dbo].[Files]( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [FileName] [varchar](256) NULL, [FileContents] [varbinary](max) FILESTREAM NULL, CONSTRAINT [PK_Files] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] FILESTREAM_ON [Test] ) ON [PRIMARY] FILESTREAM_ON [Test] GO SET ANSI_PADDING OFF GO /****** Object: Default [DF_Files_ID] Script Date: 07/27/2009 10:04:06 ******/ ALTER TABLE [dbo].[Files] ADD CONSTRAINT [DF_Files_ID] DEFAULT (newid()) FOR [ID] GO 利用SQL Server 2008的FileStream功能,同样是这个“功夫熊猫.rmvb”,大小为519MB,整个数据提交过程耗时最快只要30秒。而在SQL Server 2005中,常规的方式来做,则平均需要90秒。
另外,使用FileStream功能,真正的二进制内容是直接用文件的方式存在在一个特殊目录的,然后在表中根本就没有存放内容
【提醒】这些文件并不神奇,其实就相当于是源文件,大小也接近。而且你只要将扩展名加上,就和源文件是一模一样的了
鉴于二进制内容的复杂性,即便是说在表中没有保存那些内容,也不建议经常去SELECT * FROM 。。。
通常都会报告一个错误出来,说磁盘空间不够。血的教训告诉我们,使用二进制内容的时候,还是要尽量小心。
最后总结一下:针对频繁需要读写二进制文件的应用,SQL Server 2008的FileStream功能是一个不错的消息。当然,至于SQL Server 本身的varbinary(max)存储为什么会有那样的问题,实在也是有些费解的。我觉得从设计角度来说,应该不至于此的。该问题还在考证。
本文由作者:陈希章 于 2009/7/29 15:34:23 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
本文是使用博客同步和管理系统自动于2009/7/29 15:34:28 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/07/29/1534152.html ,发表于2009/7/29 7:34:00.
相关文章推荐
- SQL Server : 升级到SQL Server 2008,也许只需要一个理由
- 需要VS 2008 sp1的其中一个理由:因为包含boost文件
- 安装SQL Server 2008反复提示需要安装MICROSOFT .NET FRAMEWORK 3.5 SP1的一个解决办法
- 升级SQL Server 2008 SP1后可能遇到的一个问题
- 安装SQL Server 2008反复提示需要安装MICROSOFT .NET FRAMEWORK 3.5 SP1的一个解决办法
- 从SQL Server 2000/2005到SQL Server 2008的升级测试
- sql server 2008 中如何将一个数据库中已建好的表导入到另一个数据库中
- 程序员,不要让自己做兔子(updated) 网上最近流传的一个笑话,关于兔子,狼还有一只老虎的,故事 我就是想打你了,还需要什么理由吗?谁让你是兔子 项目经理是这样当的
- 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个
- sql server 2008 评估期已过期如何升级
- SQL Server 2008获取一个表的字段,类型,长度,是否主键,是否为空,注释等信息
- sql server 2008安装需要一直重启。但重启后又没有达到效果。
- 也许需要一个技术微博
- 一步一个脚印-产品升级随笔(2)-为什么需要BS架构的产品
- 从SQL Server 2000/2005到SQL Server 2008的升级测试
- 升级到SQL Server 2012/2014时一些需要考虑的事项
- Sql Server 2008开发版(Developer Edition)过期升级企业版(Enterprise Edition)失败后安装学习版
- 升级到SQL Server 2012-2014时一些需要考虑的事项
- 数据库从SQL Server 2008升级到SQL Server 2014
- 升级到SQL Server 2012-2014时一些需要考虑的事项