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

yizhihongxing

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日

相关文章

  • linux 断网 扫描基本命令

    当Linux系统出现网络问题时,可以使用一些基本命令来扫描和诊断问题。本文将为您提供Linux断网扫描基本命令的完整攻略,包括其原理、实现方法和示例。 原理 当Linux系统出现网络问题时,可以使用一些基本命令来扫描和诊断问题。这些命令可以帮助您确定网络连接是否正常,以及确定网络问题的根本原因。以下是一些常用的Linux网络扫描命令: ping:用于测试网络…

    other 2023年5月7日
    00
  • C语言实现常用字符串库函数(推荐)

    C语言实现常用字符串库函数(推荐) 1. 背景 在C语言中,字符串操作是非常常见的功能。C标准库提供了一些字符串函数,例如strcpy、strcat、strlen等等。然而,有时候这些函数的实现可能并不能满足特殊需求,这时候我们就需要手动实现字符串函数。 2. 实现常用字符串库函数 2.1 strcpy函数 strcpy函数用于将一个字符串复制到另一个字符串…

    other 2023年6月20日
    00
  • 怎么关闭Win11大小写提示图标?Win11大小写提示图标关闭方法

    关闭Win11大小写提示图标的方法如下: 首先,点击任务栏右侧的通知图标,打开“操作中心”。 在“操作中心”中,找到并点击“所有设置”按钮。 在“设置”窗口中,选择“个性化”选项。 在“个性化”选项中,点击左侧的“任务栏”。 在右侧的任务栏设置中,找到“系统图标”一栏。 在“系统图标”中,找到“大小写提示”选项,并将其关闭。 示例说明1:在“个性化”选项中,…

    other 2023年8月16日
    00
  • CentOS 5.5 最新版下载地址 比较流行的服务器操作系统

    CentOS 5.5 最新版下载地址 比较流行的服务器操作系统攻略 CentOS是一种基于Red Hat Enterprise Linux(RHEL)源代码的自由开源操作系统,被广泛用作服务器操作系统。本攻略将详细介绍如何下载最新版的CentOS 5.5,并提供两个示例说明。 步骤一:访问CentOS官方网站 首先,访问CentOS官方网站以获取最新版的Ce…

    other 2023年8月4日
    00
  • 解决vuex刷新状态初始化的方法实现

    下面就详细讲解一下“解决vuex刷新状态初始化的方法实现”的完整攻略: 1. 问题描述 在使用vuex管理状态时,由于状态信息存在于缓存中,页面刷新后状态依然存在,但是用户信息等无法从缓存中获取,因此需要对状态信息进行初始化操作。 2. 解决方法 2.1 在页面加载时初始化状态 在代码中的created生命周期中,在actions中调用函数初始化所需的状态信…

    other 2023年6月20日
    00
  • [转]3D渲染管线

    [转]3D渲染管线 什么是3D渲染管线 3D渲染管线,简称渲染管线,是指通过计算机将模型、纹理、光照等多种信息转化为最终呈现的图像的过程。在渲染管线中,会经历多个阶段,比如几何处理、光照计算、纹理采样等。 渲染管线的主要阶段及作用 下面简单介绍一下渲染管线的主要阶段及其作用: 1.几何处理 这一阶段主要处理模型的几何属性,包括几何变换、裁剪、光栅化等,最终将…

    其他 2023年3月28日
    00
  • 打印机ip地址与路由器不匹配怎么办? 打印机修改ip地址的教程

    打印机IP地址与路由器不匹配的解决方案 如果打印机的IP地址与路由器不匹配,您可以通过以下步骤来解决这个问题: 步骤一:确定打印机的当前IP地址和路由器的IP地址 首先,您需要确定打印机的当前IP地址和路由器的IP地址。您可以通过以下方式来获取这些信息: 打印机的IP地址:通常,打印机的IP地址可以在打印机的控制面板或设置菜单中找到。您可以查看打印机的用户手…

    other 2023年7月30日
    00
  • WP8.1开发者预览版怎么样?你必须了解的几件事

    首先我们来看一下WP8.1开发者预览版的几个需要注意的事项: 1. 它是测试版,而不是稳定版 WP8.1开发者预览版是提供给WP开发者测试和验证他们的应用程序的版本。它并不是最终发布的稳定版,因此你需要注意它可能存在一些问题和Bug。 2. 安装之前备份数据 在安装WP8.1开发者预览版之前,你需要备份你的数据,包括联系人、短信、照片、视频等等,以防数据丢失…

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