SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它

SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它

引言

在SQL Server 2008R2中,FileStream成为了官方推荐的大文件存储方式。FileStream存储在表格中的数据是一个BLOB(Binary Large Object),相较于把数据存储为VARBINARY,它的优点在于可以支持一些新的文件操作,比如使用Win32文件API和Transact-SQL存储过程打开、编辑、删除大于2 GB的文件,同时,存储也更加高效。

但是,FileStream也存在一些误区,基于一些观念上的理解反而会使得实际使用中出现一些问题,本篇文章将讲解其中一些比较重要且常见的问题。

文件内容以及垃圾回收

在使用FileStream存储文件时,很多人认为删除文件后,文件的空间会被回收。但是,这种理解是错误的。在SQL Server中,文件是以文件流方式存储于磁盘,并在NTFS上留下文件占用磁盘的记录,即文件系统维持着对该文件的一个指针。当使用SQL Server内置的GC机制删除文件时,它只是把对文件的指向删除了,并不能确保该文件被彻底删除,因此,在删除数据时,需要注意一些事项:
- 如果不考虑空间问题,一般的做法是对于所有不再使用的文件手动运行DBCC SHRINKFILE (或 SHRINKDATABASE),这样才能使数据库的物理占用得到正确的计算和管理。
- 对于文件删除的处理,在逻辑上应保证垃圾回收每次保证了至少一个回收间隔内所有的空间已经被回收。

存储实例

下面是一个存储实例:

表结构

现有一个表t_img,包含两个列,一个是ID,一个是t_img_content,数据类型为varbinary(max)

CREATE TABLE [dbo].[t_img](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [t_img_content] [varbinary](max) FILESTREAM NULL,
 CONSTRAINT [PK_t_img] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
FILESTREAM_ON [FileStream01]

其中存储在FileStream01文件组中。

存储流程

下面是一个存储流程的示例:

DECLARE @image_path NVARCHAR(MAX);
SELECT @image_path = 'C:\images\image001.jpg'

INSERT INTO t_img(t_img_content)
SELECT *
FROM   Openrowset(Bulk 'C:\images\image001.jpg', SINGLE_BLOB) AS binarydata;

这种方式可以把图片文件直接转换为二进制格式并插入到表中。

删除文件

接下来是文件删除示例:

DELETE FROM t_img WHERE id = 1

在删除完文件之后,即使执行完DBCC SHRINKFILE指令,文件的存储空间也依然存在,对于这种情况,我们可以手动打开SQL Server的垃圾回收功能。

EXECUTE sys.sp_filestream_force_garbage_collection [FileStream01]

通过手动执行sys.sp_filestream_force_garbage_collection存储过程来清除空间,让每次回收间隔内的所有空间都被回收。

总结

FileStream是一种高效的存储方式,但是在使用中需要注意文件内容以及垃圾回收相关的问题,避免出现不必要的麻烦。同时,为了优化数据库存储和管理功能,还可以设置SQL Server的垃圾回收功能,以便更好地管理储空间。以上是本文内容的全部介绍,希望可以对您延申思路,掌握更多实用知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • chrome保存的har文件怎么打开?

    以下是关于“chrome保存的har文件怎么打开”的完整攻略,包括定义、打开步骤、示例说明和注意事项。 定义 HAR(HTTP Archive)是一种记录HTTP通信的标准格式,用于分析网络性能和调试网络问题。在Chrome浏览器中,可以通过保存HAR文件来记录网络请求和响应。本攻略介绍如何打开Chrome保存的HAR文件。 打开步骤 打开Chrome保存的…

    other 2023年5月8日
    00
  • 华为交换机怎么重启接口? 华为交换机接口重启命令的用法

    下面是针对华为交换机重启接口的完整攻略: 一、重启单个接口 1.1 确认接口的状态 首先,我们需要查看当前接口的状态,确认其是否需要被重启。可以通过以下命令查看: display interface GigabitEthernet 0/0/1 其中,“GigabitEthernet 0/0/1”代表要查看的接口名称。 1.2 关闭接口 接着,我们需要关闭该接…

    other 2023年6月26日
    00
  • 解析之C++的列表初始化语法

    当我们使用C++时,列表初始化语法可以用于创建和初始化各种类型的对象,包括数组、结构体、类和STL容器等。下面是解析C++列表初始化语法的完整攻略: 1. 列表初始化的语法 在C++ 11标准之后,我们可以使用以下方式进行列表初始化: <type> <name> = {<value1>, <value2>, .…

    other 2023年6月20日
    00
  • java线程优先级原理详解

    Java线程优先级原理详解 1. 简介 在Java多线程编程中,每个线程都有一个优先级。优先级是用来指定线程相对于其他线程的执行优先级的属性。Java中的线程优先级范围从1到10,默认优先级为5。 2. 线程优先级的作用 线程优先级影响线程在可运行状态下的调度顺序。操作系统会根据线程的优先级来确定应该先执行哪个线程。 3. 设置线程优先级 可以使用setPr…

    other 2023年6月28日
    00
  • 简易ftp工具 七款简易ftp工具盘点

    以下是“简易FTP工具七款简易FTP工具盘点”的完整攻略: 简易FTP工具 FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的协议。在实际应用中,我们经常需要使用FTP工具来上传、下载和管理文件。本攻略中,我们将介绍七款简易FTP工具的特点和使用方法。 1. FileZilla FileZilla是一款免费的FTP工具,支…

    other 2023年5月8日
    00
  • php 静态变量的初始化

    PHP静态变量的初始化 在PHP中,静态变量是指被声明为 static 的变量,它们的值在函数调用之间不会丢失。PHP可以在函数内部或函数外部声明静态变量。如果在函数内部声明静态变量,则该变量仅在该函数被调用时初始化一次,之后调用函数时,变量的值保留不变。如果在函数外部声明静态变量,则该变量在脚本的生命周期中保持其值。 静态变量的初始化很重要,因为它决定了该…

    other 2023年6月20日
    00
  • php mysql获取表字段名称和字段信息的三种方法

    以下是关于“php mysql获取表字段名称和字段信息的三种方法”的详细攻略: 方法一:使用mysql_fetch_field函数获取字段信息 该方法使用mysql_fetch_field函数获取表中的字段信息,需要以下步骤: 1.链接数据库 $con = mysql_connect("localhost","root&quot…

    other 2023年6月25日
    00
  • Winform自定义控件在界面拖动、滚动鼠标时闪烁的解决方法

    Winform自定义控件在界面拖动、滚动鼠标时闪烁的问题,通常是由于控件的重绘操作频繁引起的。因此,需要采取一些措施来减少控件的重绘频率,以提高界面的流畅度和稳定性。 方法一:使用双缓冲技术 双缓冲技术是一种常用的减少控件闪烁的方法,可以将控件的重绘操作先绘制在内存中,再将内存中的内容一次性绘制到控件上,从而避免频繁引起界面重绘而导致的闪烁问题。 在使用双缓…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部