您的位置:首页 > 数据库 > SQL

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

2017-10-18 09:36 806 查看

一、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(),--数据库ID
object_id('RecordDatas201606'),--表和视图对象ID
null,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%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐