zoukankan      html  css  js  c++  java
  • SQLServer中数据库文件的存放方式,文件和文件组

    我们公司近一年来做了一个CRM系统。

    遇到一个问题就是:在插入交流记录的时候速度特别慢。(交流记录数据量大)

    后来我们经理采用文件组的方法,将客户交流记录这张表提出来就快很多了

    这里有一篇关于文件组的文章:

    简介

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

    理解文件和文件组

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

        先来看一张图:

           1

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

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

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

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

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

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

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

    文件的分类

    •     首要文件:这个文件是必须有的,而且只能有一个。这个文件额外存放了其他文件的位置等信息.扩展名为.mdf
    •     次要文件:可以建任意多个,用于不同目的存放.扩展名为.ndf
    •     日志文件:存放日志,扩展名为.ldf

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

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

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

        2

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

    创建和使用文件组

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

        首先创建文件组:

        3

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

        4

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

    5

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

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

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

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

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

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

    总结

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

    (转载)

    引用地址

    http://www.jb51.net/article/29270.htm

  • 相关阅读:
    kicad 基本操作
    RedHat centos中的上传下推脚本
    使用Node.js爬虫存储MySQL数据库
    解决vue和vue-template-compiler版本不同报错的问题
    Vue组件通信(父子组件通信)-学习笔记
    git 简单操作
    错误解决:redis.exceptions.ResponseError: unknown command 'SENTINEL'
    nginx做泛域名解析的域名的正则判断
    postman对字符串进行base64编码方法和变量的使用
    pymysql报错OperationalError: (2013, 'Lost connection to MySQL server during query')
  • 原文地址:https://www.cnblogs.com/honghong75042/p/4157140.html
Copyright © 2011-2022 走看看