SQL Server 文件组详解

数据文件组

SQL Server 数据库最常用的存储文件是数据文件和日志文件。

  • 数据文件用于存储数据,由一个主要数据文件(.mdf)和若干个次要数据文件(.ndf)构成;
  • 日志文件用于存储事物日志,由.ldf文件构成。

不同的文件可以存分布到不同的物理硬盘上,这样便于分散硬盘IO,提高数据的读取速度。

数据文件的组合,称作文件组(File Group),数据库不能直接设置存储数据的数据文件,而是通过文件组来指定。

文件和文件组的关系

SQL Server 的数据存储在文件中,文件是实际存储数据的物理实体,文件组是逻辑对象,SQL Server 通过文件组来管理文件。
在这里插入图片描述

  • 一个数据库有一个或多个文件组,其中主文件组(Primary File Group)是系统自动创建的,用户可以根据需要添加文件组。
  • 每一个文件组管理一个或多个文件,其中主文件组中包含主要数据文件(*.mdf),主文件组中也可以包含次要数据文件 。(主要数据文件是系统默认生成的,并且在数据库中是唯一的;次要数据文件是用户根据需要添加的。)
  • 除了主文件组之外,其他文件组只能包含辅助文件。

如下示例数据库,系统已自动创建主文件组 PRIMARY,勾选 Default 表示将主文件组设置为默认文件组,即如果在 create table 和 create index 时没有指定 FileGroup 选项,那么 SQL Server 将使用默认的 PRIMARY 文件组来存储数据。
在这里插入图片描述

文件组是一个逻辑实体,实际上,数据存储在文件中(.mdf和.ndf)中,每一个文件组中都包含文件,如下图:
在这里插入图片描述
由上图可以看到,数据库文件的元数据:

  • Logical Name – 文件的逻辑名称,用于数据压缩 DBCC ShrinkFile 等;
  • File Type – 文件类型,有两种:Rows Data(存储数据)和 Log(存储日志);
  • Initial Size – 文件初始大小;
  • Autogrowth/Maxsize – Autogrowth 表示文件自动增加的步长,Maxsize 表示文件大小的最大值限制;
  • Path – 文件存放路径;
  • File Name – 文件的物理名称,逻辑名称和物理名可以不同 。

用户也可以通过 sys.filegroups 和 sys.database_files 查看数据的文件组和文件的元数据。

select * from sys.filegroups;
select * from sys.database_files;

本例中,出系统自动创建的主文件组外,并未创建其他文件组。若数据库包含多个文件组,在 create table 和 create index 命令中指定文件组,数据就会存储到指定文件组包含的文件中。

应该如何指定呢?

指定文件组

在创建表时,在 ON 子句中指定文件组,那么数据将存储在该文件组包含的文件中:

CREATE TABLE tb_name(
...
) ON fg_name

create table Test
(Tid int primary key identity,Title01 nvarchar(100) default('标题01'),    Title02 nvarchar(100) default('标题02'),    Title03 nvarchar(100) default('标题03'),    DataStatus tinyint default(0) --0~255 size:1字节
) on PRIMARY

在创建索引时,在 ON 子句指定文件组选项,那么该表的索引结构将存储在文件组包含的文件中:

CREATE NONCLUSTERED INDEX index_name 
ON tb_name( [colume] ASC ) 
ON fg_name

在创建分区时,在 TO 字句中指定文件组,每一个分区将存储到文件组中:

REATE PARTITION SCHEME scheme_name
AS PARTITION function_name 
TO ([fg_name1], <....>, [fp_nameN])

SQL 语句创建数据库并创建多个文件组
现提供示例如下:

create database TEST
on primary                    --主文件组
(name='Test_Data',    --逻辑名size=100mb,                --初始大小filegrowth=10%,            --自动增长步长maxsize=1024mb,            --最大值filename=N'F:\Program Files\Microsoft SQL Server\MSSQL11.STUDR\MSSQL\DATA\Test_Data.mdf'--存放路径及文件名
),
(name='Test_Data1',size=100mb,filegrowth=10%,maxsize=1024mb,filename=N'E:\DATA\Test_Data1.mdf'
),
filegroup TestData --TestData文件组
(name='TestData1',size=100mb,filegrowth=10%,maxsize=1024mb,filename=N'F:\Program Files\Microsoft SQL Server\MSSQL11.STUDR\MSSQL\DATA\Test_Data1.ndf.ndf'
),
(name='TestData2',size=100mb,filegrowth=10%,maxsize=1024mb,filename=N'E:\DATA\TestData2.ndf'
)
log on --日记
(name='Test_Log1',size=5mb,filegrowth=5%,filename=N'F:\Program Files\Microsoft SQL Server\MSSQL11.STUDR\MSSQL\DATA\Test_log1.ldf'
),
(name='Test_Log2',size=5mb,filegrowth=5%,filename=N'E:\DATA\Test_log2.ldf'
)
go

使用文件组的优势

在实际开发数据库的过程中,通常情况下,用户需要关注文件组,而不用关心文件的物理存储,即使DBA改变文件的物理存储,用户也不会察觉到,也不会影响数据库去执行查询。除了逻辑文件和物理文件的分离之外,SQL Server使用文件组还有一个优势,那就是分散IO负载,其实现的原理是:

  • 对于单分区表,数据只能存到一个文件组中。如果把文件组内的数据文件分布在不同的物理硬盘上,那么SQL Server能同时从不同的物理硬盘上读写数据,把IO负载分散到不同的硬盘上。
  • 对于多分区表,每个分区使用一个文件组,把不同的数据子集存储在不同的磁盘上,SQL Server在读写某一个分组的数据时,能够调用不同的硬盘IO。

这两种方式,其本质上,都是使每个硬盘均摊系统负载,提高IO性能。

创建分区表时,不同的分区可以使用相同的文件组,也可以使用不同的文件组。因此,在设计文件组时,应尽量把包含的文件包含在不同的硬盘上,以实现物理IO的最大分散化。

在创建文件时,服务器CPU核的数量,决定最大的并发IO度,应该根据CPU 核的数量创建多个文件。通常情况下,文件的数量和CPU核的数量一致,是最优化的设计。

还有,应该根据硬盘的性能来创建文件组,日志文件存储到性能最好的硬盘上,而查询延迟要求高的数据,也需要存储到性能最好的硬盘上。

不是所有的数据都是同等重要的,应该根据业务需求和查询延迟,对数据分级,因此,在设计文件组时,应该把级别高的数据分散,而把那些基本用不到的数据存储到性能差的,用于存储归档数据的硬盘上,以实现服务器性能的合理配置。

数据文件自动增长导致的问题

当数据文件爆满,没有空间存储数据时,此时执行insert命令,这会导致数据文件的增长。如果filegrowth选项设置的过大,会导致SQL Server耗费较长时间来实现文件的增长,在数据文件增长时,该文件是不能访问的,因此,即使用户仅插入一条数据,也要等待很长时间才能完成查询,对用户来说,体验不友好。

数据文件增长是非常耗费系统资源和影响性能,如果设置SQL Server 自动增长,可能会导致系统性能不够稳定,所以,应该预测可能的空间使用需求,并提前做好规划。尽量避免空间用尽而使得SQL Server不得不自动增长的现象发生。同时也要确保每一次自动增长都能够在可接受的时间内完成,及时满足客户端应用的需求。


参考文章:
https://www.cnblogs.com/itrena/p/9054319.html
https://www.cnblogs.com/dunitian/p/5276431.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java全栈课程之Linux———基本属性

一、看懂文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 在Linux中我们可以使…

2000元投影仪坚果N1 Air怎么样?对比D5X哪款更好?

投影仪市场&#xff0c;近年来作为家电数码领域的新星&#xff0c;已经引起了广泛的关注。特别是在年轻人群体中&#xff0c;投影仪成为了提升生活品质、享受家庭娱乐时光的重要工具。随着市场的繁荣&#xff0c;各种品牌和型号的投影仪如雨后春笋般涌现&#xff0c;其中&#…

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork&#xff1a;创建一个子进程 为什么要创建子进程&#xff1f; fork的原理&#xff1a; 进一步了解fo…

Mora: Enabling Generalist Video Generation via A Multi-Agent Framework

Mora: Enabling Generalist Video Generation via A Multi-Agent Framework PDF: https://arxiv.org/html/2403.13248v1 1 概述 为弥补Sora不开源的缺陷&#xff0c;本文提出多代理框架Mora&#xff0c;整合先进视觉AI代理&#xff0c;复制Sora的全能视频生成能力。Mora能利用…

2024年《期刊引证报告》解读,迎来哪些新调整?

​ 【SciencePub学术】 近日&#xff0c;科睿唯安官方发布了一则关于2024年《期刊引证报告》&#xff1a;为增强透明度和包容性&#xff0c;期刊影响因子学科排名迎来新调整的文章。文章中对今年新调整过的地方做出了详细的解释。 截图来源&#xff1a;科睿唯安公众号 动态一…

#Linux(连接档概念)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;硬链接&#xff08;inode&#xff0c;建立硬链接的文件inode号相同&#xff09; &#xff08;2&#xff09;创建硬链接:ln 文件名1 文件名…

css设置div的2个span一个在最左边,一个在最右边

界面&#xff1a; 代码&#xff1a; <html><style>.top span {display: block;position: absolute;margin: 0 20px; /* 添加边距以避免太靠近边缘 */ }.top span:nth-child(1) {left: 5px; /* 调整左侧位置 */ }.top span:nth-child(2) {right: 5px; /* 调整右侧位…

【前端性能】前端性能优化方法总结

关于前端性能指标和测量方法可以看这篇&#xff1a;【前端性能】前端性能指标和测量方法总结 文章目录 前端性能优化网络方向HTTP缓存本地储存HTTP升级DNS预解析使用CDN 渲染方向HTMLCSSJS图片Webpack优化 前端性能优化 可以从网络请求方向和页面渲染方向进行优化&#xff1a…

鸿蒙一次开发,多端部署(六)自适应布局

针对常见的开发场景&#xff0c;方舟开发框架提炼了七种自适应布局能力&#xff0c;这些布局可以独立使用&#xff0c;也可多种布局叠加使用。 下面我们依次介绍这几种自适应布局能力。 拉伸能力 拉伸能力是指容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分配给容…

鸿蒙一次开发,多端部署(十一)设置应用页面

本小节以“设置”应用页面为例&#xff0c;介绍如何使用自适应布局能力和响应式布局能力适配不同尺寸窗口。 页面设计 为充分利用屏幕尺寸优势&#xff0c;应用常常有在小屏设备上单栏显示&#xff0c;大屏设备上左右分两栏显示的设计&#xff0c;设置应用页面设计如下。 观察…

不要取和所用方法名字相同的类

package 练习; import java.util.*; public class StringBuilder {public static void main(String[] args){Scanner scan new Scanner(System.in);String r scan.nextLine();StringBuilder x new StringBuilder(r);System.out.println(x);}} 奉上错误代码&#xff08;上面&…

qt5-入门-标签页部件QTabWidget-1

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 效果实现Qt Designer操作代码addStretch()解释 效果 首页有三个按钮和最近文件列表。 拖动窗口&#xff0c;按钮和文件列表仍然处…

【C++】1600. 请假时间计算

问题&#xff1a;1600. 请假时间计算 类型&#xff1a;基本运算、整数运算 题目描述&#xff1a; 假设小明的妈妈向公司请了 n 天的假&#xff0c;那么请问小明的妈妈总共请了多少小时的假&#xff0c;多少分钟的假&#xff1f;&#xff08;提示&#xff1a; 1 天有 24 小时&…

关于UDS刷写的一些杂谈

最近在做CAPL编写UDS刷写上位机的工作&#xff0c;后续过来更新现在这里查个眼&#xff0c;以免后面忘记了。 下面放一些可能会用到的知识点&#xff1a; 1.一般的刷写流程如下所示&#xff1a; 红色标记代表为功能寻址。 预编程&#xff1a;10 01&#xff0c;10 83&#xf…

Linux——du, df命令查看磁盘空间使用情况

一、实现原理&#xff1a; df 命令的全称是Disk Free &#xff0c;显而易见它是统计磁盘中空闲的空间&#xff0c;也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used &#xff0c;统计磁盘有已经使用的空间。它是直接统计各文件各目…

HarmonyOS4.0—自定义渐变导航栏开发教程

前言 今天要分享的是一个自定义渐变导航栏&#xff0c;本项目基于鸿蒙4.0。 先看效果&#xff1a; 这种导航栏在开发中也比较常见&#xff0c;特点是导航栏背景色从透明到不透明的渐变&#xff0c;以及导航栏标题和按钮颜色的变化。 系统的导航栏无法满足要求&#xff0c;我们…

8868体育助力西甲赫罗纳 争冠黑马惨遭掀翻

西甲的赫罗纳足球俱乐部是8868体育助力的球队之一&#xff0c;西甲排名第12的赫塔费队迎来了西甲第29轮的较量&#xff0c;赫塔费队此役坐镇自己的主场PK赛前排名第2的争冠超级黑马赫罗纳队。 赛前赫塔费队已经连续4轮联赛不胜&#xff08;2平2负状态低迷&#xff09;&#xff…

力扣 字符串解码

维护一个放数字的栈&#xff0c;一个放字母的栈 遇到[把数字和字母入栈&#xff0c;遇到]把当前字母循环加上数字栈头遍的字母栈头 class Solution { public:string decodeString(string s) {string ans"";stack<int>sz;stack<string>zm;里面是string …

一文讲清!进销存管理系统如何实现锁库及库存冻结?计算月加权平均成本?

进销存管理系统中的锁库及库存冻结如何实现&#xff1f;进销存管理系统如何计算月加权平均成本&#xff1f;进销存管理系统又该如何统计和预测采购需求&#xff1f;这些进销存管理难题困扰着许多企业管理者。本文将结合数年从业经验&#xff0c;深入探讨这些进销存管理难题&…

面试算法-83-不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…