博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
阅读量:5937 次
发布时间:2019-06-19

本文共 3190 字,大约阅读时间需要 10 分钟。

解剖SQLSERVER 第八篇  OrcaMDF 现在支持多数据文件的数据库(译)

 

OrcaMDF 其中一个最新特性是支持多数据文件的数据库。这在解析上面需要作出相关的小改变,实际上大部分都是bug 修复代码

由于之前只支持单个数据文件而引起的。然而这确实需要一些重大的重构而离开MdfFile 的主入口点,现在使用数据库封装类,封装一个数据文件变量

 

 

分配比例填充

OrcaMDF 支持标准的数据库表的比例填充架构,这个数据库表除了有mdf文件之外还有ndf文件,而这些文件都在主文件组里,例如,你可能会创建以下数据文件或者架构

CREATE DATABASE    [SampleDatabase]ON  PRIMARY     (        NAME = N'SampleDatabase_Data1',        FILENAME = N'C:SampleDatabase_Data1.mdf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    ),     (        NAME = N'SampleDatabase_Data2',        FILENAME = N'C:SampleDatabase_Data2.ndf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    ),     (        NAME = N'SampleDatabase_Data3',        FILENAME = N'C:SampleDatabase_Data3.ndf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    )LOG ON    (        NAME = N'SampleDatabase_log',        FILENAME = N'C:SampleDatabase_log.ldf',        SIZE = 3072KB,        FILEGROWTH = 10%    )GOUSE SampleDatabaseGOCREATE TABLE MyTable(    A int identity,    B uniqueidentifier default(newid()),    C char(6000))GOINSERT INTO MyTable DEFAULT VALUESGO 100

这会引起MyTable 按比例填充三个数据文件(C列的作用为了让SQLSERVER分配100个页面来装载数据,好让填满三个数据文件)

为了解析这种情况,我们需要做下面的工作

var files = new[]    {        @"C:SampleDatabase_Data1.mdf",        @"C:SampleDatabase_Data2.ndf",        @"C:SampleDatabase_Data3.ndf"    };using (var db = new Database(files)){    var scanner = new DataScanner(db);    var result = scanner.ScanTable("MyTable");    EntityPrinter.Print(result);}

运行之后的结果是

大家注意看:

A(4个字节)+B(16个字节)+C(6000个字节)=6020字节

刚好一条记录一页,下面说到,SQLSERVER分配完了一个区之后,一个区8个页面,当一个区分配完毕之后,SQLSERVER

会转到SampleDatabase_Data2.ndf数据文件继续分配页面,分配的值是9~16,一个区分配完毕之后又到

SampleDatabase_Data3.ndf数据文件继续分配页面,分配的值是17~24

 

自增值会一直到100,注意到A列有间隔,这是由于一个事实我们在每个数据文件的一个区里面以循环赛的方式来分配。

ID1~8在第一个数据文件,9~16在第二个数据文件最后17~24在第三个数据文件。由于这一点,页面25~32分配在第一个数据文件,一直这样下去

由于是堆表,我们使用文件分配顺序扫描,这导致我们获得结果1~8,25~32,49~56,73~80,97~100 全部都是从第一个文件开始,然后9~16,33~40

从第二个数据文件里读取然后到最后一个数据文件的剩余页面。想一下这是不是很怪,好吧,SQLSERVER里面也是完全一样的

不理解的童鞋可以看一下这篇文章《》或者

《》里面有相关介绍

 

文件组支持

OrcaMDF 也支持使用文件组,包括按比例分配填充在一个单独的 文件组里,举个例子,你可能创建下面的数据库和架构

CREATE DATABASE    [SampleDatabase]ON  PRIMARY     (        NAME = N'SampleDatabase_Data1',        FILENAME = N'C:SampleDatabase_Data1.mdf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    )LOG ON    (        NAME = N'SampleDatabase_log',        FILENAME = N'C:SampleDatabase_log.ldf',        SIZE = 3072KB,        FILEGROWTH = 10%    )GOALTER DATABASE    [SampleDatabase]ADD FILEGROUP    [SecondFilegroup]GOALTER DATABASE    [SampleDatabase]ADD FILE    (        NAME = N'SampleDatabase_Data2',        FILENAME = N'C:SampleDatabase_Data2.ndf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    ),    (        NAME = N'SampleDatabase_Data3',        FILENAME = N'C:SampleDatabase_Data3.ndf',        SIZE = 3072KB,        FILEGROWTH = 1024KB    )TO FILEGROUP    [SecondFilegroup]GOUSE SampleDatabaseGOCREATE TABLE MyTable(    A float default(rand()),    B datetime default(getdate()),    C uniqueidentifier default(newid()),    D char(5000)) ON [SecondFilegroup]GOINSERT INTO MyTable DEFAULT VALUESGO 100

这将会引起MyTable去按比例填充分配在第二和第三个数据文件之间(D列用来占位置,确保让SQLSERVER分配100个页面来装载数据,好让对文件组里的两个数据文件进行

分配填充)数据只会分别对第二和第三数据文件进行填充而主数据文件不受影响

跟先前的例子的解释一样,结果如下

将会一直到100

 

第八篇完

转载地址:http://rfvtx.baihongyu.com/

你可能感兴趣的文章
netstat常见参数
查看>>
wpf Loading动画 AkeemLoading
查看>>
Ubuntu 里面 apt-get 三个有关更新的命令的区别
查看>>
POJ 1019, Number Sequence
查看>>
activiti插件安装-离线安装
查看>>
[译]准备 2017 前端面试
查看>>
RecyclerView的刷新分页
查看>>
MySQL——循环(双重循环)
查看>>
Html5学习笔记---1
查看>>
无聊的时候就看看
查看>>
UItableview section和cell的局部刷新
查看>>
字符串连接的效率问题
查看>>
紫书 例题 11-12 UVa 1515 (最大流最小割)
查看>>
紫书 习题 11-17 UVa 1670 (图论构造)
查看>>
洛谷P1108 低价购买 (最长下降子序列方案数)(int,long long等 范围)
查看>>
大道至简-第五章-心得体会
查看>>
Python编程从入门到实践,个人笔记
查看>>
哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)F - 苦逼的单身狗
查看>>
oracle数据迁移
查看>>
ArchLinux and LXDE and LXDM
查看>>