解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-multiple-data-files/ OrcaMDF 其中一个最新特性是支持多数据文件的数据库。这在解析上面需要作出相关的小改变,实际上大部分都是bu
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
http://improve.dk/orcamdf-now-supports-databases-with-multiple-data-files/
OrcaMDF 其中一个最新特性是支持多数据文件的数据库。这在解析上面需要作出相关的小改变,实际上大部分都是bug 修复代码
由于之前只支持单个数据文件而引起的。然而这确实需要一些重大的重构而离开MdfFile 的主入口点,现在使用数据库封装类,封装一个数据文件变量
分配比例填充
OrcaMDF 支持标准的数据库表的比例填充架构,这个数据库表除了有mdf文件之外还有ndf文件,而这些文件都在主文件组里,例如,你可能会创建以下数据文件或者架构
<span>CREATE</span> <span>DATABASE</span> <span>[</span><span>SampleDatabase</span><span>]</span> <span>ON</span> <span>PRIMARY</span><span> ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data1</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data1.mdf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ), ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data2</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data2.ndf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ), ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data3</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data3.ndf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ) </span><span>LOG</span> <span>ON</span><span> ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_log</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_log.ldf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span> <span>10</span><span>%</span><span> ) </span><span>GO</span> <span>USE</span><span> SampleDatabase </span><span>GO</span> <span>CREATE</span> <span>TABLE</span><span> MyTable ( A </span><span>int</span> <span>identity</span><span>, B </span><span>uniqueidentifier</span> <span>default</span>(<span>newid</span><span>()), C </span><span>char</span>(<span>6000</span><span>) ) </span><span>GO</span> <span>INSERT</span> <span>INTO</span> MyTable <span>DEFAULT</span> <span>VALUES</span> <span>GO</span> <span>100</span>
这会引起MyTable 按比例填充三个数据文件(C列的作用为了让SQLSERVER分配100个页面来装载数据,好让填满三个数据文件)
为了解析这种情况,我们需要做下面的工作
<span>var</span> files = <span>new</span><span>[] { </span><span>@"</span><span>C:SampleDatabase_Data1.mdf</span><span>"</span><span>, </span><span>@"</span><span>C:SampleDatabase_Data2.ndf</span><span>"</span><span>, </span><span>@"</span><span>C:SampleDatabase_Data3.ndf</span><span>"</span><span> }; </span><span>using</span> (<span>var</span> db = <span>new</span><span> Database(files)) { </span><span>var</span> scanner = <span>new</span><span> DataScanner(db); </span><span>var</span> result = scanner.ScanTable(<span>"</span><span>MyTable</span><span>"</span><span>); EntityPrinter.Print(result); }</span>
运行之后的结果是
大家注意看:
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 也支持使用文件组,包括按比例分配填充在一个单独的 文件组里,举个例子,你可能创建下面的数据库和架构
<span>CREATE</span> <span>DATABASE</span> <span>[</span><span>SampleDatabase</span><span>]</span> <span>ON</span> <span>PRIMARY</span><span> ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data1</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data1.mdf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ) </span><span>LOG</span> <span>ON</span><span> ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_log</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_log.ldf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span> <span>10</span><span>%</span><span> ) </span><span>GO</span> <span>ALTER</span> <span>DATABASE</span> <span>[</span><span>SampleDatabase</span><span>]</span> <span>ADD</span><span> FILEGROUP </span><span>[</span><span>SecondFilegroup</span><span>]</span> <span>GO</span> <span>ALTER</span> <span>DATABASE</span> <span>[</span><span>SampleDatabase</span><span>]</span> <span>ADD</span> <span>FILE</span><span> ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data2</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data2.ndf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ), ( NAME </span><span>=</span> N<span>'</span><span>SampleDatabase_Data3</span><span>'</span><span>, FILENAME </span><span>=</span> N<span>'</span><span>C:SampleDatabase_Data3.ndf</span><span>'</span><span>, SIZE </span><span>=</span><span> 3072KB, FILEGROWTH </span><span>=</span><span> 1024KB ) </span><span>TO</span><span> FILEGROUP </span><span>[</span><span>SecondFilegroup</span><span>]</span> <span>GO</span> <span>USE</span><span> SampleDatabase </span><span>GO</span> <span>CREATE</span> <span>TABLE</span><span> MyTable ( A </span><span>float</span> <span>default</span>(<span>rand</span><span>()), B </span><span>datetime</span> <span>default</span>(<span>getdate</span><span>()), C </span><span>uniqueidentifier</span> <span>default</span>(<span>newid</span><span>()), D </span><span>char</span>(<span>5000</span><span>) ) </span><span>ON</span> <span>[</span><span>SecondFilegroup</span><span>]</span> <span>GO</span> <span>INSERT</span> <span>INTO</span> MyTable <span>DEFAULT</span> <span>VALUES</span> <span>GO</span> <span>100</span>
这将会引起MyTable去按比例填充分配在第二和第三个数据文件之间(D列用来占位置,确保让SQLSERVER分配100个页面来装载数据,好让对文件组里的两个数据文件进行
分配填充)数据只会分别对第二和第三数据文件进行填充而主数据文件不受影响
跟先前的例子的解释一样,结果如下
将会一直到100
第八篇完

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

匯入步驟如下:將 MDF 檔案複製到 SQL Server 的資料目錄(通常為 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)。在 SQL Server Management Studio(SSMS)中,開啟資料庫並選擇「附加」。點選“新增”按鈕,選擇 MDF 檔案。確認資料庫名稱,點選確定按鈕即可。

對於 SQL Server 資料庫中已存在同名對象,需要採取下列步驟:確認物件類型(表格、檢視、預存程序)。如果物件為空,可使用 IF NOT EXISTS 跳過建立。如果物件有數據,使用不同名稱或修改結構。使用 DROP 刪除現有物件(謹慎操作,建議備份)。檢查架構更改,確保沒有引用刪除或重新命名的物件。

若要查看 SQL Server 連接埠號碼:開啟 SSMS,連線到伺服器。在物件資源管理器中找到伺服器名稱,右鍵單擊它,然後選擇“屬性”。在「連線」標籤中,查看「TCP 連接埠」欄位。

若誤刪 SQL Server 資料庫,可採取下列步驟還原:停止資料庫活動;備份日誌檔案;檢查資料庫日誌;復原選項:從備份還原;從交易日誌還原;使用 DBCC CHECKDB;使用第三方工具。請定期備份資料庫並啟用交易日誌以防止資料遺失。

SQL Server 資料庫檔案通常儲存在下列預設位置:Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data可透過修改資料庫檔案路徑設定來自訂資料庫檔案位置。

當 SQL Server 服務無法啟動時,可採取下列步驟解決:檢查錯誤日誌以確定根本原因。確保服務帳戶具有啟動服務的權限。檢查依賴項服務是否正在執行。禁用防毒軟體。修復 SQL Server 安裝。如果修復不起作用,重新安裝 SQL Server。

如果 SQL Server 安裝失敗,可透過下列步驟清理:解除安裝 SQL Server刪除註冊表項刪除檔案和資料夾重新啟動計算機

SQL Server 刪除不乾淨導致無法重新安裝的問題可以透過以下步驟解決:手動刪除檔案和登錄項目;使用SQL Server 安裝卸載工具;使用第三方卸載工具;檢查Windows 事件檢視器;重新啟動電腦;重新安裝SQL Server。
