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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 原文:解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)解剖SQLSERVER 第八篇  OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-multiple-data-files/   OrcaMDF 其中一个最新特性是支持多数据文件的数据库。
原文: 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)

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

http://improve.dk/orcamdf-now-supports-databases-with-multiple-data-files/

 

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%
    )
GO

USE SampleDatabase
GO

CREATE TABLE MyTable
(
    A int identity,
    B uniqueidentifier default(newid()),
    C char(6000)
)
GO

INSERT INTO MyTable DEFAULT VALUES
GO 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里面也是完全一样的

不理解的童鞋可以看一下这篇文章《SQLSERVER中的ALLOCATION SCAN和RANGE SCAN》或者

Microsoft SQL Server 2008技术内幕:T-SQL查询 笔记》里面有相关介绍

 

文件组支持

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%
    )
GO

ALTER DATABASE
    [SampleDatabase]
ADD FILEGROUP
    [SecondFilegroup]
GO

ALTER 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]
GO

USE SampleDatabase
GO

CREATE TABLE MyTable
(
    A float default(rand()),
    B datetime default(getdate()),
    C uniqueidentifier default(newid()),
    D char(5000)
) ON [SecondFilegroup]
GO

INSERT INTO MyTable DEFAULT VALUES
GO 100

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

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

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

将会一直到100

 

第八篇完

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
20天前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
63 2
|
19天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
20天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
2天前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
18 4
|
3天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云瑶池在2024云栖大会上重磅发布由Data+AI驱动的多模数据管理平台DMS:OneMeta+OneOps,通过统一、开放、多模的元数据服务实现跨环境、跨引擎、跨实例的统一治理,可支持高达40+种数据源,实现自建、他云数据源的无缝对接,助力业务决策效率提升10倍。
|
4天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
22 3
|
3天前
|
测试技术 API 数据库
云数据库之添加数据
云数据库之添加数据
12 1
|
4天前
|
存储 关系型数据库 MySQL
MySQL数据库数据块大小
MySQL数据库数据块大小
18 1
|
16天前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
5天前
|
存储 监控 关系型数据库
MySQL数据库数据块大小详解
MySQL数据库数据块大小详解
19 0