SQL Server中数据的存储

参考网站: https://www.cnblogs.com/fanlinjun/p/5003399.html

 

 我们知道,目前的关系型数据库都是将文件存储在物理磁盘上面,既然是存储在磁盘上面,那么就会涉及到数据存储问题。本文我们主要探讨数据库中数据的存储。

 与数据库有关的文件有3种,即主数据库文件,次数据库文件和数据库日志文件。

主数据库文件和次数据库文件里面存储的是我们的数据和对象,例如表,视图,存储过程等等,是我们程序所要用到的。

数据库日志文件包含恢复数据库所需的完整的事务信息。

日志文件平时并没有什么特殊的用途,只是记录对数据库的操作,但是当数据库发生误操作或者错误甚至是灾难性的后果时,日志文件就能派上用场。

三种数据库文件如下:

 

 

文件说明
主要

主要数据文件包含数据库的启动信息,并指向数据库中的其他文件。

用户数据和对象可存储在此文件中,也可以存储在次要数据文件中。

每个数据库有一个主要数据文件。主要数据文件的建议文件扩展名是 .mdf。

次要

次要数据文件是可选的,由用户定义并存储用户数据。

通过将每个文件放在不同的磁盘驱动器上,次要文件可用于将数据分散到多个磁盘上。

另外,如果数据库超过了单个 Windows 文件的最大大小,可以使用次要数据文件,这样数据库就能继续增长。

次要数据文件的建议文件扩展名是  .ndf。
事务日志

事务日志文件保存用于恢复数据库的日志信息。

每个数据库必须至少有一个日志文件。

事务日志的建议文件扩展名是 .ldf。

 

1 文件组(filegroup)

 

     文件组是一个逻辑概念,一个数据库可以包含一个或多个文件组,一个文件组可以包含一个或多个物理数据库文件,这就是我们在创建数据库的时候默认的情形。

     数据库文件组如下图所示:

 

 

          

那有人会问,为什么要有文件组的概念呢,文件组的作用是什么?通常情况下,有两种情形可以使用文件组:

 

      1.在大型的应用程序中,数据库中存储的数据量也会很大,可能达到几十几百GB,甚至达到数TB,那在这种情况下,用单个数据库文件存储数据,就会出现如索引慢等问题,性能出现瓶颈。

 这时使用文件组就能比较好的解决这个问题,因为文件组中的某个表,其中的数据会分布在这个文件组所有物理文件中,因此,如果将文件组包含的文件建在不同的磁盘下,那么对一个表的查询将会分散到多个磁盘上,这样就提高了查询效率。

      2 . 在某些场景中,需要对业务进行划分,每一块业务相对独立,这个时候可以使用文件组将数据库中的各个业务的数据分开,这时,只需要将各自业务下的表和对象创建在该业务对应的文件组里即可。

      文件组中的文件可能分布在各个文件夹下,但是这些文件是一个逻辑整体,文件组中的任何文件都缺一不可,因此如果将文件组中的文件做迁移的时候要注意,不要将某个文件遗漏,否则数据库将无法运行。另外说一点就是文件组里面可以包含主数据库文件,次数据库文件,但是不能包含日志文件。

 

2 区段(extent)

 

      区段是用来为表和给定文件中的索引分配空间的基本存储单元。它由8个连续的大小为64KB的数据页组成,即大小为512KB。

      关于区段的要点包括:

      1)  一旦一个区段已满,那么下一条记录将占用一个完整的新区段大小,而不是记录本身的大小。我们可以理解为SQL Server每次分配的空间是一个区段的大小。

      2)  通过预先分配空间,SQL Server省下了为每一条记录分配新空间的时间。

仅仅因为要添加的行比现在分配的区段所能容纳的行多了一行,就要另外占用整个区段,这似乎是一种浪费。但是,这种方式浪费的空间总量通常并不会那么多,只占了数据库空间很小的比例,但是在高碎片化的环境中,这种浪费可能就比较多了。

      占用整个区段空间的好处是SQL Server省去了一些分配空间的时间上的开销。SQL Server不必每写入一行就考虑分配问题,而是在需要新的区段时才处理额外空间的分配。

3 页(page)和页拆分

      与区段是数据库中的分配单元类似,页是区段的分配单元。每一个区段包含8个页,每个页的大小为8KB。

页是到达真正的数据行的最后一个级别。尽管每个区段中页的数量是固定的,但是页中的行数是不固定的,这个取决于行的大小,是可变的。可以把页想成是表和索引行数据的某种容器。

数据行是不允许跨页的。页的结构如下图所示:

 

     

上图展示了数据是如何存放在页中的。对于插入的每一行,为了表明特定行的数据开始于页中的何处,每一页的末尾都用一小块空间记录的每一行相对于页头位置的偏移量。

            SQL Server中的页有很多种类型,如索引页,数据页等,这里只是一提,不做具体讨论。

           当页满时,会对其做拆分。在拆分页时,会创建一个新页,并将已满的页上大约一半的数据移动到新页上存储。但是这也有例外,那就是使用聚集索引的时候。当在表上创建了聚集索引,而且下一个插入的行物理上位于表的最后一行时,那么将创建一个新页并把新的行添加到新的页上,不会把已满的行上一半的数据移动到新页上面。

 

4 行(row)

      行是数据存储的单位,在SQL Server中,行的大小限制在8KB(8060个字符,此时,页上只有1条记录),行中最大的列数限制在1024列。在数据页上,列最大的限制是8KB(此时的记录是1行1列,并且页上面只有1条记录),这应该就是SQL Server中varchar类型数据最大只能是8000的缘故吧。

 

转载于:https://www.cnblogs.com/suflowers1700218/p/9525308.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储数据,用户通过指定存储过程的名称并给出参数来执行。 存储过程可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储数据,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、 存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值