第6章、核心存储和索引结构(Sqlserver存储、理解索引、创建修改删除索引、维护索引、索引重新生成)

来源:互联网 发布:一般sql培训多少钱 编辑:程序博客网 时间:2024/06/03 20:13

一、SQL Server 存储

            SQLServer中的数据被存储在某种层次结构中的数据。

1、数据库

2、文件

主物理数据库文件*.mdf,次文件 *.ndf,日志文件*.ldf

3、区段

为表和给定文件中的索引分配空间的基本存储单元。
它由8个连续的64KB数据页组成。一旦一个区段已满,下一条记录将占用一个整体的新区段大小。


4、页

页是特定区段中的分配单元。每一个区段有8个页。每个页有多个行。


页类型:
(1)、数据页
(2)、索引页:保存非聚集索引的非叶级页和叶级页以及聚集索引的非叶级页
(3)、BLOB页:存储二进制大对象。如:varbinary(max)、varchar(max)或nvarchar(max)列中数据。

 (4)、全局分配映射表(GAM)、共享全局分配映射表(SGAM)和页可用空间(PFS)页
页类型涉及确定哪些区段和页在使用,哪些没在使用。
 (5)、大容量更改映射表(BCM)
跟踪哪些区段通过大容量操作进行了修改的页。
 (6)、差异更改映射表
只跟踪被大容量操作更改的区段,它跟踪从最后一次完整备份数据库以来发生了更改的所有区段。(如:差异备份)
 (7)、页拆分
页满时,会对其做拆分。这意味着不仅要分配一个新页,还要把现有页上大约一半的数据移动到新页上。


5、行

      行级锁,行的大小限制为8060个字符外,行中的最大列数限制为1024列。


6、全文目录

      全文索引的逻辑分组。


7、文件流

      文件流是用来解决非常大的BLOB存储性能问题的一种特殊的存储方法。
      文件流没有被存在一组BLOB页中,而是被存储在NTFS目录中,这一目录是由你存储数据的数据库显示创建的。


二、理解索引

       通常以字母顺序排列的某种指定资料(如:作者、主题或关键字)的列表(如书目信息或对著作正文的引用)。

排序选项:二进制、字典顺序


1、B 树

      平衡树(或B树)的概念不是Sql Server创建的。在数据库领域之内或之外大量的索引系统中,都广泛使用B树。
结构图如下:



页拆分
     所有读取方面的工作似乎都进行得很顺利,只是插入操作有点麻烦。
回忆一下B树中的B代表的是平衡。你可能还记得我提到过B树是平衡的,因为每次遇到一个树枝,两边都有一半的数据。
有时候,B树指的是自我平衡,因为向树添加新数据的方式一般会避免向一边倾斜。
当向树中加入数据时,节点最终会被填满,进而需要拆分。

提示:
在拆分页时,数据被自动移动以保持平衡。前面的一半数据留在旧页中,而剩余的数据被加入新页。
这样就有了一个差不多对半的拆分,因而树依然保持平衡。


2、如何在Sql Server中访问数据

(1)、使用表扫描
       从表的物理起点开始,浏览表中的每一行,当发现符合查询条件的行时,把这些行包含在结果集中。
(2)、使用索引


3、索引类型和索引导航

    索引有3种类型:聚集索引堆(没有聚集索引的表)上非聚集索引聚集索引上的非聚集索引


(1)、聚集索引:每个表只能有一个聚集索引。并非一定要有聚集索引。

 在树中导航:

Sql Server 中的索引存储以B树结构存储。叶级就是数据

搜索158~400的数字?
步骤:
     浏览作为根节点的页,可以知道接下来要检查的页是什么(正如图中所画出来的,我们要查看第二级的第二页)。
然后,继续处理。随着我们沿着树一步步向下,将得到越来越小的数据子集。最终,到达索引级别的叶级。


(2)、堆上非聚集索引

如下图:

叶级不是数据,存的是特定的行标识(RID) ,RID由行的区段、页和行偏移量组成。比聚集索引要多一步。


(3)、聚集表上的非聚集索引
各索引特点:
a. 聚集索引:到达了叶级便找到了真正的数据。
b. 堆上非聚集索引:到达叶级还没有得到真正数据,只是找到引领你直达数据的标识符(只剩最后一步要走)。
c. 聚集表上的非聚集索引:叶级得到的是聚集键。这就是说,在这里找到了足够的信息来使用聚集索引。

如下图:


三、创建、修改、删除索引

推荐阅读:

数据库性能优化:数据库表优化之SQL索引 

http://blog.csdn.net/litao2/article/details/45741053

第6章、核心存储和索引结构

http://blog.csdn.net/litao2/article/details/78269368


四、维护索引

1、页拆分

2、碎片

(1)、利用sys.dm_db_index_physical_stats查看索引碎片等数据

select * from sys.dm_db_index_physical_stats(db_id(),--数据库IDobject_id('RecordDatas201606'),--表和视图对象IDnull,null,null) 
查询结果:


(2)、索引重建

方法一:界面操作




方法二、命令执行

在做维护项目的时,我们经常会遇到索引维护的问题,通过语句,我们就可以判断某个表的索引是否需要重建。

执行一下语句:先分析表的索引

分析表的索引建立情况:DBCC showcontig('Table')

DBCC SHOWCONTIG 正在扫描 'Table'' 表...
表: 'Table'' (53575229);索引 ID: 1,数据库 ID: 14
已执行 TABLE 级别的扫描。
- 扫描页数................................: 228
- 扫描区数..............................: 52
- 区切换次数..............................: 225
- 每个区的平均页数........................: 4.4
- 扫描密度 [最佳计数:实际计数].......: 12.83% [29:226]
- 逻辑扫描碎片 ..................: 97.37%
- 区扫描碎片 ..................: 98.08%
- 每页的平均可用字节数........................: 2686.3
- 平均页密度(满).....................: 66.81%

当你发现,扫描密度行,最佳计数和实际计数的比例已经严重失调,逻辑扫描碎片占了非常大的百分比,每页平均可用字节数非常大时,就说明

你的索引需要重新整理一下了。

执行重建索引命令:
DBCC DBREINDEX('Table'')
后分析的情况

DBCC SHOWCONTIG 正在扫描 'Table'' 表...
表: 'Table'' (53575229);索引 ID: 1,数据库 ID: 14
已执行 TABLE 级别的扫描。
- 扫描页数................................: 154
- 扫描区数..............................: 20
- 区切换次数..............................: 19
- 每个区的平均页数........................: 7.7
- 扫描密度 [最佳计数:实际计数].......: 100.00% [20:20]
- 逻辑扫描碎片 ..................: 0.00%
- 区扫描碎片 ..................: 55.00%
- 每页的平均可用字节数........................: 86.8
- 平均页密度(满).....................: 98.93%