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日

相关文章

  • win7系统打开IE浏览器提示“禁用的加载项,网页内容无法显示”的故障分析及解决方法

    故障分析 当我们在win7系统中打开IE浏览器时,有时会弹出一个警告提示框,提示“禁用的加载项,网页内容无法显示”。这是由于IE浏览器安装的某些插件或者加载项与当前浏览的网页不兼容或存在安全隐患,因此浏览器自动禁用了这些插件或加载项,导致网页内容无法正常显示。 解决这个问题的方法是,找到导致问题的插件或加载项,并进行禁用或卸载。通常情况下,这些插件或加载项是…

    other 2023年6月25日
    00
  • Android中使用PagerSlidingTabStrip实现导航标题的示例

    Android中使用PagerSlidingTabStrip实现导航标题的示例攻略 简介 PagerSlidingTabStrip是一个开源库,用于在Android应用中实现带有导航标题的滑动标签页。它提供了一种简单而灵活的方式来创建和管理标签页,并且可以与ViewPager一起使用。 步骤 步骤一:添加依赖 首先,你需要在你的Android项目中添加Pag…

    other 2023年8月21日
    00
  • linux系统测试–io测试工具之fio详解

    fio是一款用于测试Linux系统I/O性能的工具,它可以模拟各种不同的I/O负载,并提供详细的性能报告。以下是关于fio的详细攻略: 安装fio 在Linux系统上安装fio非常简单,只需要使用系统的包管理器即可。例如,在Ubuntu系统上,可以使用以下命令安装fio: sudo apt-get install fio 编写fio测试文件 fio测试文件是…

    other 2023年5月8日
    00
  • SpringBoot使用ip2region获取地理位置信息的方法

    SpringBoot使用ip2region获取地理位置信息的方法攻略 简介 ip2region是一个基于ip地址的地理位置查询库,可以根据IP地址快速获取对应的地理位置信息。在SpringBoot项目中使用ip2region可以方便地获取访问者的地理位置信息,从而实现一些个性化的功能。 步骤 步骤一:添加依赖 首先,在你的SpringBoot项目的pom.x…

    other 2023年7月31日
    00
  • c++递归实现n皇后问题代码(八皇后问题)

    实现n皇后问题的代码可以用递归的方法来实现。这里提供一份c++递归实现n皇后问题代码以及完整攻略。 思路简述 n皇后问题指的是在一个nxn的棋盘上放置n个皇后,使得皇后之间互不攻击,即任意两个皇后都不能放置在同一行、同一列或同一对角线上。这里我们可以使用递归的方法来实现。 具体实现思路如下: 首先定义一个长度为n的一维数组board,用来存放每一行中皇后所在…

    other 2023年6月27日
    00
  • iostream与iostream.h的区别详细解析

    iostream和iostream.h都是C++中用来进行输入输出流操作的头文件,它们的主要区别在于前者属于标准C++语言库,后者则属于传统C++语言库。下面我们来具体讲解它们之间的区别。 iostream和iostream.h的区别 iostream.h是早期的C++语言库,已经被淘汰,而iostream则是C++标准库中的一部分,是新的C++库。在使用i…

    other 2023年6月27日
    00
  • Android中Lifecycle的原理详解

    Android中Lifecycle的原理详解 什么是Lifecycle Lifecycle是Android系统提供的一种组件,用于管理应用程序的生命周期。它是一个抽象类,通过其生命周期的不同阶段可以实现相应的逻辑。 在Android应用程序中,Activity和Fragment是需要我们自己管理的组件,对其生命周期进行合适的管理是非常必要的。Lifecycl…

    other 2023年6月27日
    00
  • linuxcp直接覆盖不提示信息解决方法

    以下是关于“Linux cp 直接覆盖不提示信息解决方法”的完整攻略: 问题描述 在Linux系统中,使用cp命令复制文件时,如果目标文件已经存在,cp命令会直接覆盖目标文件,而不会提示用户是否确认。这可能会导致用户误操作,造成数据丢失等问题。 解决方法 为了避免这种情况的发生,可以使用以下两种方法: 方法1:使用-i选项 -i选项可以让cp命令在覆盖目标文…

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