sql server 2008 filestream

sql server 2008 filestream

文件流的出现就是为了解决对大对象的存储中一个矛盾。

对于大对象,在没有文件流以前,一般有二种方法:

第一种方式是存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做。好处是可以统一备份,但实际上读取效率比较低。大于1MB的文件就会有问题

第二种方式是文件存储在文件系统,而数据库中存储了一个路径。这种方式数据库压力减轻了,却很不方便统一备份和管理

SQL SERVER 2008的文件流其实就是二者的统一。文件还是放在文件系统的,但由数据库进行管理。可以统一备份和还原。

FILESTREAM不是一个字段类型,它定义在字段后面,声明该列用于文件流即可。该列依然是用二进制保存的

一般都是在数据库中要特别添加一个文件组和一个或多个文件用来存储FileStream的数据的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--这段代码的作用是启用服务器支持文件流
 
EXEC sp_filestream_configure
 
@enable_level = 3;
 
CREATE DATABASE Archive
 
ON
 
PRIMARY ( NAME = Arch1,
 
FILENAME = 'd:\test\archdat1.mdf'),
 
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3,
 
FILENAME = 'd:\test\filestream1')
 
LOG ON ( NAME = Archlog1,
 
FILENAME = 'd:\test\archlog1.ldf')
 
GOFILESTREAM_ON FileStreamGroup1 --该行指示存储到哪一个文件流文件组
 
GO

CREATE TABLE [DemoFileStreamTable_1] (
[FileId] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,--如果一个表要使用文件流,则必须有一个GUID列,而且作为唯一键列
[FileName] VARCHAR (25),
[File] VARBINARY (MAX) FILESTREAM);--这一句指示该列要用文件流存储

  我们将数据插入到新创建的FILESTREAM表中。 在此示例中,我们将插入位于“ C:\ sqlshack”文件夹中的图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE @File varbinary(MAX); 
SELECT 
@File = CAST( 
bulkcolumn as varbinary(max) 
FROM 
OPENROWSET(BULK 'C:\sqlshack\akshita.png', SINGLE_BLOB) as MyData;
  
INSERT INTO DemoFileStreamTable_1 
VALUES 
NEWID(), 
'Sample Picture'
@File
)

  我们可以从演示表中选择记录。 在“文件”列中,您可以看到图像已转换为varbinary对象。

1
2
3
4
SELECT TOP (1000) [FileId]
,[FileName]
,[File]
FROM [FileStreamDemoDB].[dbo].[DemoFileStreamTable_1]

  

当我们使用FILESTREAM功能插入文档时,SQL Server将文件复制到FILESTREAM路径中。 它不会更改文件属性。 我们可以使用兼容的应用程序直接打开此文件。

更新FILESTREAM文档,但是,FILESTREAM路径也包含旧的图像文件。 SQL Server并未删除此文件。

QL Server有一个特定的内部filestream_tombstone表,其中包含此旧文件的条目。仅当filestream_tombstone表中没有该文件的条目时,垃圾收集过程才会删除该旧文件。

我们可以手动运行垃圾收集器进程文件,以在自动垃圾收集器进程清除文件之前从容器中删除文件。 

sp_filestream_force_garbage_collection   @dbname, @filename

1
2
3
4
5
6
7
8
9
10
11
12
UPDATE DemoFileStreamTable_1
SET [File] = (SELECT *
FROM OPENROWSET(
BULK 'C:\sqlshack\SQL Server Profiler in Azure Data Studio.docx',
SINGLE_BLOB) AS Document)
WHERE fileid = '60236384-AC5B-45D1-97F8-4C05D90784F8'
GO
  
Update DemoFileStreamTable_1
set filename='Sample Doc'
WHERE fileid = '60236384-AC5B-45D1-97F8-4C05D90784F8'
GO

  

posted @   delphi中间件  阅读(252)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2016-11-15 mssql内存表
2012-11-15 move
2012-11-15 移动CMPP2.0封装
点击右上角即可分享
微信分享提示