文件流即使存储在文件系统上也会增加数据库大小

时间:2018-02-14 13:07:38

标签: sql sql-server

我们知道文件流是一种机制,用于在文件系统中存储大于1 mb的文件,以提高流媒体性能

让我们假设我们有一个1.5 GB的文件 我们有以下表文档,其中包含文件流属性

 create database TryFileStream

 ALTER DATABASE TryFileStream
 ADD FILEGROUP [Common_Filestream] CONTAINS FILESTREAM 

ALTER DATABASE TryFileStream
    ADD FILE   
    (
        NAME = [Common_FileStream_1],
        FILENAME = 'C:\TryFileStream\FileStream1',
        MAXSIZE = UNLIMITED
    )
    TO FILEGROUP [Common_Filestream];


    Create Table Documents
    (
    [ID]  UNIQUEIDENTIFIER Unique ROWGUIDCOL NOT NULL,
    content VARBINARY(MAX) FILESTREAM   
    )

当然,当我们在表文档中保存1.5 gb文件时,文件流路径

C:\TryFileStream\FileStream1 will be increased by 1.5 gb in size 

但令我惊讶的是,保存此文件也会使数据库大小增加1.5 GB

那么,如果数据库的大小继续增加并且无法进行备份操作,那么使用文件流会带来什么好处

我们获得的唯一好处是为用户提供快速数据流,因为文件存储在文件系统中,还有其他文件吗?

我们应该怎样做,因为小数据库大小是一个问题,我们的系统包含大量大于2 GB的大文件

1 个答案:

答案 0 :(得分:1)

使用SSMS获取数据库大小时,会触发查询以获取大小:

navigate() {
    this.router.navigate([], {queryParams: { mValue: this.myValue }});
}

如果您在没有聚合的情况下触发类似的查询:

select sum(cast(gs.size as float))*convert(float,8) 
from   sys.database_files gs

您应该会看到SELECT DF.type , DF.type_desc , DF.name , DF.size FROM sys.database_files AS DF 行,这是您的type=2文件。

简而言之,FILESTREAM文件包含在数据库大小中,就像FILESTREAMLOG文件一样。这是有道理的,因为这就是为什么你必须DATAADD FILEGROUP

有关ADD FILE

的详情,请参阅here