设为首页 收藏本站
查看: 1086|回复: 0

[经验分享] 一个子目录里放100W个文件及SQL Server File Stream中放100W文件,会怎么样?

[复制链接]
YunVN网友  发表于 2015-6-27 21:38:41 |阅读模式
  如果我有100W个小文件,每个接近100K,然后我要放到一个目录里面,NTFS的子目录是否能够承受住单个目录存放100W的文件?如果采用sql server 2008的File Stream功能呢?我们知道SQL Server 2008启用了Filestream的字段的表,是一个字段放到一个子目录,如果我100W条记录都放在一个表里面,对应磁盘上仍然是1个子目录会有100W个文件。那结果会怎样?
  在很多流言中,有一些认为一个子目录存放超过10W的文件会产生不稳定的情况,通常在遇到这种场景,都直接建议采用分级目录存放,包括我们在一个表里面插入100W条记录。但是windows ntfs和sql server真的有这么差吗?当然不会,我们知道sql server 2008即使管理100T数据也没有问题。而网上最广泛的流言之一就是Oracle的性能比sql server的性能好,这个流言是在sql server 2000的时候产生的,那个时候是事实,但是sql server 2005已经改变了这一状况,而sql server 2008则彻底颠覆了这种情况,但是,流言,仍然继续的流传了下来(看看最新的TPC-E排名:http://www.tpc.org/tpce/results/tpce_perf_results.asp ,TPC-E可是比TPC-C的更新的基准测试哦)。还有一个著名的流言就是SharePoint列表中不要存放超过2000条记录,否则将引起性能的严重下降,这个流言在SharePoint 2003的时候是属实的,但是在SharePoint 2007里面就已经改善了,流言也仍然传了下来。
  首先说一下今天要讨论的场景,既然要在sql server 2008里面存放100W个文件,那么显然这是一个服务端应用,而不是一个客户端应用,因为没有人会手动的从100W个文件中去挑选什么。我的 测试环境如下:
  OS: Windows Server 2008 R2
  硬盘: SATA 日立 1T 7200转
  CPU:双核 2G
  数据库: SQL Server 2008 Enterprise(MSDN license)
  可用内存:足够大(不会出产生内存不足而导致的额外硬盘交换,占用IO的情况)
  测试文件大小:90K,也即将插入90K的文件100W份,相当于将这个文件复制了100W份。
  真正的服务器一般采用SCSI高速硬盘,所以IO状态会比我的测试机器好很多,而这台机器是我的开发用机,在1T的硬盘上还有3个虚机在同时运行,所以相对而言IO是比较差的。如果在我这台机器上能够承受的住,我相信在真正的服务器上都不会有任何问题。
  测试代码:      

DSC0000.gif DSC0001.gif 代码

1 static void Main(string[] args)
2         {
3             SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=NorthPole;Integrated Security=SSPI;");
4             conn.Open();
5             SqlCommand cmd = new SqlCommand();
6             cmd.Connection = conn;
7             cmd.CommandText = "AddFile";
8             cmd.CommandType = System.Data.CommandType.StoredProcedure;
9
10             DateTime begin = DateTime.Now;
11             for (int i = 1; i < 100001; i++)
12             {
13                 cmd.ExecuteNonQuery();
14                 Console.WriteLine("{0} rows are inserted!", i);
15             }
16             DateTime end = DateTime.Now;
17             conn.Close();
18
19             TimeSpan t = end - begin;
20             Console.WriteLine("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", t.Days, t.Hours, t.Minutes, t.Seconds);
21             Console.ReadLine();
22         }
23   
  里面的AddFile是存储过程:
  

代码

ALTER PROCEDURE [dbo].[AddFile]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @img AS VARBINARY(MAX)

-- Load the image data

SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
      FROM OPENROWSET(
            BULK
            'D:\temp\test.jpg',
            SINGLE_BLOB ) AS x
            
-- Insert the data to the table           

INSERT INTO Items (ItemID, ItemImage)
SELECT NEWID(), @img
END
  
  
  我首先插入了10W条记录到数据库中,执行结果如下:
DSC0002.jpg
  
由于我担心Console.WriteLine和i++这两句代码耗费时间过多,所以做了一下时间补偿,将cmd.ExecuteNonQuery()注释掉,然后做10W次空循环,结果如下:
DSC0003.jpg
  基本不会对结果产生什么影响。
  效率:总共:3757秒,0.03757秒/条
  然后我将循环改成了90W次,往数据库插入90W条记录,执行结果如下:
DSC0004.jpg
  时间补偿:
DSC0005.jpg
  效率:总共:52674秒, 0.0585秒/条。
  随着记录数的增多,显然速度会变慢,不过这点效率损失基本还能够忍受。
  虽然对应的目录里面存放了100W的记录,但是目录还是能够打开,不过windows文件管理器的响应速度会变慢,当然这个主要原因应该是widnows文件管理器的原因,毕竟100W条数据不是一个小数字。我们能够看到这个目录有100W项目。
DSC0006.jpg
DSC0007.jpg
  
  通过sql语句:
SELECT TOP 1000 [ItemID]

      ,[ItemImage]

    FROM [NorthPole].[dbo].[Items]
  
  取前1000行记录,大约用时16秒。
DSC0008.jpg
  很明显,sql server 具有很好的缓存功能,当我再次执行这条语句的时候,仅仅用时6秒。
DSC0009.jpg
  随后我执行了几次,基本都维持在6、7秒的样子。
  在取任何一条记录的时候,时间都是0秒。我这里感觉不到速度的差异。
  关于如何使用SQL Server File Stream功能,这里有一篇blog写的非常详细:http://www.simple-talk.com/sql/learn-sql-server/an-introduction-to-sql-server-filestream/
  从我个人的感觉来说,基本没有什么问题,而且如果换成专门的服务器,采用快速的SCSI硬盘,效率应该比我现在的测试结果要好上很多。
  
  当然上述结果仅供参考,如果你需要采用的话,建议在你的真实环境里面再实际测试一遍。毕竟不同的环境,可能得到的结果不相同。
  
  附加,额外的:
DSC00010.png
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81090-1-1.html 上篇帖子: sql server 2005下载|学习|教程|笔记系列文章 下篇帖子: 谈谈SQL Server高可用的常见问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表