SQLServer中数据库文件的存放方式,文件和文件组

来源:asp之家 时间:2012-01-05 18:56:33 

简介

在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文件组的概念对于更好的配置数据库来说是最基本的知识。

理解文件和文件组

在SQL SERVER中,通过文件组这个逻辑对象对存放数据的文件进行管理.

先来看一张图:

我们看到的逻辑数据库由一个或者多个文件组构成

而文件组管理着磁盘上的文件.而文件中存放着SQL SERVER的实际数据.

为什么通过文件组来管理文件

对于用户角度来说,需对创建的对象指定存储的文件组只有三种数据对象:表,索引和大对象(LOB)

使用文件组可以隔离用户和文件,使得用户针对文件组来建立表和索引,而不是实际磁盘中的文件。当文件移动或修改时,由于用户建立的表和索引是建立在文件组上的,并不依赖具体文件,这大大加强了可管理性.

还有一点是,使用文件组来管理文件可以使得同一文件组内的不同文件分布在不同的硬盘中,极大的提高了IO性能.

SQL SERVER会根据每个文件设置的初始大小和增长量会自动分配新加入的空间,假设在同一文件组中的文件A设置的大小为文件B的两倍,新增一个数据占用三页(Page),则按比例将2页分配到文件A中,1页分配到文件B中.

文件的分类

  • 首要文件:这个文件是必须有的,而且只能有一个。这个文件额外存放了其他文件的位置等信息.扩展名为.mdf

  • 次要文件:可以建任意多个,用于不同目的存放.扩展名为.ndf

  • 日志文件:存放日志,扩展名为.ldf

在SQL SERVER 2008之后,还新增了文件流数据文件和全文索引文件.

上述几种文件名扩展名可以随意修改,但是我推荐使用默认的扩展名。

我们可以通过如下语句查看数据库中的文件情况:

还有一点要注意的是,如果一个表是存在物理上的多个文件中时,则表的数据页的组织为N(N为具体的几个文件)个B树.而不是一个对象为一个B树.

创建和使用文件组

创建文件或是文件组可以通过在SSMS中或者使用T-SQL语句进行。对于一个数据库来说,既可以在创建时增加文件和文件组,也可以向现有的数据库添加文件和文件组.这几种方式大同小异.下面来看一下通过SSMS向现有数据库添加文件和文件组.

首先创建文件组:

文件组创建好后就可以向现有文件组中添加文件了:


下面我们就可以通过语句将创建的表或者索引加入到新的文件组中了:

使用多个文件的优点与缺点

通常情况下,小型的数据库并不需要创建多个文件来分布数据。但是随着数据的增长,使用单个文件的弊端就开始显现。

首先:使用多个文件分布数据到多个硬盘中可以极大的提高IO性能.

其次:多个文件对于数据略多的数据库来说,备份和恢复都会轻松很多.我碰见过遇到一个150G的数据库,手头却没有这么大的存储设备…

但是,在数据库的世界中,每一项好处往往伴随着一个坏处:

显而易见,使用多文件需要占用更多的磁盘空间。这是因为每个文件中都有自己的一套B树组织方式,和自己的增长空间。当然了,还有一套自己的碎片-.-但是在大多数情况下,多占点磁盘空间带来的弊端要远远小于多文件带来的好处.

总结

本文对SQL SERVER中文件和文件组的概念进行了简单阐述,并在文中讲述了文件和文件组的配置方式。按照业务组织好不同的文件组来分布不同的文件,使得性能的提升,对于你半夜少接几个电话的帮助是灰常大滴:-)

标签:数据库,sql,server
0
投稿

猜你喜欢

  • python中Switch/Case实现的示例代码

    2021-09-18 22:03:39
  • PyQt5每天必学之像素图控件QPixmap

    2022-04-05 04:42:54
  • 从MySQL得到最大的优化性能

    2024-01-20 20:22:08
  • JS input文本框禁用右键和复制粘贴功能的代码

    2024-04-29 13:18:49
  • Go语言中的闭包详解

    2023-06-30 05:27:14
  • 高性能表现的网站(译)

    2008-08-31 20:26:00
  • python监控进程状态,记录重启时间及进程号的实例

    2022-04-22 07:47:20
  • Python装饰器decorator用法实例

    2023-02-06 23:26:43
  • python os模块在系统管理中的应用

    2022-12-17 04:37:23
  • python 读txt文件,按‘,’分割每行数据操作

    2022-11-11 08:04:17
  • Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    2021-07-16 07:40:40
  • 超详细mysql left join,right join,inner join用法分析

    2024-01-22 00:21:05
  • MySQL source命令的使用简介

    2024-01-15 14:35:18
  • Python subprocess库的使用详解

    2021-10-25 04:59:32
  • python爬虫入门教程--利用requests构建知乎API(三)

    2022-12-17 14:42:45
  • Python 京东云无线宝消息推送功能

    2021-08-19 09:45:57
  • go语言使用pipe读取子进程标准输出的方法

    2024-05-22 10:18:55
  • mysql通过文档读取并执行命令之快速为mysql添加多用户和数据库技巧

    2024-01-24 01:45:02
  • python web框架中实现原生分页

    2021-05-15 12:25:42
  • JS复制特定内容到粘贴板

    2011-04-02 11:09:00
  • asp之家 网络编程 m.aspxhome.com