標籤:style blog http color io os 使用 ar strong
解剖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% )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裡面也是完全一樣的
不理解的童鞋可以看一下這篇文章《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% )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
第八篇完
解剖SQLSERVER 第八篇 OrcaMDF 現在支援多資料檔案的資料庫(譯)